下边来谈下AKS专用群集,主要介绍专用群集的概念,优势,以及访问方式等
概述
专用群集简介
专用群集(private cluster)顾名思义,就是指这个群集是私有的,不公开的,这并不是说这个群集的资源是私有的,因为不管是public cluster还是专用群集,群集的计算资源都是专属的,不会和其他客户共享,之所以称为专用集群,主要是指集群的控制平面或 API 服务器具有内部 IP 地址,而正常public cluster的API server会是一个可以解析的公网地址,也就意味着这个集群从网络上是所有人都可以访问的,只要能提供正确的身份验证信息
限制
所以,从安全角度来说,专用群集会比正常的群集更加安全,可以避免API Server暴露在公网上,也不需要再设置authorized IP ranges,但同时,也需要考虑好专用群集的一些限制,不过总体来说还是弊大于利的
- 如果需要允许 Azure 容器注册表使用专用 AKS 群集,请在群集虚拟网络中为容器注册表设置专用链接,或在容器注册表虚拟网络与专用群集的虚拟网络之间设置对等互连。
- 不支持将现有 AKS 群集转换为专用群集。
部署专用群集
因为不支持从public cluster转换成专用群集,所以在部署业务之前,一定要提前考虑好这些点,这对于包括AKS以及DevOps的规划都是有影响的,接下来来看下如何部署专用群集
CLI部署专用群集
这里还是按照之前的风格,统一使用CLI来部署,专用群集的部署和普通群集其实非常类似,只需要在部署时指定一个特定参数--enable-private-cluster 即可
$subnet_id=az network vnet subnet show -g xx --vnet-name xx-vnet --name default --query id -o tsv
az aks create -g event `
-n private `
--node-osdisk-size 128 `
--admin-username azureuser `
--kubernetes-version 1.27.7 `
--location westus `
--network-plugin azure `
--node-count 1 `
--node-vm-size Standard_D2S_v3 `
--nodepool-name nodepool `
--service-cidr 10.10.0.0/24 `
--dns-service-ip 10.10.0.10 `
--vnet-subnet-id $subnet_id `
--load-balancer-sku Standard `
--enable-private-cluster `
--max-pods 30
解析
部署完成之后,会发现专用群集在部署时会自动创建一个private DNS zone,这是默认行为,如果想指定某一个已有的private DNS zone,也可以通过CLI中的参数实现
除了private DNS Zone之外,还会有一个private endpoint同时被创建出来,这个endpoint连到的就是我们的api server
还可以看到当尝试解析api server的FQDN时,会得到一个内网的IP,这和解析正常群集时得到的公网IP是不同的
如果考虑这会泄露我们的内部网络地址的话,还可以将DNS解析禁用掉,这样可以避免内网地址暴露在公网上,禁用的方法很简单,而且不管是新建群集,还是现有群集,都可以禁用
az aks update -n private -g event --disable-public-fqdn
禁用之后,DNS解析就拿不到地址了
远程访问
最后来说下远程访问的问题,因为我们的api server现在相当于是在内部网络了,因此正常情况下,我们需要在一个能够访问内网网络的环境下去运行kubectl的命令,才能进行部署,但是实际上微软还提供了另外一种方式,能够在公网上通过CLI来运行kubectl命令,这样对于开发和运维人员来说都会更方便一些
前提条件
前提条件也比较简单,满足版本和权限的要求即可
- Azure CLI 2.24.0 或更高版本。 运行 az --version 即可查找版本。
- 对群集上的 Microsoft.ContainerService/managedClusters/runcommand/action 和 Microsoft.ContainerService/managedclusters/commandResults/read 角色的访问权限。
远程访问
可以看到执行command invoke之后,我们可以正常访问到private cluster了
az aks command invoke --resource-group event --name private --command "kubectl get pods -n kube-system"
如果要进行部署的话也没问题
az aks command invoke --resource-group event --name private --command "kubectl apply -f app.yml" --file .
这样在保证安全的同时,还可以进行正常的部署了