华为云用户手册

  • 工具包 在集群评估、镜像迁移、应用备份和应用迁移阶段,迁移过程已实现工具化。您需要预先下载这些工具并将它们上传到前述服务器。 对于Linux操作系统来说,使用下述工具前,需要运行chmod u+x 工具名命令(例如chmod u+x kspider-linux-amd64),授予可执行权限。 表1 准备工作 工具 说明 下载链接 备注 kspider kspider是一款用于采集源集群信息的工具,它向用户提供了集群的Kubernetes版本、规模、工作负载数量、存储以及正在使用的镜像等数据,这些信息有助于用户了解集群的当前状况,评估迁移风险,并选择合适的目标集群版本和规模。 Linux x86:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/kspider-linux-amd64 Linux arm:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/kspider-linux-arm64 Windows:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/kspider-windows-amd64.exe 这些工具均支持在Linux(x86、arm)和Windows系统上运行,请根据服务器操作系统类型下载对应的工具。 image-migrator image-migrator是一个镜像迁移工具,能够自动将基于Docker Registry v2搭建的Docker镜像仓库或第三方云镜像仓库中的镜像迁移到SWR中。 Linux x86:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/image-migrator-linux-amd64 Linux arm:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/image-migrator-linux-arm64 Windows:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/image-migrator-windows-amd64.exe k8clone k8clone是一个简便的Kubernetes元数据克隆工具,它可以将Kubernetes元数据(对象)保存为本地压缩包,然后将这些元数据恢复到目标集群中。 Linux x86:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/k8clone-linux-amd64 Linux arm:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/k8clone-linux-arm64 Windows:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/k8clone-windows-amd64.exe
  • 符合策略实例的资源定义 示例中volumes中的类型均在上述定义的允许范围内,符合策略实例。 apiVersion: v1kind: Podmetadata: name: nginx-volume-types-allowed labels: app: nginx-volume-typesspec: containers: - name: nginx image: nginx volumeMounts: - mountPath: /cache name: cache-volume - name: nginx2 image: nginx volumeMounts: - mountPath: /cache2 name: demo-vol volumes: - name: cache-volume emptyDir: {} - name: demo-vol emptyDir: {}
  • 不符合策略实例的资源定义 示例一:CPU比例为40,不符合约束。 apiVersion: v1kind: Podmetadata: name: opa-disallowed labels: owner: me.agilebank.demospec: containers: - name: opa image: openpolicyagent/opa:0.9.2 args: - "run" - "--server" - "--addr=localhost:8080" resources: limits: cpu: "4" memory: "2Gi" requests: cpu: "100m" memory: "2Gi" 示例二:内存比例为20,不符合约束。 apiVersion: v1kind: Podmetadata: name: opa-disallowed labels: owner: me.agilebank.demospec: containers: - name: opa image: openpolicyagent/opa:0.9.2 args: - "run" - "--server" - "--addr=localhost:8080" resources: limits: cpu: "800m" memory: "2Gi" requests: cpu: "100m" memory: "100Mi"
  • 策略实例示例 以下策略实例展示了策略定义生效的资源类型,parameters的volumes字段定义了允许的类型列表。 apiVersion: constraints.gatekeeper.sh/v1beta1kind: K8sPSPVolumeTypesmetadata: name: psp-volume-typesspec: match: kinds: - apiGroups: [""] kinds: ["Pod"] parameters: volumes: # - "*" # * may be used to allow all volume types - configMap - emptyDir - projected - secret - downwardAPI - persistentVolumeClaim #- hostPath #required for allowedHostPaths - flexVolume #required for allowedFlexVolumes
  • 策略实例示例 限制容器的limit对request比例的最大值为1,cpu的limit对request比例最大值为10。 apiVersion: constraints.gatekeeper.sh/v1beta1kind: K8sContainerRatiosmetadata: name: container-must-meet-memory-and-cpu-ratiospec: match: kinds: - apiGroups: [""] kinds: ["Pod"] parameters: ratio: "1"cpuRatio: "10"
  • 符合策略实例的资源定义 cpu比例为4,内存比例为1,符合约束。 apiVersion: v1kind: Podmetadata: name: opa-allowed labels: owner: me.agilebank.demospec: containers: - name: opa image: openpolicyagent/opa:0.9.2 args: - "run" - "--server" - "--addr=localhost:8080" resources: limits: cpu: "4" memory: "2Gi" requests: cpu: "1" memory: "2Gi"
  • 环境变量查看 如果configmap-example和secret-example的内容如下。 $ kubectl get configmap configmap-example -oyamlapiVersion: v1data: configmap_key: configmap_valuekind: ConfigMap...$ kubectl get secret secret-example -oyamlapiVersion: v1data: secret_key: c2VjcmV0X3ZhbHVl # c2VjcmV0X3ZhbHVl为secret_value的base64编码kind: Secret... 则进入Pod中查看的环境变量结果如下。 $ kubectl get podNAME READY STATUS RESTARTS AGEenv-example-695b759569-lx9jp 1/1 Running 0 17m$ kubectl exec env-example-695b759569-lx9jp -- printenv/ # envkey=value # 自定义环境变量key1=configmap_value # 配置项键值导入key2=secret_value # 密钥键值导入key3=env-example-695b759569-lx9jp # Pod的metadata.namekey4=1 # container1这个容器的limits.cpu,单位为Core,向上取整configmap_key=configmap_value # 配置项导入,原配置项中的键值直接会导入结果secret_key=secret_value # 密钥导入,原密钥中的键值直接会导入结果
  • 操作场景 环境变量是指容器运行环境中设定的一个变量,环境变量可以在工作负载部署后修改,为工作负载提供极大的灵活性。 通过控制台设置的环境变量与Dockerfile中的“ENV”效果相同。 容器启动后,容器中的内容不应修改。如果修改配置项(例如将容器应用的密码、证书、环境变量配置到容器中),当容器重启(例如节点异常重新调度Pod)后,会导致配置丢失,业务异常。 配置信息应通过入参等方式导入容器中,以免重启后配置丢失。 环境变量支持如下几种方式设置。 自定义:自行填写变量名称及变量值。 配置项导入:将配置项中所有键值都导入为环境变量。 配置项键值导入:将配置项中某个键的值导入作为某个环境变量的值。例如将configmap-example这个配置项中configmap_key的值configmap_value导入为环境变量key1的值,导入后容器中有一个名为key1的环境变量,其值为configmap_value。 密钥导入:将密钥中所有键值都导入为环境变量。 密钥键值导入:将密钥中某个键的值导入作为某个环境变量的值。例如将secret-example这个配置项中secret_key的值secret_value导入为环境变量key2的值,导入后容器中有一个名为key2的环境变量,其值为secret_value。 变量引用:用Pod定义的字段作为环境变量的值,例如Pod的名称。 资源引用:用Container定义的字段作为环境变量的值,例如容器的CPU限制。
  • YAML样例 apiVersion: apps/v1kind: Deploymentmetadata: name: env-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: env-example template: metadata: labels: app: env-example spec: containers: - name: container-1 image: nginx:alpine imagePullPolicy: Always resources: requests: cpu: 250m memory: 512Mi limits: cpu: 250m memory: 512Mi env: - name: key # 自定义 value: value - name: key1 # 配置项键值导入 valueFrom: configMapKeyRef: name: configmap-example key: key1 - name: key2 # 密钥键值导入 valueFrom: secretKeyRef: name: secret-example key: key2 - name: key3 # 变量引用,用Pod定义的字段作为环境变量的值 valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name - name: key4 # 资源引用,用Container定义的字段作为环境变量的值 valueFrom: resourceFieldRef: containerName: container1 resource: limits.cpu divisor: 1 envFrom: - configMapRef: # 配置项导入 name: configmap-example - secretRef: # 密钥导入 name: secret-example imagePullSecrets: - name: default-secret
  • 使用镜像 通过U CS 管理的集群及联邦,均支持使用镜像仓库创建工作负载。镜像上传成功后,在集群中创建工作负载时可选择“镜像创建”,以UCS接管的CCE集群为例,具体操作如下: 登录集群控制台。 在新页面的左侧导航栏中选择“工作负载”,然后单击右上角“镜像创建”按钮。 在“基本信息”栏输入工作负载参数,以创建无状态工作负载为例。 负载类型:无状态工作负载。 负载名称:负载名称可自定义。 实例数量:请根据业务需要自行选择。 描述:请输入描述信息。 时区同步:选择是否开启时区同步。开启后容器与节点使用相同时区(时区同步功能依赖容器中挂载的本地磁盘,请勿修改删除)。 在“容器配置”栏单击“选择镜像”。 在“我的镜像”页签下,选择已上传的镜像,单击“确定”。 如所选镜像为公开镜像,无需选取“镜像访问凭证”。 如所选镜像为用户在镜像仓库中上传的私有镜像,需选取“镜像访问凭证”,否则无法拉取成功。 单击“创建密钥”,可创建镜像仓库的镜像访问凭证,具体操作参见创建镜像密钥。 图2 容器配置 单击“创建工作负载”,完成创建。如您想了解更多创建工作负载的步骤,请参见无状态负载。
  • 产品功能 镜像全生命周期管理 容器镜像服务 支持镜像的全生命周期管理,包括镜像的上传、下载、删除等。 私有镜像仓库 容器 镜像服务 提供私有镜像库,并支持细粒度的权限管理,可以为不同用户分配相应的访问权限(读取、编辑、管理)。 镜像加速 容器镜像服务通过华为自主专利的镜像下载加速技术,使CCE集群下载镜像时在确保高并发下能获得更快的下载速度。 镜像仓库触发器 容器镜像服务支持容器镜像版本更新自动触发部署。您只需要为镜像设置一个触发器,通过触发器,可以在每次镜像版本更新时,自动更新使用该镜像部署的应用。 镜像安全扫描(通过集成 容器安全 HSS)
  • 基本信息 策略类型:合规 推荐级别:L1 生效资源类型:* 参数: labels: 键值对数组,key/ allowedRegex key: a8r.io/owner # Matches email address or github user allowedRegex: ^([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}|[a-z]{1,39})$
  • 策略实例示例 以下策略实例展示了策略定义生效的资源类型。 apiVersion: constraints.gatekeeper.sh/v1beta1kind: K8sPSPFSGroupmetadata: name: psp-fsgroupspec: match: kinds: - apiGroups: [""] kinds: ["Pod"] parameters: rule: "MayRunAs" #"MustRunAs" #"MayRunAs", "RunAsAny" ranges: - min: 1 max: 1000
  • 符合策略实例的资源定义 示例中fsGroup设为了500,符合策略实例。 apiVersion: v1kind: Podmetadata: name: fsgroup-disallowedspec: securityContext: fsGroup: 500 # directory will have group ID 500 volumes: - name: fsgroup-demo-vol emptyDir: {} containers: - name: fsgroup-demo image: busybox command: ["sh", "-c", "sleep 1h"] volumeMounts: - name: fsgroup-demo-vol mountPath: /data/demo
  • 不符合策略实例的资源定义 示例中fsGroup设为了2000,不符合策略实例。 apiVersion: v1kind: Podmetadata: name: fsgroup-disallowedspec: securityContext: fsGroup: 2000 # directory will have group ID 2000 volumes: - name: fsgroup-demo-vol emptyDir: {} containers: - name: fsgroup-demo image: busybox command: [ "sh", "-c", "sleep 1h" ] volumeMounts: - name: fsgroup-demo-vol mountPath: /data/demo
  • 策略实例示例 以下策略实例展示了策略定义生效的资源类型,parameters的allowedProfiles字段定义了允许的值列表。 apiVersion: constraints.gatekeeper.sh/v1beta1kind: K8sPSPAppArmormetadata: name: psp-apparmorspec: match: kinds: - apiGroups: [""] kinds: ["Pod"] parameters: allowedProfiles: - runtime/default
  • 不符合策略实例的资源定义 示例中apparmor的值不在上述定义的允许范围内,不符合策略实例。 apiVersion: v1kind: Podmetadata: name: nginx-apparmor-disallowed annotations: # apparmor.security.beta.kubernetes.io/pod: unconfined # runtime/default container.apparmor.security.beta.kubernetes.io/nginx: unconfined labels: app: nginx-apparmorspec: containers: - name: nginx image: nginx
  • 策略实例示例 示例配置了CPU和内存的最大Request。 apiVersion: constraints.gatekeeper.sh/v1beta1kind: K8sContainerRequestsmetadata: name: container-must-have-requestsspec: match: kinds: - apiGroups: [""] kinds: ["Pod"] parameters: cpu: "200m" memory: "1Gi"
  • 不符合策略实例的资源定义 内存的Request大于约束的最大值,不符合策略实例。 apiVersion: v1kind: Podmetadata: name: opa-disallowed labels: owner: me.agilebank.demospec: containers: - name: opa image: openpolicyagent/opa:0.9.2 args: - "run" - "--server" - "--addr=localhost:8080" resources: requests: cpu: "100m" memory: "2Gi"
  • 策略实例示例 以下策略实例展示了策略定义生效的资源类型,parameters中指定了提示信息message以及label的约束定义。 apiVersion: constraints.gatekeeper.sh/v1beta1kind: K8sRequiredLabelsmetadata: name: all-must-have-ownerspec: match: kinds: - apiGroups: [""] kinds: ["Namespace"] parameters: message: "All namespaces must have an `owner` label that points to your company username" labels: - key: owner allowedRegex: "^[a-zA-Z]+.agilebank.demo$"
  • 符合策略实例的资源定义 示例中apparmor的值在上述定义的允许范围内,符合策略实例。 apiVersion: v1kind: Podmetadata: name: nginx-apparmor-allowed annotations: # apparmor.security.beta.kubernetes.io/pod: unconfined # runtime/default container.apparmor.security.beta.kubernetes.io/nginx: runtime/default labels: app: nginx-apparmorspec: containers: - name: nginx image: nginx
  • 符合策略实例的资源定义 CPU和内存的Request小于配置的最大值,符合策略实例。 apiVersion: v1kind: Podmetadata: name: opa-allowed labels: owner: me.agilebank.demospec: containers: - name: opa image: openpolicyagent/opa:0.9.2 args: - "run" - "--server" - "--addr=localhost:8080" resources: requests: cpu: "100m" memory: "1Gi"
  • 符合策略实例的资源定义 示例中ClusterRole的生效对象中没有endpoints,符合策略实例。 apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: annotations: rbac.authorization.kubernetes.io/autoupdate: "true" creationTimestamp: null labels: kubernetes.io/bootstrapping: rbac-defaults rbac.authorization.k8s.io/aggregate-to-edit: "true" name: system:aggregate-to-editrules:- apiGroups: - "" resources: - pods/attach - pods/exec - secrets - services/proxy verbs: - get - list - watch
  • 操作步骤 登录UCS控制台,在左侧导航栏中选择“容器舰队”。 单击多云集群选项卡中的“注册集群”按钮。 参考下表填写待添加集群的基础信息,其中带“*”的参数为必填参数。 表1 注册集群基础信息配置 参数 参数说明 集群类型* 选择“多云集群” 云资源提供商* 选择“AWS” 集群名称* 输入集群的自定义名称,需以小写字母开头,由小写字母、数字、中划线(-)组成,且不能以中划线(-)结尾。 所属区域* 选择集群所在的区域,为对应的AWS的Region。请确保所选Region下的资源配额充足。 集群版本* 选择“1.23” 高可用* 选择“是”。系统将自动创建3个EC2作为集群控制节点。 集群标签 非必填项,以键值对的形式为集群添加标签,可以通过标签实现集群的分类。键值对可自定义,以字母或者数字开头和结尾,由字母、数字、连接符(-)、下划线(_)、点号(.)组成,且63个字符之内。 容器舰队 选择集群所属的舰队。 舰队用于权限精细化管理,一个集群只能加入一个舰队。若不选择舰队,集群注册成功后将显示在“未加入舰队的集群”页签下,后续还可以再添加至舰队中。 不支持在注册集群阶段选择已开通集群联邦能力的舰队,如果一定要加入这个舰队,请在集群注册成功后,再添加到该舰队中。关于集群联邦的介绍,请参见开通集群联邦章节。 如需新建舰队,请参见管理容器舰队。 访问密钥ID* AWS IAM 处获取的访问密钥ID,即AccessKeyID。 私有访问密钥* AWS IAM处获取的私有访问密钥,即SecretAccessKey。 容器网段* 创建的Kubernetes集群的容器网段。 服务网段 创建的Kubernetes集群的服务网段。 单击“确定”,集群注册成功后,等待自动接入。
  • 策略实例示例 以下策略实例展示了策略定义生效的资源类型。 apiVersion: constraints.gatekeeper.sh/v1beta1kind: K8sBlockEndpointEditDefaultRolemetadata: name: block-endpoint-edit-default-rolespec: match: kinds: - apiGroups: ["rbac.authorization.k8s.io"] kinds: ["ClusterRole"]
  • 策略实例示例 以下策略实例定义容器镜像必须以“openpolicyagent/”开头。 apiVersion: constraints.gatekeeper.sh/v1beta1kind: K8sAllowedReposmetadata: name: repo-is-openpolicyagentspec: match: kinds: - apiGroups: [""] kinds: ["Pod"] namespaces: - "default" parameters: repos: - "openpolicyagent/"
  • 策略实例示例 apiVersion: constraints.gatekeeper.sh/v1beta1kind: K8sBlockLoadBalancermetadata: name: block-load-balancerspec: match: kinds: - apiGroups: [""] kinds: ["Service"] excludedNamespaces: - "ingress-nginx-private" - "ingress-nginx-public"
  • 不符合策略实例的资源定义 示例中ClusterRole的生效对象中有endpoints,不符合策略实例。 kind: ClusterRolemetadata: annotations: rbac.authorization.kubernetes.io/autoupdate: "true" creationTimestamp: null labels: kubernetes.io/bootstrapping: rbac-defaults rbac.authorization.k8s.io/aggregate-to-edit: "true" name: system:aggregate-to-editrules:- apiGroups: - apps resources: - endpoints verbs: - create - delete - deletecollection - patch - update
  • 查看集群内Pod详情 在Pod列表中,单击需要查看详情的实例名称,进入该实例的详情页面,通过切换“概览”、“容器列表”和“监控”页签查看相应内容。 表1 Pod详情页面 词条 词条描述 概览 单击实例名称,进入实例概览页。 资源概况:Pod状态、容器数量(异常/总数)以及异常事件。 监控概览:包括CPU使用率、内存使用率和网络流入/流出速率这些常见的监控指标。 图2 资源概况和监控概览 容器使用趋势:包括Pod中各容器的CPU使用率、CPU使用量、内存使用率和内存使用量(在图表左上角切换对应指标),并且支持查看降序Top5和升序Top5数据(在图表右上角进行切换)。 图3 容器使用趋势 容器列表 容器列表中包含了容器名称、状态、命名空间、重启次数,以及镜像等详细信息。 您可以通过在列表上方按照容器名称、状态和命名空间进行筛选,快速找到需要的容器。 在列表的右上角,您可以单击按钮来导出全部容器数据,或者选择部分容器进行导出,此时仅导出所选中的数据。导出的文件为“.xlsx”格式,文件命名中包含时间戳。 监控 在此处,您可以方便地查看实例在近1小时、近8小时、近24小时以及自定义时间段内各维度资源的使用情况。 如需查看更多监控信息,请单击“查看全部仪表盘”,跳转至“仪表盘”页面,相应指导请参见仪表盘。
  • 查看集群内Pod列表 容器组列表中包含实例名称、状态、命名空间、实例IP、所在节点、重启次数、CPU申请/限制、内存申请/限制、CPU使用率,以及内存使用率等信息。 图1 Pod列表页面 您可以利用页面左上方的命名空间,以及列表上方的实例名称、状态、实例IP和所在节点进行筛选,快速定位所需的实例。 在列表的右上角,您可以单击按钮来导出全部实例数据,或者选择部分实例进行导出,此时仅导出所选中的数据。导出的文件为“.xlsx”格式,文件命名中包含时间戳。
共100000条