本教程演示如何使用 Google Kubernetes Engine (GKE) 在静态外部 IP 地址上将 Web 应用公开给互联网,并将域名配置为指向该应用。
本教程假设您拥有已注册的域名(例如 example.com
)。如果没有,可以通过 Google Domains 或自己选择的其他域名注册商注册域名。
目标
本教程演示了以下几个步骤:
费用
本教程使用 Google Cloud 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理。
准备工作
请按照以下步骤启用 Kubernetes Engine API:- 访问 Google Cloud Console 中的 Kubernetes Engine 页面。
- 创建或选择项目。
- 稍作等待,让 API 和相关服务完成启用过程。 此过程可能耗时几分钟。
-
确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
安装本教程中使用的以下命令行工具:
-
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/hello-app/manifests
为 gcloud
命令行工具设置默认值
如需节省在 gcloud
命令行工具中输入项目 ID 和 Compute Engine 地区选项的时间,您可以设置以下默认值:gcloud config set project project-id gcloud config set compute/zone compute-zone
创建集群
创建一个名为 domain-test
的容器集群来部署您的 Web 应用:
gcloud container clusters create domain-test
部署 Web 应用
以下清单描述了一个运行示例 Web 应用容器映像的 Deployment:
运行以下命令以创建该 Deployment:
kubectl apply -f helloweb-deployment.yaml
公开应用
您可以使用以下任一方法在 GKE 上公开您的应用:
使用 Service:这将创建一个 TCP 网络负载平衡器以使用地区 IP 地址。
使用 Ingress:这将创建一个 HTTP(S) 负载平衡器以支持使用全局 IP 地址。
如需详细了解每种方法的利弊,请参阅使用 Ingress 设置 HTTP(S) 负载平衡。
使用 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
注意:此步骤需要使用配置连接器。按照安装说明在您的集群上安装配置连接器。
如需部署此清单,请将它以 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 地址:
然后,创建 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 公开应用(这将创建 HTTP(S) 负载平衡器),则必须预留一个全局静态 IP 地址。地区 IP 地址不适用于 Ingress。
如需详细了解如何使用 Ingress 将应用公开给互联网,请参阅使用 Ingress 设置 HTTP(S) 负载平衡教程。
如需创建名为 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
注意:此步骤需要使用配置连接器。按照安装说明在您的集群上安装配置连接器。
如需部署此清单,请将它以 compute-address-global.yaml 的形式下载到您的机器上,然后运行以下命令:kubectl apply -f compute-address-global.yaml
以下清单描述了使用两个资源在静态 IP 上公开 Web 应用的 Ingress:
- 类型为
type:NodePort
的Service
- 使用服务名称和静态 IP 注释配置的
Ingress
kubernetes.io/ingress.global-static-ip-name
注释用于指定要与 HTTP(S) 负载平衡器关联的全局 IP 地址资源的名称。
将资源应用到集群:
kubectl apply -f helloweb-ingress-static-ip.yaml输出:
ingress "helloweb" created service "helloweb-backend" created
如需查看与负载平衡器关联的预留 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 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除负载平衡资源:
kubectl delete ingress,service -l app=hello
释放预留静态 IP 地址。删除负载平衡器后,预留但未使用的 IP 地址不再免费,而会按照未使用的 IP 地址价格计费。请运行以下命令以释放静态 IP 资源:
如果使用了 Service:
gcloud compute addresses delete helloweb-ip --region us-central1
如果使用了 Ingress:
gcloud compute addresses delete helloweb-ip --global
删除示例应用:
kubectl delete -f helloweb-deployment.yaml
观察以下命令的输出,等到负载平衡器被删除为止。输出不应显示名称中包含“helloweb”的转发规则:
gcloud compute forwarding-rules list
删除容器集群:
gcloud container clusters delete domain-test
后续步骤
通过 Google Domains 注册您自己的域名。
浏览其他 Kubernetes Engine 教程。
探索有关 Google Cloud 的参考架构、图表、教程和最佳做法。查看我们的 Cloud Architecture Center。