文章详情

微软云免实名 微软云部署Docker容器

微软云Azure2026-04-17 20:52:44AWS免实名账号出售

你有没有试过,在凌晨两点对着Azure Portal疯狂点击,就为了把一个跑得好好的Docker容器塞进云里,结果它理都不理你,连个Pod都没起来?

别慌——不是你代码写错了,也不是Dockerfile太傲娇,大概率是微软云这位‘西装革履的邻居’,正用它那套优雅又略带疏离的流程,默默考验你的耐心和文档阅读能力。

今天这篇,不讲概念,不列菜单,不甩官方链接,只掏干货。就像约了个靠谱运维老哥坐你对面,边敲命令边吐槽,顺手还给你画了张防坑地图。

第一步:别急着上云,先让镜像‘体面出门’

很多同学一上来就直奔Azure Container Registry(ACR),以为push完就万事大吉。结果发现:镜像传上去了,拉下来却报错ImagePullBackOff——不是权限问题,是镜像压根没‘自我介绍’清楚。

记住三件事:

  1. 打标签必须带ACR域名前缀:比如你的ACR叫mycoolapp.azurecr.io,那build完得这么打:
    docker tag myapp:latest mycoolapp.azurecr.io/myapp:prod-v1.2
  2. 别用latest当主力——K8s调度器会缓存,改了镜像不更新?八成是它偷偷记住了旧的latest。老老实实用语义化版本号,比如v1.2.0或20240615-hotfix。
  3. 镜像里别硬编码localhost或127.0.0.1——本地跑得飞起,上云直接失联。数据库地址、Redis连接串,全得通过环境变量注入,哪怕你只是临时测试。

第二步:ACR不是网盘,是带门禁的VIP酒窖

登录ACR,别傻乎乎用个人账号密码——Azure早就不鼓励了。正确姿势是:az acr login --name mycoolapp。这条命令背后,Azure CLI会自动帮你换OAuth令牌,安全又省心。

顺手做件小事:给ACR开个专用服务主体(Service Principal),专门授权给AKS拉镜像。别图省事直接给AKS集群赋ACR的Owner权限——这等于把酒窖钥匙、保险柜密码和消防栓开关全塞给保洁阿姨。

验证是否真通?本地终端试试:
docker pull mycoolapp.azurecr.io/myapp:v1.2.0
能下下来,才说明网络、认证、权限三关全过。

第三步:AKS集群——别建‘裸机’,要建‘精装交付’

Azure Portal点点点就能建集群?能。但默认配置就像毛坯房:没监控、没自动伸缩、没节点池隔离、甚至没启用容器运行时(Containerd)——而Docker Engine在K8s 1.24+已被移除!

建议用CLI一键生成‘精装版’:

az aks create \
  --resource-group my-rg \
  --name myaks \
  --node-count 2 \
  --enable-managed-identity \
  --generate-ssh-keys \
  --enable-cluster-autoscaler \
  --min-count 1 --max-count 5 \
  --network-plugin azure \
  --container-runtime containerd \
  --enable-addons monitoring,ingress-appgw

重点划三处:
✅ --enable-managed-identity:告别密钥轮换噩梦;
✅ --container-runtime containerd:Docker镜像照跑,但底层不用Dockerd;
✅ --enable-addons monitoring:后面查日志、看CPU水位,全靠它续命。

第四步:YAML不是天书,是带注释的说明书

别抄网上五年前的deployment示例。下面这段,是你明天就能贴进deploy.yaml里跑通的精简版:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: web
        image: mycoolapp.azurecr.io/myapp:v1.2.0
        ports:
        - containerPort: 8080
        env:
        - name: DB_HOST
          valueFrom:
            secretKeyRef:
              name: db-secrets
              key: host
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
      imagePullSecrets:
      - name: acr-auth

注意两个灵魂细节:

  • imagePullSecrets:这是你之前用az aks update --attach-acr自动生成的凭证,名字叫acr-auth,别手贱改成regcred——那是K8s原生教程里的,Azure不用。
  • livenessProbe和readinessProbe:没它们,K8s不会主动杀掉卡死的Pod,也不会等你应用真正‘准备好’再导流。/health 和 /ready 这俩端点,哪怕只是返回{"status":"ok"},也比没有强十倍。

第五步:访问?别只盯着LoadBalancer——Ingress才是亲儿子

很多人搞个Service type=LoadBalancer,拿到公网IP就收工。结果:HTTP跳HTTPS要自己写重定向逻辑;多个服务共用一个IP?得配一堆端口映射;证书续期?手动下载再挂Secret?

Azure官方推荐组合:Application Gateway + AKS Ingress Controller。装法超简单:

helm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/
helm repo update
helm install ingress-azure application-gateway-kubernetes-ingress/ingress-azure \
  --create-namespace \
  --namespace default \
  --set appgw.subscriptionId=<your-sub-id> \
  --set appgw.resourceGroup=<your-rg> \
  --set appgw.name=<your-appgw-name> \
  --set appgw.usePrivateIP=false \
  --set armAuth.type="aadPodIdentity"

然后写个ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  tls:
  - hosts:
      - app.mycompany.com
    secretName: my-tls-secret
  rules:
  - host: app.mycompany.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-service
            port:
              number: 80

微软云免实名 搞定后,访问https://app.mycompany.com,证书自动由App Gateway托管(支持Let’s Encrypt自动签发),流量自动负载均衡,还能加WAF规则、限流、重写URL——这才是云原生该有的样子。

最后送你三条‘血泪口诀’

  1. 日志别只看kubectl logs:装好Monitoring Add-on后,直接去Azure Monitor → Logs,写KQL查:
    ContainerLog | where ContainerName == "web" | project TimeGenerated, LogEntry | order by TimeGenerated desc,比翻屏快十倍。
  2. Pod起不来?先kubectl describe pod xxx:Events区里那行红色报错,往往就是你缺的那行imagePullSecrets或secret没创建。
  3. 别信‘本地能跑,云上必行’:云环境有资源限制、网络策略、DNS解析差异。哪怕只加一行sleep 5在启动脚本开头,都能救活一批因依赖服务没就绪而崩溃的Pod。

写完这篇,我合上笔记本,窗外天已微亮。咖啡凉透,但心里踏实——因为你知道,下次再部署,不再是盲人摸象,而是带着地图、罗盘和一把趁手的瑞士军刀。

毕竟,所谓云原生,不是堆砌术语,而是让技术回归服务人的本分。

Telegram售前客服
客服ID
@cloudcup
联系
Telegram售后客服
客服ID
@yanhuacloud
联系