本文主要为您介绍Kubernetes集群中应用的常见问题。

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

您可以按照以下方式对拉取镜像慢或失败的问题进行排查:
  • 如果您使用ACR拉取镜像,请确认用户名或密码是否正确。建议使用免密插件拉取镜像,具体操作,请参见使用免密组件拉取容器镜像
  • 确认发起请求的客户端是否具备公网能力,如果没有,您需要为客户端设置公网。

如何手动升级Helm的版本?

  1. 登录到Kubernetes集群。更多信息,请参见获取集群KubeConfig并通过kubectl工具连接集群
  2. 执行以下命令安装Tiller。
    其中镜像地址可使用对应地域的VPC域名,例如,杭州地域的机器替换为registry-vpc.cn-hangzhou.aliyuncs.com/acs/tiller:v2.11.0
    helm init --tiller-image registry.cn-hangzhou.aliyuncs.com/acs/tiller:v2.11.0 --upgrade
  3. 等待tiller健康检查通过,执行helm version命令查看版本升级情况。
    说明
    • 这里只会升级Helm服务端版本,客户端可以通过直接下载对应的Client Binary使用。
    • 请下载阿里云支持的最新客户端版本Helm client 2.11.0
  4. Helm客户端和服务端版本都升级完毕后,执行以下命令查看Helm版本。
    helm version

    预期输出:

    Client: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b****", GitTreeState:"clean"}
    Server: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b****", GitTreeState:"clean"}

如何支持私有镜像?

执行以下命令创建Secret。
kubectl create secret docker-registry regsecret --docker-server=registry-internal.cn-hangzhou.aliyuncs.com --docker-username=abc****@aliyun.com --docker-password=**** --docker-email=abc****@aliyun.com
说明
  • regsecret:指密钥的键名称,可自定义。
  • --docker-server:指Docker仓库地址。
  • --docker-username:指Docker仓库用户名。
  • --docker-password:指Docker仓库登录密码。
  • 可选:--docker-email:指邮件地址。

您可以通过以下两种方法操作:

  • 手动配置私有镜像
    YAML文件加入密钥参数。
    containers:
        - name: foo
          image: registry-internal.cn-hangzhou.aliyuncs.com/abc/test:1.0
    imagePullSecrets:
        - name: regsecret
    说明
    • imagePullSecrets是声明拉取镜像时需要指定密钥。
    • regsecret必须和上面生成密钥的键名一致。
    • image中的Docker仓库名称必须和--docker-server中的Docker仓库名一致。

    更多信息,请参见使用私有仓库

  • 自动配置私有镜像实现无密钥编排
    说明 为了避免每次使用私有镜像部署时,都需要引用密钥,您可将Secret添加到Namespace的Default Service Account中。更多信息,请参见Add ImagePullSecrets to a service account
    1. 执行以下命令,查看创建的拉取私有镜像的Secret。
      kubectl get secret regsecret

      预期输出:

      NAME        TYPE                             DATA      AGE
      regsecret   kubernetes.io/dockerconfigjson   1         13m
      本例中采用手动配置的方式,修改命名空间的默认服务账号Default,从而将此Secret作为imagePullSecret
    2. 创建一个sa.yaml配置文件,将服务账号Default的配置导入到该文件中。
      kubectl get serviceaccounts default -o yaml > ./sa.yaml
    3. 执行以下命令查看sa.yaml文件详情。
      cat  sa.yaml

      预期输出:

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        creationTimestamp: 2015-08-07T22:02:39Z
        name: default
        namespace: default
        resourceVersion: "243024"             #注意该项selfLink: /api/v1/namespaces/default/serviceaccounts/default。
        uid: 052fb0f4-3d50-11e5-b066-42010af0****
      secrets:
      - name: default-token-uudgeoken-uudge
    4. 执行vim sa.yaml命令,删除resourceVersion,并增加拉取镜像的密钥配置项imagePullSecrets。修改后的配置如下所示:
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        creationTimestamp: 2015-08-07T22:02:39Z
        name: default
        namespace: default
        selfLink: /api/v1/namespaces/default/serviceaccounts/default
        uid: 052fb0f4-3d50-11e5-b066-42010af0****
      secrets:
      - name: default-token-uudge
      imagePullSecrets:                 #增加该项。
      - name: regsecret                                    
    5. 执行以下命令将sa.yaml配置文件替换Default的服务账号配置。
      kubectl replace serviceaccount default -f ./sa.yaml

      预期输出:

      serviceaccount "default" replaced
    6. 创建Tomcat示例应用。

      Tomcat编排示例tomcat.yaml文件如下所示:

      apiVersion: apps/v1 
      kind: Deployment
      metadata:
        name: tomcat-deployment
        labels:
          app: tomcat
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: tomcat
        template:
          metadata:
            labels:
              app: tomcat
          spec:
            containers:
            - name: tomcat
              image: registry-internal.cn-hangzhou.aliyuncs.com/abc/test:1.0              #替换为您自己的私有镜像地址Ports。
              - containerPort: 8080

      执行以下命令创建Tomcat应用。

      kubectl create -f tomcat.yaml
    7. Pod启动成功后执行以下命令,可看到预期的配置。
      kubectl get pod tomcat-**** -o yaml

      预期输出:

      spec:
        imagePullSecrets:
      - nameregsecretey

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

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

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

如果您使用容器镜像服务个人版,同步镜像的速度将非常慢。如果您使用的是自建仓库,您需要购买GA加速。
说明 自建仓库和购买GA加速的成本比购买容器镜像服务企业版高,推荐您使用容器镜像服务企业版。

关于容器镜像服务企业版的计费方式,请参见计费说明

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

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