在禁用Azure容器注册表公共端点的情况下部署Azure Kubernetes服务

2025-04-01T16:54:57+08:00 | 5分钟阅读 | 更新于 2025-04-01T16:54:57+08:00

Macro Zhao

在禁用Azure容器注册表公共端点的情况下部署Azure Kubernetes服务

@TOC

推荐超级课程:

本文将指导您创建Azure Kubernetes服务托管集群和Azure容器注册表的过程。此外,我们将配置到ACR的私有链接,因为我们将会禁用公共端点。

开始之前

您需要以下内容来完成此练习:

  1. Azure订阅
  2. Azure CLI - 安装
  3. Docker桌面 - 安装
    • 仅当您将在本地构建Docker镜像时需要。

我们将在本练习中使用这些变量:

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

参考

有关讨论的一些主题的更多参考,请浏览以下内容。

什么是 Kubernetes?

Azure Kubernetes 服务简介

Azure 中的私有 Docker 容器注册表简介

kubectl 快速参考表

设置 Azure 容器注册表的私有链接

© 2011 - 2025 Macro Zhao的分享站

关于我

如遇到加载502错误,请尝试刷新😄

Hi,欢迎访问 Macro Zhao 的博客。Macro Zhao(或 Macro)是我在互联网上经常使用的名字。

我是一个热衷于技术探索和分享的IT工程师,在这里我会记录分享一些关于技术、工作和生活上的事情。

我的CSDN博客:
https://macro-zhao.blog.csdn.net/

欢迎你通过评论或者邮件与我交流。
Mail Me

推荐好玩(You'll Like)
  • AI 动·画

    • 这是一款有趣·免费的能让您画的画中的角色动起来的AI工具。
    • 支持几十种动作生成。
  • AI 识字

    • 遇到不认识的字,写在这里,会自动识别所写汉字。
    • 还能对其进行意义查询。
  • 中日假期日历

    • 方便查询2025日本红日子。
    • 对日打工族必备工具。
  • 在线架子鼓

    • 简易但功能齐全的架子鼓。
    • 代码敲累了,你就敲一敲它吧。
  • 微信公众号编辑器

    • 简易但功能丰富的免费!公众号编辑器。
    • 还在不断完善中,喜欢的可以持续关注.
我的项目(My Projects)
  • 爱学习网

  • 小乙日语App

    • 这是一个帮助日语学习者学习日语的App。
      (当然初衷也是为了自用😄)
    • 界面干净,简洁,漂亮!
    • 其中包含 N1 + N2 的全部单词和语法。
    • 不需注册,更不需要订阅!完全免费!
  • 小乙日文阅读器

    • 词汇不够?照样能读日语名著!
    • 越读积累越多,积跬步致千里!
    • 哪里不会点哪里!妈妈再也不担心我读不了原版读物了!
赞助我(Sponsor Me)

如果你喜欢我的作品或者发现它们对你有所帮助,可以考虑给我买一杯咖啡 ☕️。这将激励我在未来创作和分享更多的项目和技术。🦾

👉 请我喝一杯咖啡

If you like my works or find them helpful, please consider buying me a cup of coffee ☕️. It inspires me to create and share more projects in the future. 🦾

👉 Buy me a coffee