
# 替换镜像地址配置
OSC需替换values.yaml或者\*.clusterserviceversion.yaml中的镜像地址，mapping.yaml文件确定OSC在values.yaml或者\*.clusterserviceversion.yaml中哪些字段用于配置镜像地址。mapping.yaml有多种不同的字段替换方式，镜像根据实际情况选择对应字段，会将镜像分隔成不同内容回填到配置文件中。
```
instance:                                            # helm文件镜像替换描述
- image: xxxxx                                       # 定义推送到仓库后的镜像名称，名称必须符合docker镜像命名规范
  tag: xxx                                           # 定义推送到仓库后的镜像版本tag
  address:                                           # 定义value.yaml中用于替换到目标key值的路径以及替换的镜像结果内容
    fullAddress: xxxx                                # 替换内容1，xxxx指代的value.yaml文件中最外层到替换镜像值的全路径，以点号相连
    repository: xxx                                  # 替换内容2
    prefixAddress: xxx                               # 替换内容3
    repo: xxx                                        # 替换内容4
    endpoint: xxx                                    # 替换内容5
    tag: xxx                                         # 替换内容6
  package:                                           # 定义替换上面address字段中的镜像路径是来自images目录中的镜像tar包
    x86_64: xxx.tar                                  # 声明使用x86格式的镜像tar包替换
    aarch64: xxx.tar                                 # 声明使用arm格式的镜像tar包替换
```
对于一个服务，如果是单CPU架构，则只需要配置x86_64或者aarch64之一即可，如果是多CPU架构，则x86_64和aarch64都需配置，osc服务会将两个服务制作成共架构服务包并将最终镜像地址回填到部署文件中。以下分别通过一个Helm服务和Operator服务举例说明，以镜像swr.cn-east-3.myhuaweicloud.com/osc-opensource/redis:0.0.1为例，address中的字段含义如下所示：
swr.cn-east-3.myhuaweicloud.com/osc-opensource/redis:0.0.1
- fullAddress：swr.cn-east-3.myhuaweicloud.com/osc-opensource/redis:0.0.1
- repository：swr.cn-east-3.myhuaweicloud.com/osc-opensource/redis
- prefixAddress：swr.cn-east-3.myhuaweicloud.com/osc-opensource
- repo: osc-opensource/redis
- endpoint：swr.cn-east-3.myhuaweicloud.com
- tag：0.0.1
![](https://support.huaweicloud.com/accessg-osc/public_sys-resources/note_3.0-zh-cn.png)
配置对应值，OSC服务会将推送后的镜像拉取地址对应回填到部署文件中的全量路径key对应的地址中去。
#### Helm服务示例
以exampleservice helm服务为例，该服务依赖kafka、redis、zookeeper、mariadb，镜像分别 kafka-2.5.0.tar，redis-6.0.10.tar，zookeeper-3.4.14.tar，mariadb-10.5.8.tar，exampleservice包含两种CPU架构的镜像，为exampleservice-1.0.0-x86.tar和exampleservice-1.0.0-aarch64.tar，其values.yaml中镜像配置：
```
image: exampleservice:1.0.0
kafka:
  image:
    registry: docker.io
    repository: bitnami/kafka
    tag: 2.5.0
zookeeper:
  image:
    repository: docker.io/bitnami/zookeeper
    tag: 3.4.0
mariadb:
  image: 
    registry: docker.io
    repository: bitnami/mariadb
    tag: 10.5.8-debian-10-r46
redis:
  image: docker.io/bitnami/redis:6.0.10
```
mapping.yaml配置为：
```
instance:
  - image: kafka
    tag: 2.5.0
    address:
      endpoint: kafka.image.registry
      repo: kafka.image.repository
      tag: kafka.image.tag
    package:
      x86_64: kafka-2.5.0.tar
  - image: mariadb
    tag: 10.5.8-debian-10-r46
    address:
      endpoint: mariadb.image.registry
      repo: mariadb.image.repository
      tag: mariadb.image.tag
    package:
      x86_64: mariadb-10.5.8.tar
  - image: zookeeper
    tag: 3.4.0
    address:
      repository: zookeeper.image.repository
      tag: zookeeper.image.tag
    package:
      x86_64: zookeeper-3.4.14.tar
  - image: redis
    tag: 6.0.10
    address:
      fullAddress: redis.image
    package:
      x86_64: exampleservice-1.0.0-x86.tar
      aarch64: exampleservice-1.0.0-arm64.tar
```
#### Operator服务示例
Operator服务镜像配置在\*.clusterserviceversion.yaml文件中，分布在两处：
1. 作为Operator运维功能的实例镜像，其默认配置在spec.install中。
2. 作为真正提供服务功能的实例镜像，其默认配置在metadata.annotations.alm-examples中。
开发者在mapping.yaml中指定需要在\*.clusterserviceversion.yaml中替换的镜像地址，以etcd operator为例：
```
apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
annotations:
alm-examples: "[
  {
    "apiVersion": "etcd.database.coreos.com/v1beta2",
    "kind": "EtcdCluster",
    "metadata": {
      "name": "example"
    },
    "spec": {
      "size": 3,
      "version": "3.2.13",
      "cluster": {
        "registry": "quay.io/coreos/“,
        "repo": "etcd-operator@sha256",
        "tag": 66a37fd61a06a43969854ee6d3e21087a98b93838e284a6086b13917f96b0d9b"
  },
    }
  },
  {
    "apiVersion": "etcd.database.coreos.com/v1beta2",
    "kind": "EtcdRestore",
    "metadata": {
      "name": "example-etcd-cluster-restore"
    },
    "spec": {
      "etcdCluster": {
        "name": "example-etcd-cluster"
      },
      "backupStorageType": "S3",
      "restore": {
        "repo": "quay.io/coreos/etcd-operator@sha256",
        "tag": 66a37fd61a06a43969854ee6d3e21087a98b93838e284a6086b13917f96b0d9b"
  },
      "s3": {
        "path": "<full-s3-path>",
        "awsSecret": "<aws-secret>"'
  }
    }
  },
  {
    "apiVersion": "etcd.database.coreos.com/v1beta2",
    "kind": "EtcdBackup",
    "metadata": {
      "name": "example-etcd-cluster-backup"
    },
    "spec": {
      "etcdEndpoints": ["<etcd-cluster-endpoints>"],
      "storageType":"S3",
      "image": "quay.io/coreos/etcd-operator@sha256:66a37fd61a06a43969854ee6d3e21087a98b93838e284a6086b13917f96b0d9b",
      "s3": {
        "path": "<full-s3-path>",
        "awsSecret": "<aws-secret>"
      }
    }
  }
]"
capabilities: Full Lifecycle
categories: Database
containerImage: quay.io/coreos/etcd-operator@sha256:66a37fd61a06a43969854ee6d3e21087a98b93838e284a6086b13917f96b0d9b
createdAt: 2019-02-28 01:03:00
description: Create and maintain highly-available etcd clusters on Kubernetes
repository: https://github.com/coreos/etcd-operator
tectonic-visibility: ocs
name: etcdoperator.v0.9.4
namespace: placeholder
spec:
  install:
    spec:
      deployments:
      - name: etcd-operator
        spec:
          replicas: 1
          selector:
            matchLabels:
              name: etcd-operator-alm-owned
          template:
            metadata:
              labels:
                name: etcd-operator-alm-owned
              name: etcd-operator-alm-owned
            spec:
              containers:
              - command:
                - etcd-operator
                - --create-crd=false
                env:
                - name: MY_POD_NAMESPACE
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
                - name: MY_POD_NAME
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.name
                image: quay.io/coreos/etcd-operator@sha256:66a37fd61a06a43969854ee6d3e21087a98b93838e284a6086b13917f96b0d9b
                name: etcd-operator
              - command:
                - etcd-backup-operator
                - --create-crd=false
                env:
                - name: MY_POD_NAMESPACE
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
                - name: MY_POD_NAME
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.name
                image: quay.io/coreos/etcd-operator@sha256:66a37fd61a06a43969854ee6d3e21087a98b93838e284a6086b13917f96b0d9b
                name: etcd-backup-operator
              - command:
                - etcd-restore-operator
                - --create-crd=false
                env:
                - name: MY_POD_NAMESPACE
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
                - name: MY_POD_NAME
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.name
                image: quay.io/coreos/etcd-operator@sha256:66a37fd61a06a43969854ee6d3e21087a98b93838e284a6086b13917f96b0d9b
                name: etcd-restore-operator
              serviceAccountName: etcd-operator
```
etcd operator中包含多个镜像，etcd-operator-x86-0.9.4.tar, etcd-operator-arm64-0.9.4.tar, etcd-backup-operator-x86-0.9.4.tar, etcd-backup-operator-arm64-0.9.4.tar, etcd-restore-operator-x86-0.9.4.tar, etcd-restore-operator-arm64-0.9.4.tar，除了instances字段，operator服务的mapping.yaml还多了一个operator字段。
```
lifecycle:                                                           
  - deployment: etcd-operator                                      
    containers:                                                 
      - type: container
        name: etcd-operator
        image: etcd-operator
        tag: 0.9.4
        package:
          x86_64: etcd-operator-0.9.4.tar
          aarch64: etcd-operator-0.9.4.tar
      - type: container
        name: etcd-backup-operator
        image: etcd-backup-operator
        tag: 0.9.4
        package:
          x86_64: etcd-backup-operator-x86-0.9.4.tar
          aarch64: etcd-backup-operator-arm64-0.9.4.tar
      - type: container
        name: etcd-restore-operator
        image: etcd-restore-operator
        tag: 0.9.4
        package:
          x86_64: etcd-restore-operator-x86-0.9.4.tar
          aarch64: etcd-restore-operator-arm64-0.9.4.tar
instance:
  - kind: EtcdCluster
    image: etcd
    tag: 0.9.4
    address:
      endpoint: spec.cluster.registry
      repo: spec.cluster.repo
      tag: spec.cluster.tag
    package:
      x86_64: etcd-x86-0.9.4.tar
      aarch64: etcd-operator-arm64-0.9.4.tar
  - kind: EtcdRestore
    image: etcd-restore
    tag: 0.9.4
    address:
      repository: spec.restore.repo
      tag: spec.restore.tag
    package:
      x86_64: etcd-x86-0.9.4.tar
      aarch64: etcd-operator-arm64-0.9.4.tar
  - kind: EtcdBackup
    image: etcd-restore
    tag: 0.9.5
    address:
      fullAddress: spec.image
    package:
      x86_64: etcd-restore-x86-0.9.6.tar      
      aarch64: etcd-restore-arm64-0.9.4.tar
```
mapping.yaml中instances字段支持列表形式，根据\*.clusterserviceversion.yaml中的alm-example来配置，每个kind对应instances字段下一个列表元素。mapping.yaml中operator字段也支持列表的形式，对应\*.clusterserviceversion.yaml中的spec.install.spec.deployments下的deployment列表。
![](https://support.huaweicloud.com/accessg-osc/public_sys-resources/notice_3.0-zh-cn.png)
\*.clusterserviceversion.yaml中spec.install.spec.deployments每个deployment的镜像配置都只能配置完整的镜像地址，不能再以fullAddress，repository，tag等字段的方式来拼接，因此无需再指定被替换的镜像地址，osc根据package字段中的内容来回填的image， type分为initContainer/container/ephemeralContainer三种类型，对应deployment中支持的三种container类型场景状态。
上述例子中lifecycle字段只是部分配置，deployment元素的完整配置如下：
```
lifecycle:                                                           
  - deployment: xxx                             # deployment的名字                    
    containers:                                                                 
      - type: initContainer                     # deployment下的container类型，主要分为initContainer/container/ephemeralContainer三种
        name: xxx                               # container类型的name值
        image: xxx                              # 定义推送到仓库后的镜像名称，名称必须符合docker镜像命名规范
        tag: xxx                                # 定义推送到仓库后的镜像版本tag
        package:
         x86_64: xxx.tar
          aarch64: xxx.tar
        env:                                     # container env字段下变量中涉及需要进行镜像地址替换的声明，没有可不填
          - name: XXX                            # env中环境name变量的名称
            image: xxx                           # 定义推送到仓库后的镜像名称，名称必须符合docker镜像命名规范
            tag: xxx                             # 定义推送到仓库后的镜像版本tag
            package:
              x86_64: xxx.tar
              aarch64: xxx.tar
      - type: container
        name: xxx
        image: xxx
        tag: xxx
        package:
         x86_64: xxx.tar
          aarch64: xxx.tar
        env:                                     # container env字段下变量中涉及需要进行镜像地址替换的声明，没有可不填
          - name: XXX                            # env中环境name变量的名称
            image: xxx                           # 定义推送到仓库后的镜像名称，名称必须符合docker镜像命名规范
            tag: xxx                             # 定义推送到仓库后的镜像版本tag
            package:
              x86_64: xxx.tar
              aarch64: xxx.tar
      - type: ephemeralContainer
        name: xxx
        image: xxx
        tag: xxx
        package:
         x86_64: xxx.tar
          aarch64: xxx.tar
        env:                                     # container env字段下变量中涉及需要进行镜像地址替换的声明，没有可不填
          - name: XXX                            # env中环境name变量的名称
            image: xxx                           # 定义推送到仓库后的镜像名称，名称必须符合docker镜像命名规范
            tag: xxx                             # 定义推送到仓库后的镜像版本tag
            package:
              x86_64: xxx.tar
              aarch64: xxx.tar
```
![](https://support.huaweicloud.com/accessg-osc/public_sys-resources/caution_3.0-zh-cn.png)
- operator.deployment.containers下每个name对应的配置，如果是单CPU架构，x86_64和aarch64二选一，多架构则都配置，每种容器启动的镜像只能有一个。
- initContainers，containers，ephemeralContainers都是可选项，这些字段是\*.clusterserviceversion.yaml中用来配置容器初始化的，根据实际情况配置，如果没有可以不配置。
 
