# 使用第三方镜像
#### 操作场景
第三方镜像是指由除官方镜像仓库和SWR镜像仓库外，其他组织或个人提供的容器镜像。这些镜像通常包含自定义应用程序、工具或特定版本的操作系统，能够满足用户特定的业务需求。在CCE Autopilot集群中，用户可以通过密钥认证的方式拉取第三方镜像，进而创建工作负载，满足业务需要。
#### 前提条件
使用第三方镜像时，请确保CCE Autopilot集群可以正常访问其仓库所在的网络环境，具体分为三种情况：
- **内网访问** ：当第三方镜像仓库支持内网访问时，存在以下情况：
  - 当第三方镜像仓库位于集群所在的VPC内时，Pod可以通过内网访问直接拉取镜像，无需额外配置。
  
  - 当第三方镜像仓库与集群处于同一区域的不同VPC时，可以通过对等连接打通两个VPC之间的网络，之后Pod可以通过内网访问直接拉取镜像。关于对等连接的具体操作，请参见[对等连接](https://support.huaweicloud.com/usermanual-vpc/vpc_peering_0009.html)。
   
- **公网访问** ：当第三方镜像仓库支持公网访问时，Pod可以通过公网拉取镜像。此时，需确保**Pod具备访问公网的能力** 。您可以通过以下方式，确保Pod具备访问公网的能力：
  ![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
  当使用公网访问方式拉取镜像时，请确保EIP的带宽充足，以避免因带宽不足导致镜像拉取失败或拉取速度过慢。
  - 为集群配置SNAT规则：配置SNAT规则后，集群中的Pod实例都将具备访问公网的能力。此时，创建新的工作负载，可以直接通过公网拉取镜像。具体操作步骤，请参见[从容器访问公网](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0400.html)。
  
  - 为Pod配置EIP：创建工作负载时，直接为Pod关联弹性公网IP（EIP）。此时，仅绑定EIP的Pod实例具备访问公网的能力。该方法需要在创建工作负载时进行配置，在下文中将进行相关介绍。更多信息，请参见[为Pod配置EIP](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0734.html)。
   
- **云专线或VPN访问** ：当需要使用云下镜像仓库时，您需要通过[云专线](https://support.huaweicloud.com/bestpractice-dc/dc_05_0002.html)或[VPN](https://support.huaweicloud.com/bestpractice-vpn/vpn_best_00019.html)的方式，提前将第三方镜像仓库所在的网络环境与集群所在VPC打通。网络环境打通后，无需额外配置。
 
#### 使用第三方镜像
使用第三方镜像时，需先创建镜像拉取密钥，并在工作负载中引用该密钥以授权访问。本文共提供两种配置方式，即控制台方式和kubectl命令行方式。
- [控制台方式]
  本节将详细介绍如何通过控制台创建密钥，并基于该密钥拉取第三方镜像以创建工作负载。
  1. 如果第三方镜像仓库存在账号和密码，则需要在集群中创建相关密钥，作为拉取镜像的身份凭证。
     
     1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
     
     2. 在左侧导航栏中，单击"配置与密钥"。在右侧选择"密钥"页签，单击右上角"创建密钥"。
     
     3. 在"创建密钥"页面，配置相关参数，具体请参见[图1 添加密钥]和[表1]。更详细的参数说明，请参见[创建密钥](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0153.html)。
     
     
     图1添加密钥   
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002500304252.png "点击放大")
      表1添加密钥 
     | 参数   | 示例                                                                                              | 参数说明                                                                                                                                                                                                                                              |
     |:---|:---|:---|
     | 名称   | test                                                                                              | 表示新建的密钥名称。 由小写字母、数字、横线（-）和点（.）组成，且以字母或数字开头和结尾，最长支持253个字符。                                                                                                                                                                |
     | 密钥类型   | kubernetes.io/dockerconfigjson                                                                  | 表示新建的密钥类型。 本处固定为"kubernetes.io/dockerconfigjson"，表示该密钥是拉取第三方镜像时所需要的认证信息。                                                                                                                                          |
     | 密钥数据 | 镜像仓库地址：www.example.com 用户名：ssl 密码：xxx | - 镜像仓库地址：请填入第三镜像仓库的地址。  - 用户名：请填入第三方镜像仓库的账号。  - 密码：请填入第三方镜像仓库的密码。   |
        
     
     
  
  2. 在左侧导航栏中，单击"工作负载"，在右上角单击"创建工作负载"。"创建工作负载"页面中，在"容器配置 \> 容器信息 \> 基本信息 \> 镜像名称"中直接填写第三方镜像地址。并在"镜像访问凭证"中选择[1]中创建的密钥。
     
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/caution_3.0-zh-cn.png)
     填写第三方镜像地址时，如果不指定具体域名，例如输入nginx:latest，将默认从docker.io拉取镜像。
     图2填写第三方镜像地址   
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002298339790.png "点击放大")
     
     
     
  
  3. （**仅当需要为Pod配置EIP时，涉及该步骤** ）在"高级配置 \> 标签与注解 \> Pod注解"中依次填写[表2]中参数。本步骤以为Pod配置**独占带宽** 类型的EIP为例，如果需要配置**共享带宽** 类型的EIP，请参见[为Pod配置EIP](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0734.html)。
     
     图3增加注解   
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002343411685.png "点击放大")
     
     
      表2独占带宽EIP跟随Pod创建的annotation配置 
     | annotation                     | 是否可选 | 默认值     | 参数说明                                                                                                                                    | 取值范围                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
     |:---|:---|:---|:---|:---|
     | yangtse.io/pod-with-eip         | 必选   | false    | 是否需要跟随Pod创建EIP并绑定到该Pod。                                                                                                                | "false"或"true"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
     | yangtse.io/eip-bandwidth-size | 可选    | 5       | 带宽大小，单位为Mbit/s。                                                                                                                         | 具体范围以各区域配置为准，根据带宽的计费类型不同可能存在差异，详情请参见弹性公网IP控制台的购买页面。 例如，"华东-上海一"区域按带宽计费类型的带宽大小范围为1Mbit/s\~2000Mbit/s、按流量计费类型的带宽大小范围为1Mbit/s\~300Mbit/s。                                                                                                                                                                                                                                                                                                                             |
     | yangtse.io/eip-network-type     | 可选    | 5_bgp  | 公网IP类型。                                                                                                                                | 具体类型以各区域配置为准，详情请参见弹性公网IP控制台的购买页面。 例如，"华东-上海一"区域支持以下类型： - 5_bgp：全动态BGP  - 5_sbgp：静态BGP   |
     | yangtse.io/eip-charge-mode     | 可选    | 空      | 按流量计费或按带宽计费。 **建议填写该参数。**若该参数为空，表示不指定计费模式，则以该区域下弹性公网IP接口的默认值为准。 | - bandwidth：按带宽计费  - traffic：按流量计费                                                                                                                                                                                                        |
     | yangtse.io/eip-bandwidth-name     | 可选   | Pod名称 | 带宽名称。                                                                                                                                   | 1-64个字符，支持数字、字母、中文、_(下划线)、-（中划线）、.（点）。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
        
     
     
  
  4. 填写其他参数后，单击"创建工作负载"。待工作负载状态变为运行中时，则说明第三方镜像拉取成功。
   
