全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:工作负载FAQ

更新时间:Dec 11, 2025

本文介绍在ACK集群中部署工作负载的过程中可能遇到的常见问题及对应解决方案。

在ACK集群中使用容器运行应用的大致流程是什么?

应用代码可部署在线下或者云上。不论何种语言的代码,都可以将其以容器化的方式部署、交付及运行。从开发代码到运行容器化应用,大致需要以下四个阶段。

  1. 编写业务代码。

  2. 使用Dockerfile构建镜像。

    展开查看相关概念

    • Dockerfile:一个文本文件,包含了将代码打包成镜像所需的指令。具体操作,请参见在Dockerfile中使用构建打包镜像并运行

    • 镜像:软件交付的载体。相较于传统的如JAR、WAR、RPM包等,除了代码外,镜像还包含应用所依赖的软件环境(容器运行时所需要的所有的文件集合)。使用镜像可以快速生成一个容器,即运行的应用。

    • 容器:一组具有隔离特性的进程集合,其特点是视图隔离、资源可限制、具备独立文件系统。ACK可以对所有的容器化应用进行全生命周期的高效管理。例如将某些Pod调度到指定的节点上,或者在业务负载升高时进行扩容操作。

  3. 上传镜像至镜像仓库,可以使用容器镜像服务ACR来存放镜像,并进行版本管理、分发拉取等操作。

    ACR提供个人版和企业版,分别面向个人开发者和企业客户。更多信息,请参见什么是容器镜像服务ACR

  4. 在ACK集群中部署工作负载,运行容器化应用,使用ACK提供的多种容器化应用管理能力,请参见工作负载

为什么拉取镜像速度慢或拉取失败?

问题现象

容器拉取镜像时花费时间过长或拉取失败。

问题原因

下列原因都可能导致上述情况:

  • 通过公网拉取镜像时,没有为集群开启公网访问能力,或公网IP带宽峰值设置较低。

  • 从ACR拉取镜像时,镜像密钥不正确,或免密组件配置错误。

解决方案

如何进行ACK应用故障排查?

ACK应用故障主要是由Pod、Deployment(StatefulSet/DaemonSet)控制器和Service的问题导致,请检查以下几类问题。

检查Pod

关于Pod异常问题的处理,请参见Pod异常问题排查

检查Deployment

  • 创建Deployment、DaemonSet、StatefulSet或Job等资源时,可能为Pod的问题。请参见Pod异常问题排查检查Pod的问题。

  • 通过查看和Deployment相关的事件及日志来定位问题:

    本文以Deployment为例进行介绍,在DaemonSet、StatefulSet或Job等资源中查看事件和日志的操作类似。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

    3. 无状态页面,单击目标Deployment名称。然后单击事件日志,即可通过异常信息定位问题。

检查Service

服务(Service)可以为一组Pod提供负载均衡的功能。以下介绍如何定位与Service相关的几类常见问题:

  1. 检查Service的Endpoints。

  2. 获取集群KubeConfig并通过kubectl工具连接集群

  3. 执行以下命令,查看Service的Endpoints。

    以下代码中<service_name>为目标Service的名称。

    kubectl get endpoints <service_name>

    请确保ENDPOINTS值的地址个数与期望该Service匹配的Pod个数相同。例如,Deployment副本数为3,那么ENDPOINTS值的地址个数一定是3个。

Service中缺少Endpoints地址

如果Service中缺少Endpoints地址,可以通过Service的selector查询Service与Pod是否相关联,示例如下:

  1. 若Service的YAML文件信息如下图所示时。123..png

  2. 替换下方命令中的<app><namespace>,核对返回的Pod是否为Service已关联的Pod。

    kubectl get pods -l app=<app> -n <namespace>
    说明
    • <app>为Pod的app标签(Label)所对应的值。

    • <namespace>为服务所在的命名空间,如果服务在默认空间,则无需指定。

  3. 如果返回的Pod是关联的Pod,但没有Endpoints地址,很可能是没有为Service指定正确的端口。如果Service中指定的端口实际上在Pod中没有被监听,那么该Pod不会被添加到ENDPOINTS列表中,因此,请确保Service指定的容器端口在Pod中可以访问,命令如下。

    curl <ip>:<port>
    说明
    • <ip>为第1步YAML文件中的clusterIP。

    • <port>为第1步YAML文件中的port值。

    • 具体测试方法以实际环境为准。

