小技巧:外部域名挂接 Azure 中的 K8S 负载均衡
使用 ACS Engine 在 Azure 上安装好了 Kubernetes 之后,就可以使用 Loadbalancer 类型的服务了。测试条件下,一般会使用不同域名通过同一个 Ingress Controller 访问不同服务的方式。
例如我们创建一个 Nginx Ingress Controller,服务启动之后会看到大概这样的信息:
$ kubectl describe svc ingress-nginx
Name: ingress-nginx
Namespace: ingress-nginx
...
Type: LoadBalancer
IP: 10.0.22.78
LoadBalancer Ingress: 104.216.145.198
...
接下来可以使用 az 命令查询我们 Azure 中已经生效的外部 IP 所对应的记录内容:
az network public-ip list \
--query "[?ipAddress=='104.216.145.198']"
会得到一条 JSON 记录:
{
"dnsSettings": {
"domainNameLabel": "k8s-5b",
"fqdn": "k8s-5b.cloudapp.azure.com",
"reverseFqdn": null
},
...
"name": "...",
"idleTimeoutInMinutes": 4,
"ipAddress": "104.216.145.198",
"ipConfiguration": {
...
接下来,我们可以给这个 Ip 设置一个 AZURE 的内部域名,同样使用 az
客户端:
az network public-ip update
--name=k8s-master-ip-k8s-5b55d212-28708154 \
--set dnsSettings.domainN
ameLabel='awesome-name-fcsaqz87d' \
--resource-group=k8s
命令执行后,会返回一长串的描述信息,跟上述的 List 结果类似,节选我们的变更部分:
"dnsSettings": {
"domainNameLabel": "awesome-name-fcsaqz87d",
"fqdn": "awesome-name-fcsaqz87d.southeastasia.cloudapp.azure.com",
"reverseFqdn": null
},
这里可以看到,这个外部 IP 有了一个域名,接下来,我们可以在我们的域名提供商控制台上,为域名设置 CNAME 记录,指到这个 fqdn
上,然后可以用 nslookup 上进行验证,例如:
nslookup prom.abc.xyz
canonical name = awesome-name-fcsaqz87d.southeastasia.cloudapp.azure.com.
Name: awesome-name-fcsaqz87d.southeastasia.cloudapp.azure.com
就可以用外部域名来访问我们 Kubernetes 上的 Ingress 资源了。
更进一步的,可以将泛域名设置到这一 IP 上,同时使用 Let’s Encrypt 的泛域名证书来完成对服务的 HTTPS 加固过程。