通过私有的 Azure Kubernetes 服务,可实现 Pod 之间的安全通信,且使用全限定域名 (FQDN) 进行实现
首先
大家好,我是Kazuya。
在这篇文章中,我想着眼于解决使用AKS(Azure Kubernetes Service)时在构建VNet并进行安全运营时可能遇到的以下问题的解决方案。
问题点

所以就实践。
我现在就来画个概览图,虽然不算剧透。
只要看这张图,能够搭建成功的人应该就足够了,如果觉得有参考价值的话,请读到这里点个赞?

好的!做好了。
這樣就可以了~。
簡單來說,只需要這麼少。
作业大纲的概要
假设存在于AKS-a上的Pod-a,我们希望从AKS-b上的Pod-b进行连接。
[任务]
-
- 创建一个名为「paks-net」的Vnet和两个子网(一个名为「snaks1」,另一个名为「snaks2」)。
-
- 在每个子网中创建两个Private AKS(分别命名为AKS-a和AKS-b)并部署。
-
- 如果在另一个Vnet上部署,需要进行配对操作(暂不考虑此情况)。
-
- 在AKS-a上部署内部负载均衡器(以下简称LB)。
-
- 记录上述部署的LB的外部IP。
-
- 创建一个私有DNS(命名为「my.com」)。
-
- 将私有DNS链接到「paks-net」。
-
- 在私有DNS中添加一个以「nginx.svc」为名称,值为上述记录的「External-IP」的A记录。
- 至此,完成。连接到AKS-b中的Pod-b,并使用上述创建的私有DNS定义,可以以「nginx.svc.my.com」的形式访问。
好的!完成了!這樣可以了吧~。如果到這一點有對你有所幫助的話,那就在這裡停下吧!
嗯,如果不具体解释一下,我就不明白……为了那些说“帮我具体解释一下”的人,以下是逐步操作~ 好体贴?(开个玩笑,这只是为了我自己忘记的时候准备的……
逐步进行
在这个例子中,进行之前要做好准备。
由於 AKS 是私有的,所以在同一 Vnet 中創建一個額外的子網,並在該子網中準備一個用於 Bastion 的虛擬機器(操作系統為Ubuntu),然後通過該虛擬機器來操作各個 AKS。在該虛擬機器上手動安裝 Azure-CLI 和 AKS-CLI。
首先,创建VNet和子网。

2. 创建两个私有的 AKS。
我們不詳細談論這裡的細節,但需要使用CNI插件將它們分別部署到上述第1步創建的子網中。這裡提供一個執行命令的例子,供您參考。
az aks create \
--resource-group paks \
--name aksa \
--load-balancer-sku standard \
--enable-private-cluster \
--network-plugin azure \
--vnet-subnet-id /subscriptions/<your_subscripition>/resourcegroups/paks/providers/Microsoft.Network/virtualNetworks/paks-net/subnets/snaks1 \
--docker-bridge-address 172.17.0.1/16 \
--dns-service-ip 10.2.0.10 \
--service-cidr 10.2.0.0/24
az aks create \
--resource-group paks \
--name aksa \
--load-balancer-sku standard \
--enable-private-cluster \
--network-plugin azure \
--vnet-subnet-id /subscriptions/<your_subscripition>/resourcegroups/paks/providers/Microsoft.Network/virtualNetworks/paks-net/subnets/snaks2 \
--docker-bridge-address 172.17.0.1/16 \
--dns-service-ip 10.2.0.10 \
--service-cidr 10.2.0.0/24
3. 在AKS的托管标识中授予更改Vnet权限。
出于一些情况内部可能会发出更改VNet设置的命令,因此请使用以下命令,将资源组的Contributor权限授予AKS的Identity。
首先,确认分配给 AKS 的 Internal Loadbalancer 的 ID。
PID=$(az aks show -g paks -n aksb --query "identity.principalId")
az role assignment create --assignee $PID --role Contributor --scope /subscriptions/<your_subcriptionid>/resourceGroups/paks
这样就可以了。
4. 接下来,暂时部署在 AKS 内运行的 Pod。
在AKS-a上创建(将其连接到AKS-a)
- 使用以下命令创建NGINX Pod(无需YAML)。
kubectl run nginx --image=nginx -l app=nginx
顺便为这个NGINX POD创建一个Internal-LoadBalancer。
apiVersion: v1
kind: Service
metadata:
name: internal-app3
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx
通过「service.beta.kubernetes.io/azure-load-balancer-internal: “true”」,可以将External-IP作为内部负载均衡器,并分配私有IP。
进行部署。
kubectl apply -f lb.yaml


10.0.0.92が割当たったことを確認。このIPは後で使うのでメモメモ。
app=nginx が、PodのLabelに付与されていて、Service の Selectorでも、app=nginx が指定されていることが必須。
5. AKS-a 在内部进行通讯确认
准备调试用的 Pod,并尝试在同一集群中访问以确认。
apiVersion: v1
kind: Pod
metadata:
name: debug-pod
spec:
containers:
- name: debug-container
image: centos
command: ["/bin/sh"]
args: ["-c", "while true; do sleep 30; done;"]
因为想要使用Curl,所以选择CentOS。
一旦部署并运行成功后,请按顺序执行以下命令来确认能够访问NGINX。
kubectl apply -f debug.yaml
kubectl exec -it pod/debug-pod /bin/sh
sh-4.4# curl 10.0.0.92
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
这里可以。
6. 我们开始创建私有DNS。
接下来,我们将创建私有 DNS。
操作步骤很简单,在 Azure 门户中搜索“私有 DNS 区域”并显示刀片。
点击屏幕上显示的“创建”进行新建。

点击创建,等待部署完成后移至资源页面。
当您转到资源时,首先在“概述”页面上输入A记录。

这样就可以了。
另外,将这个私有 DNS 区域链接到虚拟网络中。

点击”确定”按钮即可。
这样一来,当在此Vnet内进行广播时,可以从该DNS区域中获取记录。(请稍候,因为完成需要一些时间)
以这种形式,FQDN 是如何构建的,比如在这个例子中,就是”nginx.svc.my2.com”,它经由内部负载均衡器路由到10.0.0.92。
7. 连接到AKS-b,来试试看吧。
连接到AKS-b,部署用于调试的pod。可以直接将在步骤5中创建的debug.yaml文件部署到AKS-b即可。
kubectl apply -f debug.yaml
kubectl exec -it pod/debug-pod /bin/sh
与在 AKS-a 上执行的操作相同,首先在 Pod 内使用 Curl 连接到 Internal-LB 的 IP 地址。
sh-4.4# curl 10.0.0.92
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
嗯嗯,没问题。接下来,使用FQDN来连接。
sh-4.4# curl nginx.svc.my2.com
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
非常棒!?
现在,我们可以在私有的 AKS 环境中,使用自定义的 FQDN,不经过互联网访问。
如果错误地执行 kubectl expose pod/nginx –type=LoadBalancer –port 80 这样的命令,简单地说,会将公共IP直接分配给EXTERNAL-IP,所以请注意。
這樣一來,當企業在建立環境來滿足這樣的需求時,如果我們使用AVD環境作為用戶日常工作的場所,就會希望達到完全封閉的空間。但是,由於分工的理念,無法將不同用途的事物放入同一個AKS中,所以我們也希望能夠利用這樣的機制。
如果你认为这很有用,给我一个赞会给我带来动力?
那我们下次再见吧!
以下提供中文的同义词表述,只需一种选择:
– 参照
– 参阅
– 参照着
– 参考之下
– 参考资料
– 参考价值
– 参照例证
– 参考经验
– 参考指南
– 参考标准
豁免責任
本文是作者獨立進行調查和驗證的內容,不依據所屬公司或任何公司的官方觀點。
此外,關於使用本文作為參考進行的所有工作產生的損失、問題和挑戰,請事先諒解,我們不會承擔任何責任。