使用静态 IP 地址配置域名

本教程演示如何通过静态外部 IP 地址将网页应用公开给互联网,并将域名的 DNS 记录配置成指向您的应用。

本教程假设您拥有已注册的域名(例如 example.com)。如果您没有域名,则可以通过 Google Domains 或自己选择的其他域名注册商注册一个域名。

目标

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

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

准备工作

请按照以下步骤启用 Kubernetes Engine API:
  1. 访问 Google Cloud Platform Console 中的 Kubernetes Engine 页面
  2. 创建或选择项目。
  3. 在 API 和相关服务启用前稍作等待。此过程可能耗时几分钟。
  4. 确保您的 Google Cloud Platform 项目已启用结算功能。

    了解如何启用结算功能

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

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

gcloud 命令行工具设置默认值

为了节省您在 gcloud 命令行工具中输入项目 IDCompute Engine 地区 选项的时间,您可以设置默认值:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

创建 GKE 集群

创建一个名为 domain-test 的容器集群以部署您的网页应用:

gcloud container clusters create domain-test

第 1 步:部署您的网页应用

要部署示例网页应用,请将以下清单另存为 helloweb-deployment.yaml

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: gcr.io/google-samples/hello-app:1.0
        ports:
        - containerPort: 8080

然后,运行以下命令以创建 Deployment:

kubectl apply -f helloweb-deployment.yaml

第 2 步:公开您的应用

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

如需详细了解每种方法的优缺点,请参阅 HTTP 负载平衡教程

第 2(a) 步:使用 Service

要确保您的应用具有静态公共 IP 地址,则必须预留一个静态 IP 地址

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

要在 us-central1 区域中创建名为 helloweb-ip 的静态 IP 地址,请运行以下命令:

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

要查找您创建的静态 IP 地址,请运行以下命令:

gcloud compute addresses describe helloweb-ip --region us-central1
输出:
address: 203.0.113.32
...

使用以下清单创建一个名为 helloweb- service.yaml 的清单文件来描述 Service。将 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.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

第 2(b) 步:使用 Ingress

如果选择使用 Ingress 公开应用(这将创建 HTTP(S) 负载平衡器),则必须预留一个全球静态 IP 地址。区域 IP 地址不适用于 Ingress。

如需详细了解如何使用 Ingress 将应用公开给互联网,请参阅使用 Ingress 设置 HTTP 负载平衡教程。

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

gcloud compute addresses create helloweb-ip --global

要查找您创建的静态 IP 地址,请运行以下命令:

gcloud compute addresses describe helloweb-ip --global
输出:
address: 203.0.113.32
...

要使用 Ingress 在静态 IP 上公开网页应用,您需要部署两个资源:

  1. type:NodePort 类型的 Service
  2. 使用服务名称和静态 IP 注释配置的 Ingress

使用以下清单创建一个名为 helloweb-ingress.yaml 的清单文件,用于描述这两个资源:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: helloweb
  annotations:
    kubernetes.io/ingress.global-static-ip-name: helloweb-ip
  labels:
    app: hello
spec:
  backend:
    serviceName: helloweb-backend
    servicePort: 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 注释指定要与 HTTP(S) 负载平衡器关联的全球 IP 地址资源的名称。

helloweb-ingress.yaml 清单文件应用于集群:

kubectl apply -f helloweb-ingress.yaml
输出:
ingress "helloweb" created
service "helloweb-backend" created

要查看与负载平衡器关联的预留 IP 地址,请运行以下命令:

kubectl get ingress
输出:
NAME       HOSTS     ADDRESS          PORTS     AGE
helloweb   *         203.0.113.32     80        4m

第 3 步:访问预留的静态 IP 地址

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

curl http://203.0.113.32
输出:
Hello, world!
Hostname: helloweb-3766687455-8lvqv

第 4 步:配置您的域名记录

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

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

您网域的 DNS 记录由域名服务器管理。您的域名服务器可能是您注册网域的位置(换言之,您的“注册商”),也可能是 DNS 服务,例如 Google Cloud DNS 或其他第三方提供商。

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

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

第 5 步:访问您的域名

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

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

host example.com
输出:
example.com has address 203.0.113.32

此时,您可以将网络浏览器指向您的域名并访问您的网站!

清理

为避免因本教程中使用的资源而导致我们向您的 Google Cloud Platform 帐号收取费用,请执行以下操作:

  1. 删除负载平衡资源:

    kubectl delete ingress,service -l app=hello

  2. 释放预留的静态 IP。删除负载平衡器后,预留但未使用的 IP 地址不再免费,而会按照未使用的 IP 地址价格计费。请运行以下命令以释放静态 IP 资源:

    • 如果您是按照第 2(a) 步操作,请运行以下命令:

      gcloud compute addresses delete helloweb-ip --region us-central1
    • 如果您是按照第 2(b) 步操作,请运行以下命令:

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

    kubectl delete -f helloweb-deployment.yaml

  4. 观察以下命令的输出,等到负载平衡器被删除为止(输出不应显示名称中包含“helloweb”的转发规则):

    gcloud compute forwarding-rules list

  5. 删除容器集群:

    gcloud container clusters delete domain-test

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Kubernetes Engine 教程