- [kubectl命令行方式]
  本节将详细介绍如何通过kubectl命令行方式创建密钥，并基于该密钥拉取第三方镜像以创建工作负载。
  1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0107.html)，使用kubectl连接集群。
  
  2. 如果第三方镜像仓库存在账号和密码，则需要在集群中创建相关密钥，作为拉取镜像的身份凭证。 
     1. 执行以下命令，创建认证密钥。该密钥类型默认为kubernetes.io/dockerconfigjson类型，表示该密钥是拉取第三方镜像时所需要的认证信息。
        ```
        kubectl create secret docker-registry test  -n default --docker-server=www.example.com --docker-username=ssl --docker-password=xxx --docker-email=example@123.com
        ```
        其中，*test* 为密钥名称，*default*为密钥所在的命名空间，其余参数如下所示。
        表3密钥参数说明 
        | 参数                 | 示例               | 参数说明                 |
        |:---|:---|:---|
        | docker-server    | www.example.com | 请填入第三镜像仓库的地址。       |
        | docker-username | ssl             | 请填入第三方镜像仓库的账号。     |
        | docker-password     | xxx             | 请填入第三方镜像仓库的密码       |
        | docker-email       | example@123.com | 请填入第三方镜像仓库的邮箱，非必填项。 |
           
        回显结果如下：
        ```
        secret/test created
        ```
        
     
     2. 执行以下命令，检查密钥是否创建成功。
        ```
        kubectl get secret
        ```
        回显结果如下，则说明该密钥已成功创建。
        ```
        NAME             TYPE                             DATA   AGE
        default-secret   kubernetes.io/dockerconfigjson   1      41h
        paas.elb         cfe/secure-opaque                1      41h
        test             kubernetes.io/dockerconfigjson   1      16s
        ```
        
     
     
     
     
  
  3. 使用第三方镜像创建工作负载，具体步骤请参见如下。 
     1. 执行以下命令，创建YAML文件deployment.yaml，用于配置工作负载，文件名称可自定义。
        ```
        vim deployment.yaml
        ```
        文件内容如下：
        ```
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: foo
          namespace: default
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: foo
          strategy:
            type: RollingUpdate
          template:
            metadata:
              labels:
                app: foo
              annotations:  # 仅当需要为Pod配置EIP时，涉及annotations中的参数
                yangtse.io/eip-bandwidth-name: test
                yangtse.io/eip-bandwidth-size: '5'
                yangtse.io/eip-charge-mode: bandwidth
                yangtse.io/eip-network-type: 5_bgp
                yangtse.io/pod-with-eip: 'true'
            spec:
              containers:
              - image: www.example.com/janedoe/awesomeapp:v1    # 第三方镜像地址
                imagePullPolicy: Always
                name: foo
              imagePullSecrets:
              - name: test    # 使用上面创建的密钥，作为拉取镜像的身份认证
        ```
        **仅当需要为Pod配置EIP时，涉及annotations中的参数。** 本文以为Pod配置**独占带宽** 类型的EIP为例，如果需要配置**共享带宽** 类型的EIP，请参见[为Pod配置EIP](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0734.html)。
        表4独占带宽EIP跟随Pod创建的annotation配置 
        | annotation                     | 是否可选 | 默认值     | 参数说明                                                                                                                                      | 取值范围                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
        |:---|:---|:---|:---|:---|
        | yangtse.io/pod-with-eip         | 必选   | false    | 是否需要跟随Pod创建EIP并绑定到该Pod。                                                                                                                  | "false"或"true"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
        | yangtse.io/eip-bandwidth-size | 可选    | 5       | 带宽大小，单位为Mbit/s。                                                                                                                           | 具体范围以各区域配置为准，根据带宽的计费类型不同可能存在差异，详情请参见弹性公网IP控制台的购买页面。 例如，"华东-上海一"区域按带宽计费类型的带宽大小范围为1Mbit/s\~2000Mbit/s、按流量计费类型的带宽大小范围为1Mbit/s\~300Mbit/s。                                                                                                                                                                                                                                                                                                                                       |
        | yangtse.io/eip-network-type     | 可选    | 5_bgp  | 公网IP类型。                                                                                                                                  | 具体类型以各区域配置为准，详情请参见弹性公网IP控制台的购买页面。 例如，"华东-上海一"区域支持以下类型： - 5_bgp：全动态BGP  - 5_sbgp：静态BGP   |
        | yangtse.io/eip-charge-mode     | 可选    | 空      | 按流量计费或按带宽计费。 **建议填写该参数。**若该参数为空，表示不指定计费模式，则以该区域下弹性公网IP接口的默认值为准。 | - bandwidth：按带宽计费  - traffic：按流量计费                                                                                                                                                                                                            |
        | yangtse.io/eip-bandwidth-name     | 可选   | Pod名称 | 带宽名称。                                                                                                                                     | 1-64个字符，支持数字、字母、中文、_(下划线)、-（中划线）、.（点）。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
           
        
     
     2. 执行以下命令，创建工作负载。
        ```
        kubectl create -f deployment.yaml
        ```
        回显如下，表示已经开始创建工作负载。
        ```
        deployment.apps/foo created
        ```
        
     
     3. 执行以下命令，查看工作负载状态。
        ```
        kubectl get deployment
        ```
        回显如下，如果工作负载创建的Pod皆为可用状态，则表示创建成功。
        ```
        NAME     READY   UP-TO-DATE   AVAILABLE   AGE
        foo      1/1     1            1           4m59s
        ```
        
     
     
     
     
   
