通过私有的 Azure Kubernetes 服务,可实现 Pod 之间的安全通信,且使用全限定域名 (FQDN) 进行实现

首先

大家好,我是Kazuya。
在这篇文章中,我想着眼于解决使用AKS(Azure Kubernetes Service)时在构建VNet并进行安全运营时可能遇到的以下问题的解决方案。

问题点

image.png

所以就实践。

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

image.png

好的!做好了。
這樣就可以了~。
簡單來說,只需要這麼少。

作业大纲的概要

假设存在于AKS-a上的Pod-a,我们希望从AKS-b上的Pod-b进行连接。

[任务]

    1. 创建一个名为「paks-net」的Vnet和两个子网(一个名为「snaks1」,另一个名为「snaks2」)。

 

    1. 在每个子网中创建两个Private AKS(分别命名为AKS-a和AKS-b)并部署。

 

    1. 如果在另一个Vnet上部署,需要进行配对操作(暂不考虑此情况)。

 

    1. 在AKS-a上部署内部负载均衡器(以下简称LB)。

 

    1. 记录上述部署的LB的外部IP。

 

    1. 创建一个私有DNS(命名为「my.com」)。

 

    1. 将私有DNS链接到「paks-net」。

 

    1. 在私有DNS中添加一个以「nginx.svc」为名称,值为上述记录的「External-IP」的A记录。

 

    至此,完成。连接到AKS-b中的Pod-b,并使用上述创建的私有DNS定义,可以以「nginx.svc.my.com」的形式访问。

好的!完成了!這樣可以了吧~。如果到這一點有對你有所幫助的話,那就在這裡停下吧!

嗯,如果不具体解释一下,我就不明白……为了那些说“帮我具体解释一下”的人,以下是逐步操作~ 好体贴?(开个玩笑,这只是为了我自己忘记的时候准备的……

逐步进行

在这个例子中,进行之前要做好准备。

リソース設定値リソースグループ名paks場所eastusAKS-aの名前aksaAKS-bの名前aksbVnetの名前paks-net(10.0.0.0/16)Subnet1の名前snaks1(10.0.0.0/24)Subnet2の名前snaks2(10.0.1.0/24)

由於 AKS 是私有的,所以在同一 Vnet 中創建一個額外的子網,並在該子網中準備一個用於 Bastion 的虛擬機器(操作系統為Ubuntu),然後通過該虛擬機器來操作各個 AKS。在該虛擬機器上手動安裝 Azure-CLI 和 AKS-CLI。

首先,创建VNet和子网。

image.png

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
image.png
image.png

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 区域”并显示刀片。
点击屏幕上显示的“创建”进行新建。

image.png

点击创建,等待部署完成后移至资源页面。

当您转到资源时,首先在“概述”页面上输入A记录。

image.png

这样就可以了。

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

image.png

点击”确定”按钮即可。
这样一来,当在此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中,所以我們也希望能夠利用這樣的機制。

如果你认为这很有用,给我一个赞会给我带来动力?

那我们下次再见吧!

以下提供中文的同义词表述,只需一种选择:

– 参照
– 参阅
– 参照着
– 参考之下
– 参考资料
– 参考价值
– 参照例证
– 参考经验
– 参考指南
– 参考标准

 

豁免責任

本文是作者獨立進行調查和驗證的內容,不依據所屬公司或任何公司的官方觀點。
此外,關於使用本文作為參考進行的所有工作產生的損失、問題和挑戰,請事先諒解,我們不會承擔任何責任。

bannerAds