使用静态 IP 地址配置域名


本教程演示如何使用 Google Kubernetes Engine (GKE) 在静态外部 IP 地址上将 Web 应用公开给互联网,并将域名配置为指向该应用。

本教程假设您拥有已注册的域名(例如 example.com)。

目标

本教程演示了以下几个步骤:

  • 为您的应用预留静态外部 IP 地址
  • 配置 ServiceIngress 资源以使用静态 IP 地址
  • 将域名的 DNS 记录更新成指向您的应用

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

请按照以下步骤启用 Kubernetes Engine API:
  1. 访问 Google Cloud 控制台中的 Kubernetes Engine 页面
  2. 创建或选择项目。
  3. 稍作等待,让 API 和相关服务完成启用过程。 此过程可能耗时几分钟。
  4. Make sure that billing is enabled for your Google Cloud project.

安装本教程中使用的以下命令行工具:

  • gcloud 用于创建和删除 Kubernetes Engine 集群。gcloud 包含在 gcloud CLI 中。
  • kubectl 用于管理 Kubernetes(即 Kubernetes Engine 使用的集群编排系统)。您可以使用 gcloud 安装 kubectl
    gcloud components install kubectl

从 GitHub 克隆示例代码:

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/quickstarts/hello-app/manifests

gcloud 命令行工具设置默认值

如需节省在 gcloud 命令行工具中输入项目 IDCompute Engine 地区选项的时间,您可以设置以下默认值:
gcloud config set project project-id
gcloud config set compute/zone compute-zone

创建集群

创建集群:

gcloud container clusters create-auto domain-test

部署您的 Web 应用

以下清单描述了一个运行示例 Web 应用容器映像的 Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloweb
  labels:
    app: hello
spec:
  selector:
    matchLabels:
      app: hello
      tier: web
  template:
    metadata:
      labels:
        app: hello
        tier: web
    spec:
      containers:
      - name: hello-app
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 200m

创建 Deployment:

kubectl apply -f helloweb-deployment.yaml

公开您的应用

您可以使用以下任一方法在 GKE 上公开您的应用:

如需详细了解每种方法的优缺点,请参阅使用 Ingress 设置外部应用负载均衡器

使用 Service

如需确保您的应用具有静态外部 IP 地址,您必须预留静态 IP 地址

如果您选择使用 Service 公开应用,则必须创建区域级 IP 地址。全球 IP 地址仅适用于 Ingress 资源类型,如下一个部分中所述。

如需使用 Service,请在地区 us-central1 中创建名为 helloweb-ip 的静态 IP 地址:

gcloud

gcloud compute addresses create helloweb-ip --region us-central1

找到您创建的静态 IP 地址:

gcloud compute addresses describe helloweb-ip --region us-central1

输出类似于以下内容:

...
address: 203.0.113.32
...

Config Connector

注意:此步骤需要使用配置连接器。按照安装说明在您的集群上安装配置连接器。

apiVersion: compute.cnrm.cloud.google.com/v1beta1
kind: ComputeAddress
metadata:
  name: helloweb-ip
spec:
  location: us-central1

将此清单保存为 compute-address-regional.yaml

将清单应用到您的集群:

  kubectl apply -f compute-address-regional.yaml

找到您创建的静态 IP 地址:

  kubectl get computeaddress helloweb-ip -o jsonpath='{.spec.address}'

以下清单描述了类型为 LoadBalancer 的 Service,它会创建外部直通式网络负载均衡器以使用外部 IP 地址公开 Pod。

YOUR.IP.ADDRESS.HERE 替换为静态 IP 地址:

apiVersion: v1
kind: Service
metadata:
  name: helloweb
  labels:
    app: hello
spec:
  selector:
    app: hello
    tier: web
  ports:
  - port: 80
    targetPort: 8080
  type: LoadBalancer
  loadBalancerIP: "YOUR.IP.ADDRESS.HERE"

创建 Service:

kubectl apply -f helloweb-service-static-ip.yaml

查看与负载均衡器关联的预留 IP 地址:

kubectl get service

输出类似于以下内容:

NAME               CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
helloweb           10.31.254.176   203.0.113.32     80:30690/TCP     54s

使用 Ingress

