在禁用Azure容器注册表公共端点的情况下部署Azure Kubernetes服务
@TOC
推荐超级课程:
本文将指导您创建Azure Kubernetes服务托管集群和Azure容器注册表的过程。此外,我们将配置到ACR的私有链接,因为我们将会禁用公共端点。
开始之前
您需要以下内容来完成此练习:
我们将在本练习中使用这些变量:
ResourceGroup = AKSACRResourceGroup
Location = eastus
Virtual Network = AKSACRVNet
AKS Name = AKSCluster
ACR Name = ACRegistry
运行Azure CLI
运行login
命令。
az login
这将打开您的默认浏览器并加载Azure登录页面。
如果您有多个Azure订阅,您可能需要确保您想要工作的订阅是活动订阅。
要列出您的订阅,请使用az account list
命令:
az account list --output table
使用az account set
命令设置您的订阅:
az account set --subscription "Name or SubscriptionID"
创建资源组
这将是我们将在本练习中使用的默认资源组。
请确保重命名< >
内的任何内容,因为这些只是占位符。
az group create --name <AKSACRResourceGroup> --location <eastus>
部署ACR
创建Azure容器注册表。如果您已经创建了ACR,请确保它是高级版,因为这将允许防火墙设置。
az acr create --resource-group <AKSACRResourceGroup> --name <ACRegistry> --sku Premium
配置ACR
启用管理员用户
一旦我们部署了ACR,我们需要启用管理员用户。这是必需的,因为它允许您使用Docker CLI将镜像推送到您的注册表。
az acr update --resource-group <AKSACRResourceGroup> --name <ACRegistry> --admin-enabled
上传镜像
使用Docker CLI登录到您的Azure容器注册表。
docker login <acregistry>.azurecr.io
如果您正在重新构建应用程序,请确保使用适当的注册表和镜像名称标记您的镜像。
docker build -t <acregistry>.azurecr.io/<image-name>:<tag> <dockerfile location>
如果您已经有一个构建好的镜像,并且只想重新标记镜像,请使用以下命令。
docker tag <old-image> <acregistry>.azurecr.io/<image-name>:<tag>
一旦您有了镜像,将镜像推送到您的容器注册表。
docker push <acregistry>.azurecr.io/<image-name>:<tag>
禁用公共访问
一旦您将所有必需的镜像推送到注册表,我们现在可以禁用对容器注册表的公共访问。
az acr update --resource-group <AKSACRResourceGroup> --name <ACRegistry> --public-network-enabled false
部署AKS
由于我们将使用私有链接与我们的AKS集群,我们需要设置一个虚拟网络以便服务进行通信。以下命令将创建一个地址前缀为10.0.0.0/16
的虚拟网络,其中名为default
的子网具有10.0.0.0/22
的前缀。
az network vnet create --name <AKSACRVNet> --resource-group <AKSACRResourceGroup> --address-prefix 10.0.0.0/16 --subnet-name default --subnet-prefix 10.0.0.0/22
一旦虚拟网络和子网完成,我们需要查询我们将用于AKS部署命令中的资源ID。
az network vnet subnet show --name default --resourcegroup <AKSACRResourceGroup> --vnet-name <AKSACRVNet> --query id --output tsv
现在我们准备创建我们的Azure Kubernetes服务集群。我们将使用预览扩展,因为这允许我们更改默认节点资源组的名称。
az extension add --name aks-preview
创建 Azure Kubernetes 服务
现在我们将创建 Azure Kubernetes 服务。以下命令使用虚拟机大小为 Standard_B2s
。您可以在这里
找到更多符合您需求的大小。我们还使用了一个包含 4
个节点的集群,服务 CIDR 为 10.2.0.0/16
,DNS 服务 IP 为 10.2.0.10
。有关网络配置的更多信息,请阅读这里
。
az aks create --resource-group <AKSACRResourceGroup> --name <AKSCluster> --node-resource-group <AKSClusterResources> --node-vm-size Standard_B2s --node-count 4 --network-plugin azure --vnet-subnet-id <AKSACRVNet-Subnet-ID> --dns-name-prefix <AKSACRCluster-dns> --attach-acr <ACRegistry> --service-cidr 10.2.0.0/16 --dns-service-ip 10.2.0.10 --docker-bridge-address 172.17.0.1/16
设置私有链接
现在集群已经成功部署,我们将开始配置私有链接。这个步骤相对较多。如果您想使用 Azure 门户来简化操作,可以前往这里 查看相关步骤。
更新子网配置,以禁用私有端点的网络策略,如安全组。
az network vnet subnet update --name default --resource-group <AKSACRResourceGroup> --vnet-name <AKSACRVNet> --disable-private-endpoint-network-policies
为私有 Azure 容器注册表域名创建一个私有 DNS 区域。在后续步骤中,我们将向该区域添加记录。该区域必须命名为 privatelink.azurecr.io
。
az network private-dns zone create --resource-group <AKSACRResourceGroup> --name "privatelink.azurecr.io"
将私有区域与您的虚拟网络关联。
az network private-dns link vnet create --resource-group <AKSACRResourceGroup> --zone-name "privatelink.azurecr.io" --name <ACRDNSLink> --virtual-network <AKSACRVNet> --registration-enabled false
以下命令将输出 Azure 容器注册表的 ID,该 ID 将用于接下来的命令。
az acr show --name <ACRegistry> --query id --output tsv
现在我们将为容器注册表资源创建端点和服务连接。
az network private-endpoint create --name <ACRPrivateEndpoint> --resource-group <AKSACRResourceGroup> --vnet-name <AKSACRVNet> --subnet default --private-connection-resource-id <ACRegistry-ID> --group-id registry --connection-name <PEConnection>
在接下来的命令中,我们需要查询一些值以用于创建我们的 DNS 记录。
网络接口 ID
az network private-endpoint show --name <ACRPrivateEndpoint> --resource-group <AKSACRResourceGroup> --query networkInterfaces[0].id --output tsv
私有 IP
az resource show --ids <NetworkInterfaceID> --api-version 2019-04-01 --query properties.ipConfigurations[1].properties.privateIPAddress --output tsv
数据端点私有 IP
az resource show --ids <NetworkInterfaceID> --api-version 2019-04-01 --query properties.ipConfigurations[0].properties.privateIPAddress --output tsv
为注册表端点和数据端点创建 DNS A 记录集。
az network private-dns record-set a create --name <ACRegistry> --zone-name privatelink.azurecr.io --resource-group <AKSACRResourceGroup>
az network private-dns record-set a create --name <<ACRegistry>.<Location>.data> --zone-name privatelink.azurecr.io --resource-group <AKSACRResourceGroup>
为注册表端点和数据端点创建 DNS A 记录。
az network private-dns record-set a add-record --record-set-name <ACRegistry> --zone-name privatelink.azurecr.io --resource-group <AKSACRResourceGroup> --ipv4-address <Private_IP>
az network private-dns record-set a add-record --record-set-name <<ACRegistry>.<Location>.data> --zone-name privatelink.azurecr.io --resource-group <AKSACRResourceGroup> --ipv4-address <DataEndPoint_Private_IP>
现在您拥有了一个私有的 Azure 容器注册表,它可以通过与您的 Azure Kubernetes 服务相连的虚拟网络访问。
向 AKS 部署应用
为了向 AKS 集群部署和运行命令,我们需要获取相应的凭据。
az aks get-credentials --resource-group <AKSACRResourceGroup> --name <AKSCluster>
保存凭据后,您需要创建一个部署 YAML 文件,该文件将用于 Kubernetes 创建 POD 和服务。有关 Kubernetes 的更多信息,您可以访问这里 。以下是用于部署应用程序和创建用于外部访问的负载均衡器的示例 YAML 文件。
apiVersion: apps/v1
kind: Deployment
metadata:
name: <deployment-or-app-name>
spec:
replicas: 1
selector:
matchLabels:
app: <deployment-or-app-name>
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
minReadySeconds: 5
template:
metadata:
labels:
app: <deployment-or-app-name>
spec:
nodeSelector:
"beta.kubernetes.io/os": linux
containers:
- name: <deployment-or-app-name>
image: <ACRegistry>.azurecr.io/<image-name>:<tag>
ports:
- containerPort: <app-port>
resources:
requests:
cpu: 250m
limits:
cpu: 500m
---
apiVersion: v1
kind: Service
metadata:
name: <deployment-or-app-name>
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: <app-port>
selector:
app: <deployment-or-app-name>
一旦您的 YAML 文件准备好了,您现在可以将其应用到您的 AKS 集群。
kubectl apply -f <deployment.yaml>
应用后,您可以 watch
服务启动。这还将为您提供公共 IP,以便您可以访问此部署。
kubectl get service <deployment-or-app-name> --watch
参考
有关讨论的一些主题的更多参考,请浏览以下内容。