在您自己的自定义域名上公开 Kubernetes 服务
你需要什么?
从外部访问 Kubernetes
将您的域指向集群
试试看!
你终于将应用部署到了 Kubernetes,并且买了一个很棒的域名——有没有想过如何将你这个像www.mydomain.com这样酷炫的域名指向运行在 Kubernetes 中的应用呢?那就继续往下读,我将尝试解释如何做到这一点!
你需要什么?
开始之前,请确保您已准备好以下物品:
- Kubernetes 集群及其访问权限(即您可以部署内容)
- 您的应用*正在 Kubernetes 集群中运行
- 已注册域名(我使用的是Name.com注册域名,但其他任何注册商也可以)
- 舵
注意:我使用“ app”一词来指代运行在集群中的代码,您希望通过域名访问它。您的代码运行在 Docker 镜像和 Kubernetes Pod 中,而该 Pod 又是部署的一部分,并通过 Kubernetes 服务对外暴露。但我将使用“app”来指代所有这些。
以下是将域名与您的服务连接的大致步骤:
- 创建 Ingress 资源
- 部署 Ingress 控制器
- 更新域记录,使其指向集群
从外部访问 Kubernetes
Kubernetes 中的Ingress资源用于管理对集群内运行的应用程序的外部访问。通过 Ingress,您可以定义规则,告诉 Kubernetes 如何将外部流量路由到您的应用程序。以下是一个 Ingress 资源的示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: www.mycoolapp.mydomain.com
http:
paths:
- path: /
backend:
serviceName: mycoolapp
servicePort: 80
然而,仅仅有了这个资源还不够——你还需要一个能够引导流量的控制器。我将使用 NGINX Ingress Controller,但你也可以使用其他控制器(更多文档请参见此处)。我们将使用Helm来部署 nginx-ingress chart,如下所示:
helm install stable/nginx-ingress
上述命令会负责安装 NGINX 控制器和默认后端。默认后端是一个“应用”,默认情况下,入口会指向该应用,或者在没有定义任何服务的情况下也会指向该应用。作为 NGINX 控制器的一部分,您还会获得一个类型为 LoadBalancer 的服务——您需要将域名指向该服务。
请注意,在部署控制器时,您可以调整和旋转大量的按钮和旋钮——这里有一个完整的列表。
NGINX入口控制器部署完毕后,让我们运行以下命令来确定集群的IP地址:
kubectl get services --all-namespaces
上述命令将列出所有命名空间中运行的 Kubernetes 服务。您需要查找的是类型为LoadBalancer的服务以及设置了外部 IP地址的服务(通常是同一个服务)。以下是该命令的示例输出:
*nginx-ingress-controller上图中服务旁边灰色显示的值就是你需要的。这是你要将域名指向的 IP 地址。
或者,如果您想更进一步,还可以运行以下命令,该命令将按服务类型(负载均衡器)筛选所有服务,并返回服务名称和 IP 地址:
kubectl get svc --all-namespaces -o jsonpath='{range .items[?(@.spec.type=="LoadBalancer")]}{.metadata.name}:{.status.loadBalancer.ingress[0].ip}{"\n"}{end}'
将您的域指向集群
根据您注册域名的位置,步骤可能会略有不同,但要点相同——您需要创建 `<domain>`A和 ` CNAME DNS<host>` 记录,将您的域名(主机)指向集群。
我的域名注册商是Name.com,但我很确定其他域名注册商也有一些关于如何操作的优秀文档。
我的操作步骤如下:在 Name.com 上,我进入我的域名,打开 DNS 记录选项卡。在那里,我添加了一条 A 记录,主机名为 `<hostname>` www.mycoolapp.mydomain.com,应答中我输入了我的集群 IP 地址。
同样,我创建了一条CNAME记录并指向mycoolapp.mydomain.com集群主机名(通常可以在云服务提供商的设置中找到)。您无需提供 `<hostname>` CNAME,一条A记录就足够了。请注意,如果您不提供 `<hostname>` CNAME,则mycoolapp.mydomain.com无法解析到您的应用程序!
试试看!
启动你最喜欢的终端或浏览器,然后访问mycoolapp.mydomain.com. 瞧!你应该能够收到响应(就我而言,我部署的应用程序是一个简单的 NGINX 容器,因此显示的是 NGINX 的默认页面)。


