下边来谈下AKS专用群集,主要介绍专用群集的概念,优势,以及访问方式等

概述

专用群集简介

专用群集(private cluster)顾名思义,就是指这个群集是私有的,不公开的,这并不是说这个群集的资源是私有的,因为不管是public cluster还是专用群集,群集的计算资源都是专属的,不会和其他客户共享,之所以称为专用集群,主要是指集群的控制平面或 API 服务器具有内部 IP 地址,而正常public cluster的API server会是一个可以解析的公网地址,也就意味着这个集群从网络上是所有人都可以访问的,只要能提供正确的身份验证信息

AKS专用群集解析_IP


限制

所以,从安全角度来说,专用群集会比正常的群集更加安全,可以避免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

AKS专用群集解析_PRIVATE_02

解析

部署完成之后,会发现专用群集在部署时会自动创建一个private DNS zone,这是默认行为,如果想指定某一个已有的private DNS zone,也可以通过CLI中的参数实现

AKS专用群集解析_PRIVATE_03

除了private DNS Zone之外,还会有一个private endpoint同时被创建出来,这个endpoint连到的就是我们的api server

AKS专用群集解析_IP_04

还可以看到当尝试解析api server的FQDN时,会得到一个内网的IP,这和解析正常群集时得到的公网IP是不同的

AKS专用群集解析_K8S_05

如果考虑这会泄露我们的内部网络地址的话,还可以将DNS解析禁用掉,这样可以避免内网地址暴露在公网上,禁用的方法很简单,而且不管是新建群集,还是现有群集,都可以禁用

az aks update -n private -g event --disable-public-fqdn

AKS专用群集解析_AKS_06

禁用之后,DNS解析就拿不到地址了

AKS专用群集解析_IP_07

远程访问

最后来说下远程访问的问题,因为我们的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"

AKS专用群集解析_DNS_08

如果要进行部署的话也没问题

az aks command invoke --resource-group event --name private --command "kubectl apply -f app.yml" --file .

这样在保证安全的同时,还可以进行正常的部署了

AKS专用群集解析_PRIVATE_09