# 小技巧：外部域名挂接 Azure 中的 K8S 负载均衡

使用 [ACS Engine](https://github.com/Azure/acs-engine) 在 Azure 上安装好了 Kubernetes 之后，就可以使用 Loadbalancer 类型的服务了。测试条件下，一般会使用不同域名通过同一个 Ingress Controller 访问不同服务的方式。

例如我们创建一个 Nginx Ingress Controller，服务启动之后会看到大概这样的信息：

~~~shell
$ 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](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) 命令查询我们 Azure 中已经生效的外部 IP 所对应的记录内容：

~~~shell
az network public-ip list \
--query "[?ipAddress=='104.216.145.198']"
~~~

会得到一条 JSON 记录：

~~~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` 客户端：

~~~shell
az network public-ip update
--name=k8s-master-ip-k8s-5b55d212-28708154 \
--set dnsSettings.domainN
ameLabel='awesome-name-fcsaqz87d' \
--resource-group=k8s
~~~

命令执行后，会返回一长串的描述信息，跟上述的 List 结果类似，节选我们的变更部分：

~~~json
"dnsSettings": {
    "domainNameLabel": "awesome-name-fcsaqz87d",
    "fqdn": "awesome-name-fcsaqz87d.southeastasia.cloudapp.azure.com",
    "reverseFqdn": null
  },
~~~

这里可以看到，这个外部 IP 有了一个域名，接下来，我们可以在我们的域名提供商控制台上，为域名设置 CNAME 记录，指到这个 `fqdn` 上，然后可以用 nslookup 上进行验证，例如：

~~~shell
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://letsencrypt.org/) 的泛域名证书来完成对服务的 HTTPS 加固过程。