网络转发问题

如果客户端可以连接Service,并且Endpoints中的地址正确,但连接很快断开,那么可能是流量不能转发到Pod上,通常需要进行以下检查:

  • Pod是否正常工作。

    定位Pod问题。具体操作,请参见Pod异常问题排查

  • Pod地址是否正常连通。

    1. 执行以下命令,获取Pod的IP地址。

      kubectl get pods -o wide
    2. 登录任意节点,使用ping命令测试Pod的IP地址,确认网络连接正常。

  • 应用程序是否正常监听端口。

    如果应用程序监听80端口,那么需要在Service中指定容器端口为80。在任意节点上执行curl <ip>:<Port>命令,查看Pod中容器的端口是否正常。

如何手动升级Helm的版本?

由于Helm v2 Tiller服务端在社区一直存在已知的安全问题,攻击者可以通过tiller在集群内安装未经授权的应用,因此推荐升级至Helm v3版本。具体操作,请参见将Helm V2升级迁移至Helm V3

如何在国外地域的ACK集群中使用中国内地地域的容器镜像服务企业版的镜像?

在此场景下,需要在中国内地购买标准版和高级版的容器镜像服务企业版,在国外购买基础版的容器镜像服务企业版。

完成购买后,使用同步实例将中国内地地域的镜像同步到国外地域,具体操作请参见同账号同步实例。在国外的容器镜像服务企业版中获取镜像地址,并在ACK集群中使用该地址创建应用。

说明

使用ACR个人版同步速度较慢,自建仓库需购买GA加速。自建仓库和GA加速成本较高,推荐使用容器镜像服务企业版。容器镜像服务企业版的计费方式请参见计费说明

更新应用时,如何实现零中断滚动更新?

在旧的应用删除、新的应用创建过程中,可能会产生短暂的5XX访问错误。这是因为Pod变更同步到CLB时存在秒级延迟。可以通过配置优雅中断等方式解决此问题,实现K8s零中断滚动更新。具体操作,请参见如何实现K8s零中断滚动更新?

如何获取容器镜像?

拉取工作负载容器镜像的准备工作及注意事项,请参见管理镜像

如何重启容器?

无法直接操作重启单个容器,可以通过以下方式实现同样的效果:

  1. 执行以下命令查看容器状态,并确定待重启的容器。

    kubectl get pods
  2. 删除Pod:直接删除Pod也会触发控制器(例如Deployment、DaemonSet等)重新创建新的Pod实例,从而达到重启容器的目的。删除单个Pod的命令如下:

    kubectl delete pod <pod-name>
  3. 删除Pod后,Kubernetes会根据对应的控制器自动创建一个新的Pod进行替换。

    说明

    在实际生产环境中,应避免手动直接操作Pod,而是通过控制ReplicaSet、Deployment等对象来进行容器的管理和更新,以确保集群状态的一致性和正确性。

  4. 执行以下命令验证容器状态,确认容器状态为Running重启成功。

    kubectl get pods

如何修改Deployment的命名空间?

如果期望将服务从一个命名空间转移到另一个命名空间,需要将服务的归属命名空间进行相应的修改。当执行命名空间变更时,还需要手动修改服务的持久化卷声明、配置对象(ConfigMaps)、保密字典(Secrets)以及其他依赖资源的命名空间,确保服务正常运行。

  1. 通过kubectl get命令以YAML格式导出资源配置。

    kubectl get deploy <deployment-name> -n <old-namespace> -o yaml > deployment.yaml
  2. 编辑deployment.yaml,将namespace参数替换成新的命名空间后保存并退出。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
      generation: 1
      labels:
        app: nginx
      name: nginx-deployment
      namespace: new-namespace # 替换为新的命名空间。
      ... ...
  3. 使用kubectl apply命令将服务更新至新命名空间。

    kubectl apply -f deployment.yaml 
  4. 使用kubectl get命令在新命名空间下查看服务。

    kubectl get deploy -n new-namespace