如果您选择使用 Ingress 公开应用,则必须预留全球静态 IP 地址。使用注解 kubernetes.io/ingress.global-static-ip-name 指定全局 IP 地址。

如需将应用公开给区域内的客户端和服务,请在为 GKE 部署内部 Ingress 资源以及所需注解时使用区域级静态内部 IP 地址。

如需了解如何使用 Ingress 将应用公开给互联网,请参阅使用 Ingress 设置外部应用负载均衡器

如需创建名为 helloweb-ip 的全局静态 IP 地址,请运行以下命令:

gcloud

gcloud compute addresses create helloweb-ip --global

找到您创建的静态 IP 地址:

gcloud compute addresses describe helloweb-ip --global

输出类似于以下内容:

...
address: 203.0.113.32
...

Config Connector

注意:此步骤需要使用配置连接器。按照安装说明在您的集群上安装配置连接器。

apiVersion: compute.cnrm.cloud.google.com/v1beta1
kind: ComputeAddress
metadata:
  name: helloweb-ip
spec:
  location: global

将此清单保存为 compute-address-global.yaml

将清单应用到您的集群:

  kubectl apply -f compute-address-global.yaml

以下清单描述了使用两个资源在静态 IP 上公开 Web 应用的 Ingress:

  • 类型为 type:NodePortService
  • 使用服务名称和静态 IP 注释配置的 Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: helloweb
  annotations:
    kubernetes.io/ingress.global-static-ip-name: helloweb-ip
  labels:
    app: hello
spec:
  defaultBackend:
    service:
      name: helloweb-backend
      port:
        number: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: helloweb-backend
  labels:
    app: hello
spec:
  type: NodePort
  selector:
    app: hello
    tier: web
  ports:
  - port: 8080
    targetPort: 8080

kubernetes.io/ingress.global-static-ip-name 注解用于指定要与负载均衡器关联的全球 IP 地址资源的名称。

将清单应用到您的集群:

kubectl apply -f helloweb-ingress-static-ip.yaml

查看与负载均衡器关联的 IP 地址:

kubectl get ingress

输出类似于以下内容

NAME       HOSTS     ADDRESS          PORTS     AGE
helloweb   *         203.0.113.32     80        4m

查看预留的静态 IP 地址

如需验证是否正确配置了负载均衡器,您可以使用网络浏览器访问 IP 地址或使用 curl

curl http://203.0.113.32/

输出类似于以下内容:

Hello, world!
Hostname: helloweb-3766687455-8lvqv

配置域名记录

如需让查询您的域名(例如 example.com)或子域名(例如 blog.example.com)的浏览器指向您预留的静态 IP 地址,您必须更新域名的 DNS(域名服务器)记录。

您必须为您的域名或子域名创建 A(地址)类型的 DNS 记录,并使用预留的 IP 地址配置其值。

域名的 DNS 记录由域名服务器管理。域名服务器可能是您注册域名的“注册商”、DNS 服务(如 Cloud DNS)或其他第三方提供商。

  • 如果您的域名服务器是 Cloud DNS:请按照 Cloud DNS 快速入门指南操作,使用应用的预留 IP 地址为您的域名配置 DNS A 记录。

  • 如果域名服务器是其他提供商:请参阅 DNS 提供商文档,了解如何设置 DNS A 记录来配置您的域名。如果您选择改用 Cloud DNS,请参阅迁移到 Cloud DNS

访问您的域名

要验证域名的 DNS A 记录是否解析为您预留的 IP 地址,请访问您的域名。

如需对域名的 A 记录进行 DNS 查询,请运行 host 命令:

host example.com

输出类似于以下内容:

example.com has address 203.0.113.32

现在,您可以将网络浏览器指向您的域名并访问您的网站。

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

  1. 删除 Service 和 Ingress:

    kubectl delete ingress,service -l app=hello
    
  2. 释放预留的静态 IP。删除负载均衡器后,系统将按照未使用的 IP 地址价格对未使用但已预留的 IP 地址计费。

    • 如果使用了 Service:

      gcloud compute addresses delete helloweb-ip --region us-central1
      
    • 如果使用了 Ingress:

      gcloud compute addresses delete helloweb-ip --global
      
  3. 删除示例应用:

    kubectl delete -f helloweb-deployment.yaml
    
  4. 删除集群:

    gcloud container clusters delete domain-test
    

后续步骤