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

2019-07-23 11:28:05 浏览数 (1)

使用 ACS Engine 在 Azure 上安装好了 Kubernetes 之后,就可以使用 Loadbalancer 类型的服务了。测试条件下,一般会使用不同域名通过同一个 Ingress Controller 访问不同服务的方式。

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

代码语言:javascript复制
$ 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 所对应的记录内容:

代码语言:javascript复制
az network public-ip list 
--query "[?ipAddress=='104.216.145.198']"

会得到一条 JSON 记录:

代码语言:javascript复制
{
"dnsSettings": {
   "domainNameLabel": "k8s-5b",
   "fqdn": "k8s-5b.cloudapp.azure.com",
   "reverseFqdn": null
},
...
"name": "...",
"idleTimeoutInMinutes": 4,
"ipAddress": "104.216.145.198",
"ipConfiguration": {
...

接下来,我们可以给这个 Ip 设置一个 AZURE 的内部域名,同样使用 az 客户端:

代码语言:javascript复制
az network public-ip update
--name=k8s-master-ip-k8s-5b55d212-28708154 
--set dnsSettings.domainN
ameLabel='awesome-name-fcsaqz87d' 
--resource-group=k8s

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

代码语言:javascript复制
"dnsSettings": {
   "domainNameLabel": "awesome-name-fcsaqz87d",
   "fqdn": "awesome-name-fcsaqz87d.southeastasia.cloudapp.azure.com",
   "reverseFqdn": null
 },

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

代码语言:javascript复制
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 加固过程。

0 人点赞