如何将Pod信息呈现给容器?

ACK与社区Kubernetes保持一致性,遵循社区规范。将Pod信息呈现给容器时可通过两种方式:

  • 环境变量:通过设置环境变量的方式,将Pod的信息传递给容器。

  • 通过文件方式:通过挂载文件的方式,将Pod的信息以文件的形式提供给容器。

如何使用imagePullSecrets?

2024年09月09日及之后新建的ACR个人版不支持使用免密组件。使用新建的ACR个人版实例时,建议通过Secret保存用户名与登录密码的方式,在imagePullSecrets字段中使用。

重要
  • 免密组件不支持与手动填入imagePullSecrets字段同时使用。

  • Secret需与工作负载处于同一命名空间。

  1. 执行以下命令并替换其中的参数,即可通过用户名和密码创建密钥Secret。

    kubectl create secret docker-registry image-secret \
      --docker-server=<ACR-registry> \
      --docker-username=<username> \
      --docker-password=<password> \
      --docker-email=<email@example.com>
    • docker-server:填入ACR实例地址,需与镜像地址的网络类型相同(内网或公网地址)。

    • docker-username:ACR访问凭证用户名。

    • docker-password:ACR访问凭证密码。

    • docker-email:选填。

  2. 创建Secret后,可以通过在Service Account或工作负载中配置imagePullSecrets字段使用用户名和密码。

    通过Service Account使用

    在Service Account中添加imagePullSecrets字段,以default命名空间的默认Service Account default为例:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: default
      ...
    imagePullSecrets:
    - name: acr-3 # 填入ACR密钥Secret

    工作负载在使用该Service Account时,即可拉取镜像。

    apiVersion: apps/v1
    kind: Deployment 
    metadata:
      name: nginx-test
      namespace: default 
      labels:
        app: nginx
    spec:
      serviceAccountName: default # 如果使用命名空间默认SA,可以不指定
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx 
        spec:
          containers:
          - name: nginx 
            image: <acrID>.cr.aliyuncs.com/<repo>/nginx:latest  # 替换为ACR实例链接

    在工作负载中直接使用

    在工作负载中通过imagePullSecrets字段使用密钥。

    apiVersion: apps/v1
    kind: Deployment 
    metadata:
      name: nginx-test
      namespace: default 
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx 
        spec:
          imagePullSecrets:
          - name: image-secret  # 使用上一步创建的Secret
          containers:
          - name: nginx 
            image: <acrID>.cr.aliyuncs.com/<repo>/nginx:latest  # 替换为ACR仓库的镜像地址

为什么配置免密组件后仍然拉取失败?

一个可能的原因是免密组件配置错误,例如:

  • 免密组件中的实例信息与ACR实例不符。

  • 拉取镜像使用的镜像地址与免密组件中实例信息的域名不符。

请按照同账号拉取镜像中的操作进行排查。

如组件配置正确时,仍出现了拉取失败情况,可能是因工作负载YAML中手动填入的imagePullSecrets与免密组件产生冲突。请手动删除imagePullSecrets字段,并删除旧Pod重建以解决此问题。

为什么开启节点池镜像加速后,在新增节点容器启动失败?

为节点池开启容器镜像加速后,容器启动失败,且报错为:

failed to create containerd container: failed to attach and mount for snapshot 46: failed to enable target for /sys/kernel/config/target/core/user_99999/dev_46, failed:failed to open remote file as tar file xxxx

该问题的原因是:开启容器镜像加速后,如需拉取私有镜像,必须同时安装aliyun-acr-acceleration-suite组件,并配置拉取凭证,请参见1、配置容器镜像拉取凭证

重要

如果安装组件后问题未解决,建议使用按需加载容器镜像加速容器启动优先恢复业务,后续再重新尝试配置。