华为云用户手册

  • 使用Volume挂载凭据 创建ServiceAccount。 创建ServiceAccount对象,其中声明了允许业务使用的凭据名称,若用户引用了未在此处声明的凭据,则挂载失败,最终导致Pod无法运行。 根据如下模板创建serviceaccount.yaml,在cce.io/dew-resource字段中声明允许业务使用的凭据名称。这里声明了secret_1和secret_2,表示允许业务引用这两个凭据对象。在后续的操作中,若用户在业务中引用了secret_3,则无法通过校验,从而导致无法正常挂载该凭据,最终业务Pod将无法运行。 apiVersion: v1 kind: ServiceAccount metadata: name: nginx-spc-sa annotations: cce.io/dew-resource: "[\"secret_1\",\"secret_2\"]" #secrets that allow pod to use 这里需要明确,此处声明的凭据应确保在凭据管理服务中是存在的,如下图所示。否则,即使通过了校验,最终向凭据管理服务中获取相应凭据的时候也会出错,从而导致Pod无法正常运行。 执行如下命令创建ServiceAccount对象。 kubectl apply -f serviceaccount.yaml 查看ServiceAccount对象是否已经正常创建,如下所示: $ kubectl get sa NAME SECRETS AGE default 1 18d # 此为系统默认的ServiceAccount对象 nginx-spc-sa 1 19s # 此为刚刚创建的ServiceAccount对象 至此,一个名为“nginx-spc-sa”的ServiceAccount对象已正常创建。该对象将在后续的业务Pod中被引用。 创建SecretProviderClass。 SecretProviderClass对象用于描述用户感兴趣的凭据信息(比如指定凭据的版本、凭据的名称等),由用户创建,并在业务Pod中进行引用。 根据如下模板创建secretproviderclass.yaml。用户主要关注parameters.objects字段,它是一个数组,用于声明用户想要挂载的凭据信息。 apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: spc-test spec: provider: cce # 固定为cce parameters: objects: | - objectName: "secret_1" objectVersion: "v1" objectType: "csms" 参数 参数类型 是否必选 参数说明 objectName String 是 凭据名称,需填写ServiceAccount中引用的凭据。若同一个SecretProviderClass中定义了多个objectName,不允许重名,否则会挂载失败。 objectAlias String 否 凭据写入到容器内的文件名称。若不指定,则凭据写入到容器内的文件名默认为objectName;若指定,则objectAlias与其他凭据的objectName和objectAlias均不允许重名,与自身的objectName也不允许重名,否则会挂载失败。 objectType String 是 凭据类型。当前仅支持”csms”类型,其他均为非法输入。 objectVersion String 是 凭据的版本。 指定某个具体的版本:v1,v2,… 指定最新版本:latest。当指定objectVersion为” latest”时,若在云凭据管理服务侧对应的凭据发生了更新,更新后的凭据值将在经过一定时间间隔后(即rotation_poll_interval)刷新至Pod内。 执行如下命令创建SecretProviderClass对象。 kubectl apply -f secretproviderclass.yaml 查看SecretProviderClass对象是否已经正常创建,如下所示: $ kubectl get spc NAME AGE spc-test 20h 至此,一个名为“spc-test”的SecretProviderClass对象已正常创建。该对象将在后续的业务Pod中被引用。 创建业务Pod。 这里以创建一个nginx应用为例。 定义业务负载,在serviceAccountName中引用此前创建好的ServiceAccount对象,secretProviderClass中引用此前创建好的SPC对象,并在mountPath中指定容器内的挂载路径(这里需注意,用户不应该指定”/”,” /var/run”等特殊目录,否则可能影响容器的正常启动)。 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-spc labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: serviceAccountName: nginx-spc-sa # 引用上面创建的ServiceAccount volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "spc-test" # 引用上面创建的SPC containers: - name: nginx-spc image: nginx:alpine imagePullPolicy: IfNotPresent volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" # 定义容器内凭据的挂载路径 readOnly: true imagePullSecrets: - name: default-secret 创建业务Pod。 kubectl apply -f deployment.yaml 查看Pod是否已经正常创建,如下所示: $ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-spc-67c9d5b594-642np 1/1 Running 0 20s 进入容器,查看指定的凭据是否正常写入。如下所示: $ kubectl exec -ti nginx-spc-67c9d5b594-642np -- /bin/bash root@nginx-spc-67c9d5b594-642np:/# root@nginx-spc-67c9d5b594-642np:/# cd /mnt/secrets-store/ root@nginx-spc-67c9d5b594-642np:/mnt/secrets-store# root@nginx-spc-67c9d5b594-642np:/mnt/secrets-store# ls secret_1 可以看到,用户在SPC对象中声明的secret_1已正常写入Pod。 此外,还可以通过获取spcPodStatus查看Pod与凭据的绑定情况。如下所示: $ kubectl get spcps NAME AGE nginx-spc-67c9d5b594-642np-default-spc-test 103s $ kubectl get spcps nginx-spc-67c9d5b594-642np-default-spc-test -o yaml ...... status: mounted: true objects: # 挂载的凭据信息 - id: secret_1 version: v1 podName: nginx-spc-67c9d5b594-642np # 引用了SPC对象的Pod secretProviderClassName: spc-test # SPC对象 targetPath: /mnt/paas/kubernetes/kubelet/pods/6dd29596-5b78-44fb-9d4c-a5027c420617/volumes/kubernetes.io~csi/secrets-store-inline/mount
  • 使用密钥挂载凭据 CCE密钥管理(dew-provider)插件版本要求1.1.1及以上。 创建ServiceAccount。 创建ServiceAccount对象,其中声明了允许业务使用的凭据名称,若用户引用了未在此处声明的凭据,则挂载失败,最终导致Pod无法运行。 根据如下模板创建serviceaccount.yaml,在cce.io/dew-resource字段中声明允许业务使用的凭据名称。这里声明了secret_1和secret_2,表示允许业务引用这两个凭据对象。在后续的操作中,若用户在业务中引用了secret_3,则无法通过校验,从而导致无法正常挂载该凭据,最终业务Pod将无法运行。 apiVersion: v1 kind: ServiceAccount metadata: name: nginx-spc-sa annotations: cce.io/dew-resource: "[\"secret_1\",\"secret_2\"]" #secrets that allow pod to use 这里需要明确,此处声明的凭据应确保在凭据管理服务中是存在的,如下图所示。否则,即使通过了校验,最终向凭据管理服务中获取相应凭据的时候也会出错,从而导致Pod无法正常运行。 执行如下命令创建ServiceAccount对象。 kubectl apply -f serviceaccount.yaml 查看ServiceAccount对象是否已经正常创建,如下所示: $ kubectl get sa NAME SECRETS AGE default 1 18d # 此为系统默认的ServiceAccount对象 nginx-spc-sa 1 19s # 此为刚刚创建的ServiceAccount对象 至此,一个名为“nginx-spc-sa”的ServiceAccount对象已正常创建。该对象将在后续的业务Pod中被引用。 创建SecretProviderClass。 根据如下模板创建secretproviderclass.yaml。 apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: nginx-deployment-spc-k8s-secrets spec: provider: cce parameters: # 引用凭据管理服务中的凭据 objects: | - objectName: "secret_1" objectType: "csms" objectVersion: "latest" jmesPath: - path: username objectAlias: dbusername - path: password objectAlias: dbpassword # 根据凭据中的内容创建密钥,然后在Pod中进行挂载使用 secretObjects: - secretName: my-secret-01 type: Opaque data: - objectName: dbusername key: db_username_01 - objectName: dbpassword key: db_password_01 表2 objects参数说明 参数 参数类型 是否必选 参数说明 objectName String 是 凭据名称,需填写ServiceAccount中引用的凭据。若同一个SecretProviderClass中定义了多个objectName,不允许重名,否则会挂载失败。 objectType String 是 凭据类型。当前仅支持“csms”类型,其他均为非法输入。 objectVersion String 是 凭据的版本。 指定某个具体的版本:v1,v2,… 指定最新版本:latest。当指定objectVersion为” latest”时,若在云凭据管理服务侧对应的凭据发生了更新,更新后的凭据值将在经过一定时间间隔后(即rotation_poll_interval)刷新至Pod内。 jmesPath Array of Object 是 jmesPath是一种从json格式的对象中提取key-value的工具,CCE密钥管理插件使用该工具支持Secret挂载功能。 path:填写DEW服务凭据中的key,其中key不能带有+、-、{}、()等特殊符号。 objectAlias:挂载到Pod中的文件名,该值需要和secretObjects中定义的objectName保持一致。 表3 secretObjects参数说明 参数 参数类型 是否必选 参数说明 secretName String 是 密钥名称。 type String 是 密钥类型。 data Array of Object 是 objectName:挂载到Pod中的文件名,该值需要和objects中定义的objectAlias保持一致。 key:密钥中的key,在Pod中可使用key值对加密内容进行引用。 执行如下命令创建SecretProviderClass对象。 kubectl apply -f secretproviderclass.yaml 查看SecretProviderClass对象是否已经正常创建,如下所示: $ kubectl get spc NAME AGE nginx-deployment-spc-k8s-secrets 20h 创建业务Pod。这里以创建一个nginx应用为例。 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-k8s-secrets labels: app: nginx-k8s-secrets spec: replicas: 1 selector: matchLabels: app: nginx-k8s-secrets template: metadata: labels: app: nginx-k8s-secrets spec: serviceAccountName: nginx-spc-sa # 引用上面创建的ServiceAccount containers: - name: nginx-deployment-k8s-secrets image: nginx volumeMounts: # 在容器中挂载密钥 - name: secrets-store-inline # 需要挂载的volume名称 mountPath: "/mnt/secrets" # 需要挂载的容器路径 readOnly: true env: # 在环境变量中引用密钥 - name: DB_USERNAME_01 # 工作负载中的变量名 valueFrom: secretKeyRef: name: my-secret-01 # SPC中定义的密钥名称 key: db_username_01 # SPC中定义的密钥key值 - name: DB_PASSWORD_01 valueFrom: secretKeyRef: name: my-secret-01 key: db_password_01 imagePullSecrets: - name: default-secret volumes: # 使用SPC中定义的密钥创建volume - name: secrets-store-inline # 自定义的volume名称 csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: nginx-deployment-spc-k8s-secrets # 上一步中创建的SPC名称 验证结果。 $ kubectl get secrets NAME TYPE DATA AGE default-secret kubernetes.io/dockerconfigjson 1 33d my-secret-01 Opaque 2 1h 结果表明已使用SPC对象中声明的凭据secret_1创建一个密钥my-secret-01。
  • 插件说明 基础挂载能力:安装完该插件后,通过创建SecretProviderClass对象,在业务Pod中声明Volume并进行引用,当启动Pod时,就会将在SecretProviderClass对象中声明的凭据信息挂载至Pod内。 定时轮转能力:当Pod正常运行后,若其在SPC中声明的、存储在云凭据管理服务中的凭据发生了更新,通过定时轮转,可以将最新的凭据值刷新至Pod内。使用该能力时,需要将凭据的版本指定为”latest”。 实时感知SPC变化能力:当Pod正常运行后,若用户修改了在SPC中声明的凭据信息(如新增凭据、改变原有凭据的版本号等),插件可实时感知该变化,并将更新后的凭据刷新至Pod内。
  • 约束与限制 数据加密 服务包含密钥管理(Key Management Service, KMS)、云凭据管理(Cloud Secret Management Service, CS MS)和密钥对管理(Key Pair Service, KPS)等服务。当前,该插件仅支持对接其中的云凭据管理服务。 支持的集群版本:v1.19+。 支持的集群类型:CCE Standard集群和 CCE Turbo 集群。 允许创建的SecretProviderClass对象个数上限:500个。 插件卸载时,会同时删除相关的CRD资源。即使重装插件,原有的SecretProviderClass对象也不可用,请谨慎操作。插件卸载再重装后,若需使用原有的SecretProviderClass资源,需重新手动创建。
  • 组件说明 表1 dew-provider组件 容器组件 说明 资源类型 dew-provider dew-provider负责与云凭据管理服务交互,从云凭据管理服务中获取指定的凭据,并挂载到业务Pod内。 DaemonSet secrets-store-csi-driver secrets-store-csi-driver负责维护两个CRD资源,即SecretProviderClass(以下简称为SPC)和SecretProviderClassPodStatus(以下简称为spcPodStatus),其中SPC用于描述用户感兴趣的凭据信息(比如指定凭据的版本、凭据的名称等),由用户创建,并在业务Pod中进行引用;spcPodStatus用于跟踪Pod与凭据的绑定关系,由csi-driver自动创建,用户无需关心。一个Pod对应一个spcPodStatus,当Pod正常启动后,会生成一个与之对应的spcPodStatus;当Pod生命周期结束时,相应的spcPodStatus也会被删除。 DaemonSet
  • 安装插件 登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件中心”,在右侧找到CCE密钥管理(对接DEW)插件,单击“安装”。 在安装插件页面,在参数配置栏进行参数配置。参数配置说明如下。 参数 参数说明 rotation_poll_interval 轮转时间间隔。单位:分钟,即m(注意不是min)。 轮转时间间隔表示向云凭据管理服务发起请求并获取最新的凭据的周期,合理的时间间隔范围为[1m, 1440m],默认值为2m。 单击“安装”。 待插件安装完成后,选择对应的集群,然后单击左侧导航栏的“插件中心”,可在“已安装插件”页签中查看相应的插件。
  • 约束限制 当且仅当CCE集群状态为运行中或不可用时允许移除节点。 当且仅当CCE节点状态为运行中、不可用或错误时允许被移除。 为使CCE节点正常移除,且移除后能正常重装操作系统清理CCE组件,请确保服务器处于正常运行中状态。 若节点在CCE集群移除后重装操作系统失败,请手动完成失败节点的操作系统重装,并在重装后登录节点执行清理脚本完成CCE组件清理,具体步骤参见重装操作系统失败如何处理。 移除节点会导致与节点关联的本地持久卷类型的PVC/PV数据丢失,无法恢复,且PVC/PV无法再正常使用。移除节点时使用了本地持久存储卷的Pod会从移除的节点上驱逐,并重新创建Pod,Pod会一直处于pending状态,因为Pod使用的PVC带有节点标签,由于冲突无法调度成功。 从集群移除节点时,节点会被重置,等保加固将会失效。
  • 操作步骤 下面介绍如何开启或关闭出口网络带宽保障。 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“节点管理”,选择“节点池”页签,创建或更新节点池时在“高级配置”中添加以下标签。 volcano.sh/oversubscription=true volcano.sh/colocation=true 图1 节点标签设置 在左侧导航栏中选择“插件中心”,单击Volcano插件下的“安装”,并在“参数配置”中开启“在离线业务混部”。具体安装步骤请参见Volcano调度器。 如已安装Volcano插件,可单击“编辑”查看或修改配置。 图2 开启在离线业务混部 CPU Burst开关由打开到关闭时,已经设置CPU Burst的存量Pod不会关闭CPU Burst功能,关闭CPU Burst仅针对新建的Pod生效。 (可选)调整出口网络带宽保障参数。 确认Volcano插件处于正常运行状态后,可执行以下命令,编辑kube-system命名空间下名称为volcano-agent-configuration的configmap参数,将enable参数设置为true即可开启出口网络带宽保障(默认开启),同时可调整出口网络带宽保障参数。 kubectl edit configmap -nkube-system volcano-agent-configuration 示例如下: ... data: colocation-config: | { "globalConfig":{ "cpuBurstConfig":{ "enable":true }, "networkQosConfig":{ "enable":true, "onlineBandwidthWatermarkPercent":80, "offlineLowBandwidthPercent":10, "offlineHighBandwidthPercent":40 }, ... 参数编辑后会对集群中所有Huawei Cloud EulerOS 2.0操作系统的节点生效。 表1 networkQosConfig参数说明 名称 说明 默认值 配置范围 enable 是否开启出口网络带宽保障特性。 true true或false onlineBandwidthWatermarkPercent 在线业务总带宽水线值与机型的基准带宽的比值,即: 在线业务总带宽水线值 = 节点机型基准带宽 * onlineBandwidthWatermarkPercent/100 80 配置有效值范围:1-1000 说明: 由于实际的网络环境可能优于基准带宽,处于在基准带宽和最大带宽之间,因此配置范围支持大于100。 offlineLowBandwidthPercent 在线业务带宽使用超过水线时,离线业务最高总带宽占用量在机型基准带宽中的占比。 如果同节点的在线业务总带宽的超过节点机型基准带宽 * onlineBandwidthWatermarkPercent/100 ,则同节点的离线业务总带宽的不超过节点机型基准带宽 * offlineLowBandwidthPercent/100 10 offlineHighBandwidthPercent 在线业务带宽使用未超过水线时,离线业务最高总带宽占用量在机型基准带宽中的占比。 如果同节点的在线业务总带宽的未超过节点机型基准带宽 * onlineBandwidthWatermarkPercent/100,则同节点的离线业务总带宽的不超过节点机型基准带宽 * offlineHighBandwidthPercent/100 40 图3 出口网络带宽保障示例图 上图中,当在线业务带宽低于在线业务水线时,离线业务的带宽阈值处于一个相对较高的水平,即表示允许离线业务占用一定的带宽;当在线业务带宽超过在线业务水线时,则会相应地调低离线业务带宽阈值,以降低离线业务占用的带宽,预留出更多的带宽供在线业务使用。 如需关闭出口网络带宽保障特性,请确认Volcano插件处于正常运行状态,然后编辑kube-system命名空间下名称为volcano-agent-configuration的configmap参数,将enable参数设置为false即可。 kubectl edit configmap -nkube-system volcano-agent-configuration 修改参数如下: ... data: colocation-config: | { "globalConfig":{ "cpuBurstConfig":{ "enable":true }, "networkQosConfig":{ "enable":false, "onlineBandwidthWatermarkPercent":80, "offlineLowBandwidthPercent":10, "offlineHighBandwidthPercent":40 }, ...
  • 约束与限制 使用出口网络带宽保障特性需满足以下要求: 仅支持Huawei Cloud EulerOS 2.0操作系统的节点。 仅支持CCE Turbo集群,且集群版本为v1.23及以上。 集群中需要安装Volcano 1.9.0及以上版本的插件,且开启混合部署开关(即将插件高级配置中的colocation_enable设置为true)。 开启、修改或者关闭出口网络带宽保障特性,均需要保证Volcano插件处于正常运行状态。 对于安装Volcano插件之前节点上已运行的Pod,开启网络带宽保障后需要手动重启Pod才可生效。 卸载Volcano插件或关闭混合部署开关(即将插件高级配置中的colocation_enable设置为false)不会影响节点上已有的出口网络带宽保障设置。如需关闭该特性,请参见关闭出口网络带宽保障。 使用带宽限速有可能造成协议栈缓存积压。对于UDP等无反压机制的协议场景,可能出现有丢包、ENOBUFS等问题。 使用带宽限速会增加离线业务得不到带宽的风险,极端场景可能会出现业务因为带宽不足异常、Pod健康检查失败等问题。 出口网络带宽保障的例外场景: 当混部的在线Pod或者是离线Pod使用了网络带宽限速功能时,网络带宽限速功能的优先级会高于当前功能。 当Pod使用节点网络(hostNetwork)时,使用出口网络保障功能无法生效。
  • 动态创建对象存储卷时指定挂载密钥 动态创建对象存储卷时,可通过如下方法指定挂载密钥。 新建一个pvc的yaml文件,如pvc-example.yaml。 apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: csi.storage.k8s.io/node-publish-secret-name: test-user csi.storage.k8s.io/node-publish-secret-namespace: default everest.io/obs-volume-type: STANDARD csi.storage.k8s.io/fstype: obsfs name: obs-secret namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: csi-obs 参数 描述 csi.storage.k8s.io/node-publish-secret-name 指定secret的名字 csi.storage.k8s.io/node-publish-secret-namespace 指定secret的命令空间 创建PVC。 kubectl create -f pvc-example.yaml PVC创建后,就可以创建工作负载挂载PVC使用存储。
  • 配置验证 根据上述步骤,使用 IAM 用户的密钥挂载对象存储卷。假设工作负载名称为obs-secret,容器内挂载目录是/temp,IAM用户权限为CCE ReadOnlyAccess和Tenant Guest。 查询工作负载实例名称。 kubectl get po | grep obs-secret 期望输出: obs-secret-5cd558f76f-vxslv 1/1 Running 0 3m22s 查询挂载目录下对象,查询正常。 kubectl exec obs-secret-5cd558f76f-vxslv -- ls -l /temp/ 尝试在挂载目录内写入数据,写入失败。 kubectl exec obs-secret-5cd558f76f-vxslv -- touch /temp/test 期望输出: touch: setting times of '/temp/test': No such file or directory command terminated with exit code 1 参考桶策略配置,给挂载桶的子用户设置读写权限。 再次尝试在挂载目录内写入数据,写入成功。 kubectl exec obs-secret-5cd558f76f-vxslv -- touch /temp/test 查看容器内挂载目录,验证数据写入成功。 kubectl exec obs-secret-5cd558f76f-vxslv -- ls -l /temp/ 期望输出: -rwxrwxrwx 1 root root 0 Jun 7 01:52 test
  • 使用访问密钥创建Secret 获取访问密钥。 对访问密钥进行base64编码(假设上文获取到的ak为“xxx”,sk为“yyy”)。 echo -n xxx|base64 echo -n yyy|base64 记录编码后的AK和SK。 新建一个secret的yaml,如test-user.yaml。 apiVersion: v1 data: access.key: WE5WWVhVNU***** secret.key: Nnk4emJyZ0***** kind: Secret metadata: name: test-user namespace: default labels: secret.kubernetes.io/used-by: csi type: cfe/secure-opaque 其中: 参数 描述 access.key base64编码后的ak。 secret.key base64编码后的sk。 name secret的名称 namespace secret的命名空间 secret.kubernetes.io/used-by: csi 带上这个标签才能在控制台上创建OBS PV/PVC时可见。 type 密钥类型,该值必须为cfe/secure-opaque 使用该类型,用户输入的数据会自动加密。 创建Secret。 kubectl create -f test-user.yaml
  • 静态创建对象存储卷时指定挂载Secret 使用访问密钥创建Secret后,在创建PV时只需要关联上Secret,就可以使用Secret中的访问密钥(AK/SK)挂载对象存储卷。 登录OBS控制台,创建对象存储桶,记录桶名称和存储类型,以并行文件系统为例。 新建一个pv的yaml文件,如pv-example.yaml。 apiVersion: v1 kind: PersistentVolume metadata: name: pv-obs-example annotations: pv.kubernetes.io/provisioned-by: everest-csi-provisioner spec: accessModes: - ReadWriteMany capacity: storage: 1Gi csi: nodePublishSecretRef: name: test-user namespace: default driver: obs.csi.everest.io fsType: obsfs volumeAttributes: everest.io/obs-volume-type: STANDARD everest.io/region: cn-north-4 storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisioner volumeHandle: obs-normal-static-pv persistentVolumeReclaimPolicy: Delete storageClassName: csi-obs 参数 描述 nodePublishSecretRef 挂载时指定的密钥,其中 name:指定secret的名字 namespace:指定secret的命令空间 fsType 文件类型,支持“obsfs”与“s3fs”,取值为s3fs时创建是obs对象桶,配套使用s3fs挂载;取值为obsfs时创建的是obs并行文件系统,配套使用obsfs挂载,推荐使用。 volumeHandle 对象存储的桶名称。 创建PV。 kubectl create -f pv-example.yaml PV创建完成后,就可以创建PVC关联PV。 新建一个PVC的yaml文件,如pvc-example.yaml。 PVC yaml文件配置示例: apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: csi.storage.k8s.io/node-publish-secret-name: test-user csi.storage.k8s.io/node-publish-secret-namespace: default volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner everest.io/obs-volume-type: STANDARD csi.storage.k8s.io/fstype: obsfs name: obs-secret namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: csi-obs volumeName: pv-obs-example 参数 描述 csi.storage.k8s.io/node-publish-secret-name 指定secret的名字 csi.storage.k8s.io/node-publish-secret-namespace 指定secret的命令空间 创建PVC。 kubectl create -f pvc-example.yaml PVC创建后,就可以创建工作负载挂载PVC使用存储。
  • 通过控制台创建 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“服务”,在右上角单击“创建服务”。 设置Service参数。本示例中仅列举设置超时时间的必选参数,其余参数可根据需求参考创建LoadBalancer类型Service进行设置。 Service名称:自定义服务名称,可与工作负载名称保持一致。 访问类型:选择“负载均衡”。 选择器:添加标签,Service根据标签选择Pod,填写后单击“确认添加”。也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”。 负载均衡器:选择弹性负载均衡的类型、创建方式。 类型:“独享型”或“共享型”。 创建方式:本文中以选择已有ELB为例进行说明,关于自动创建的配置参数请参见表1。 端口配置: 协议:请选择协议,其中共享型ELB使用UDP协议时不支持设置超时时间。 服务端口:Service使用的端口,端口范围为1-65535。 容器端口:工作负载程序实际监听的端口,需用户确定。例如nginx默认使用80端口。 监听器前端协议:请选择监听器的协议。不启用HTTP/HTTPS协议时,仅支持设置空闲超时时间。 监听器配置: 高级配置:选择合适的超时时间进行设置。 配置 说明 使用限制 空闲超时时间 客户端连接空闲超时时间。在超过空闲超时时间一直没有请求, 负载均衡会暂时中断当前连接,直到下一次请求时重新建立新的连接。 共享型ELB实例的端口使用UDP协议时不支持此配置。 请求超时时间 等待客户端请求超时时间。包括两种情况: 读取整个客户端请求头的超时时长,如果客户端未在超时时长内发送完整个请求头,则请求将被中断。 两个连续body体的数据包到达LB的时间间隔,超出请求超时时间将会断开连接。 仅端口启用HTTP/HTTPS时支持配置。 响应超时时间 等待后端服务器响应超时时间。请求转发后端服务器后,在等待超过响应超时时间没有响应,负载均衡将终止等待,并返回 HTTP504错误码。 仅端口启用HTTP/HTTPS时支持配置。 图1 配置超时时间 单击“确定”,创建Service。
  • 约束与限制 支持设置超时时间的场景如下: 超时时间类型 支持的ELB类型 使用限制 支持的集群版本 空闲超时时间 独享型 - v1.19集群:v1.19.16-r30及以上版本 v1.21集群:v1.21.10-r10及以上版本 v1.23集群:v1.23.8-r10及以上版本 v1.25集群:v1.25.3-r10及以上版本 其他更高版本集群 空闲超时时间 共享型 不支持UDP协议。 v1.23集群:v1.23.13-r0及以上版本 v1.25集群:v1.25.8-r0及以上版本 v1.27集群:v1.27.5-r0及以上版本 v1.28集群:v1.28.3-r0及以上版本 其他更高版本的集群 请求超时时间 独享型、共享型 仅支持HTTP、HTTPS协议。 响应超时时间 独享型、共享型 仅支持HTTP、HTTPS协议。 配置超时时间后,如果您在CCE控制台删除超时时间配置或在YAML中删除对应的annotation,ELB侧的配置将会保留。
  • 指标清单 CoreDNS视图使用的指标清单如下: 表2 CoreDNS视图指标清单 指标 类型 说明 coredns_dns_request_count_total counter 记录所有请求查询的累计值 coredns_dns_requests_total counter DNS请求的总数 coredns_dns_request_type_count_total counter 每种类型的请求累计值 coredns_dns_request_do_count_total counter 设置了DO标志位的请求次数累计值 coredns_dns_do_requests_total counter 设置了DO标志位的请求总数 coredns_dns_request_size_bytes_bucket histogram CoreDNS请求字节数 coredns_dns_response_rcode_count_total counter 不同返回码个数的累计值 coredns_dns_responses_total counter 返回码的总数 coredns_dns_request_duration_seconds_bucket histogram CoreDNS请求时延 coredns_dns_response_size_bytes_bucket histogram CoreDNS返回字节数 coredns_cache_size gauge CoreDNS缓存大小 coredns_cache_hits_total counter CoreDNS缓存命中个数
  • 指标说明 CoreDNS视图暴露的指标如下: 图1 CoreDNS视图指标 表1 CoreDNS指标说明 指标名称 单位 说明 请求速率 个/秒 CoreDNS每秒请求个数 请求速率(记录类型) 个/秒 根据请求类型统计CoreDNS的请求速率 请求速率(区域) 个/秒 根据区域统计CoreDNS的请求速率 请求速率(DO标志位) 个/秒 设置了DO标志位的请求速率 请求数据包(UDP) 字节数 基于UDP协议的请求数据包的P99、P90、P50的大小 请求数据包(TCP) 字节数 基于TCP协议的请求数据包的P99、P90、P50的大小 响应速率(响应状态码) 个/秒 CoreDNS不同状态码每秒的请求数 响应时延 毫秒 CoreDNS P99、P90、P50的请求时延 响应数据包(UDP) 字节数 基于UDP协议的响应数据包的P99、P90、P50的大小 响应数据包(TCP) 字节数 基于TCP协议的响应数据包的P99、P90、P50的大小 缓存记录数 个 CoreDNS缓存的DNS记录数 缓存命中率 个/秒 CoreDNS缓存每秒的命中请求数
  • 操作场景 集群中的每一个节点对应一台云服务器,集群节点创建成功后,您仍可以根据需求,修改云服务器的名称或变更规格。由于规格变更对业务有影响,建议一台成功完成后再对下一台进行规格变更。 CCE节点的部分信息是独立于弹性 云服务器ECS 维护的,当您在ECS控制台修改云服务器的名称、弹性公网IP,以及变更计费方式或变更规格后,需要通过“同步云服务器”功能将信息同步到CCE控制台相应节点中,同步后信息将保持一致。 ECS常见信息修改如下: 修改节点名称请参见修改云服务器名称。 当您购买的节点规格无法满足业务需要时,可参考变更规格通用操作变更节点规格,升级vCPU、内存。
  • 开启节点故障检测 登录CCE控制台,单击集群名称进入集群。 在左侧选择“节点管理”,切换至“节点”页签,检查集群中是否已安装npd插件,或将其升级至最新版本。npd安装成功后,可正常使用故障检测策略功能。 npd运行正常时,单击“故障检测策略”,可查看当前故障检测项。关于NPD检查项列表请参见NPD检查项。 当前节点检查结果异常时,将在节点列表处提示“指标异常”。 您可单击“指标异常”,按照修复建议提示修复。
  • 自定义检查项配置 登录CCE控制台,单击集群名称进入集群。 在左侧选择“节点管理”,切换至“节点”页签,单击“故障检测策略”。 在跳转的页面中查看当前检查项配置,单击检查项操作列的“编辑”,自定义检查项配置。 当前支持以下配置: 启用/停用:自定义某个检查项的开启或关闭。 目标节点配置:检查项默认运行在全部节点,用户可根据特殊场景需要自定义修改故障阈值。例如竞价实例中断回收检查只运行在竞价实例节点。 触发阈值配置:默认阈值匹配常见故障场景,用户可根据特殊场景需要自定义修改故障阈值。例如调整“连接跟踪表耗尽”触发阈值由90%调整至80%。 检查周期:默认检查周期为30秒,可根据用户场景需要自定义修改检查周期。 故障应对策略:故障产生后,可根据用户场景自定义修改故障应对策略,当前故障应对策略如下: 表1 故障应对策略 故障应对策略 效果 提示异常 上报Kuberentes事件。 禁止调度 上报Kuberentes事件,并为节点添加NoSchedule污点。 驱逐节点负载 上报Kuberentes事件,并为节点添加NoExecute污点。该操作会驱逐节点上的负载,可能导致业务不连续,请谨慎选择。
  • 告警中心概述 云原生告警是可观测性体系里面比较重要的一环。在云原生告警中,除了传统的CPU、内存等资源使用量的告警以外,还有容器重启等事件告警、应用访问失败等自定义的监控指标告警。 CCE的云原生告警能力是由 AOM 服务提供的,支持指标和事件的告警。同时,CCE集群详情中增加了告警中心能力,能支持快速配置资源等常用告警和告警查看。 图1 告警中心架构 告警中心 基于AOM服务的告警能力实现,提供集群内的告警快速检索、告警快速配置的能力。用户可以通过告警中心一键配置常用的告警规则。 AOM服务 华为云 应用运维管理 服务,是云上应用的一站式立体化运维管理平台,是云上监控、告警的基础。 SMN 服务 华为云的 消息通知 服务,是云上应用发送告警或通知的依赖服务。在云原生场景中,在AOM服务触发的告警将通过SMN里面配置的短信、电子邮件、HTTP等方式发送。 父主题: 告警中心
  • 启用命名空间节点亲和 启用命名空间节点亲和后,命名空间下新创建的工作负载只能调度到拥有特定标签的节点上,详情请参见PodNodeSelector。 登录CCE控制台,单击集群名称进入集群,在左侧选择“命名空间”。 找到目标命名空间,单击“节点亲和”列的。 在弹出的窗口中,选择“启用”并单击“确定”。 启用后,命名空间下新创建的工作负载只能调度到拥有特定标签的节点上。例如,对于名为test的命名空间来说,该命名空间下的负载只能调度到添加了标签键为kubelet.kubernetes.io/namespace,值为test的节点上。 您可以在节点管理中通过“标签与污点管理”为节点添加上述指定标签,详情请参见管理节点标签。
  • 命名空间使用实践 按照不同环境划分命名空间 一般情况下,工作负载发布会经历开发环境、联调环境、测试环境,最后到生产环境的过程。这个过程中不同环境部署的工作负载相同,只是在逻辑上进行了定义。分为两种做法: 分别创建不同集群。 不同集群之间,资源不能共享。同时,不同环境中的服务互访需要通过负载均衡才能实现。 不同环境创建对应命名空间。 同个命名空间下,通过服务名称(Service name)可直接访问。跨命名空间的可以通过服务名称、命名空间名称访问。 例如下图,开发环境/联调环境/测试环境分别创建了命名空间。 图1 不同环境创建对应命名空间 按照应用划分命名空间 对于同个环境中,应用数量较多的情况,建议进一步按照工作负载类型划分命名空间。例如下图中,按照APP1和APP2划分不同命名空间,将不同工作负载在逻辑上当做一个工作负载组进行管理。且同一个命名空间内的工作负载可以通过服务名称访问,不同命名空间下的通过服务名称、命名空间名称访问。 图2 按照工作负载划分命名空间
  • 上传模板 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“应用模板”,在右上角单击“上传模板”。 单击“添加文件”,选中待上传的工作负载包后,单击“上传”。 图1 上传模板包 由于上传模板时创建OBS桶的命名规则由cce-charts-{region}-{domain_name}变为cce-charts-{region}-{domain_id},其中旧命名规则中的domain_name系统会做base64转化并取前63位,如果您在现有命名规则的OBS桶中找不到模板,请在旧命名规则的桶中进行查找。
  • 创建模板实例 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“应用模板”。 在“我的模板”页签中,单击目标模板下的“安装”。 参照表2设置安装工作负载参数。 表2 安装工作负载参数说明 参数 参数说明 实例名称 新建模板实例名称,命名必须唯一。 命名空间 指定部署的命名空间。 选择版本 选择模板的版本。 配置文件 用户可以导入values.yaml文件,导入后可替换模板包中的values.yaml文件;也可直接在配置框中在线编辑模板参数。 说明: 此处导入的values.yaml文件需符合yaml规范,即KEY:VALUE格式。对于文件中的字段不做任何限制。 导入的value.yaml的key值必须与所选的模板包的values.yaml保持一致,否则不会生效。即key不能修改。 单击“添加文件”。 选择对应的values.yaml文件,单击“打开”。 配置完成后,单击“安装”。 在“模板实例”页签下可以查看模板实例的安装情况。
  • Containerd和Docker组件常用命令对比 Containerd不支持dockerAPI和dockerCLI,但是可以通过cri-tool命令实现类似的功能。 表5 镜像相关功能 操作 Docker命令 Containerd命令 docker crictl ctr 列出本地镜像列表 docker images crictl images ctr -n k8s.io i ls 拉取镜像 docker pull crictl pull ctr -n k8s.io i pull 上传镜像 docker push 无 ctr -n k8s.io i push 删除本地镜像 docker rmi crictl rmi ctr -n k8s.io i rm 检查镜像 docker inspect crictl inspecti 无 表6 容器相关功能 操作 Docker命令 Containerd命令 docker crictl ctr 列出容器列表 docker ps crictl ps ctr -n k8s.io c ls 创建容器 docker create crictl create ctr -n k8s.io c create 启动容器 docker start crictl start ctr -n k8s.io run 停止容器 docker stop crictl stop 无 删除容器 docker rm crictl rm ctr -n k8s.io c del 连接容器 docker attach crictl attach 无 进入容器 docker exec crictl exec 无 查看容器详情 docker inspect crictl inspect ctr -n k8s.io c info 查看容器日志 docker logs crictl logs 无 查看容器的资源使用情况 docker stats crictl stats 无 更新容器资源限制 docker update crictl update 无 表7 Pod相关功能 操作 Docker命令 Containerd命令 docker crictl ctr 列出Pod列表 无 crictl pods 无 查看Pod详情 无 crictl inspectp 无 启动Pod 无 crictl start 无 运行Pod 无 crictl runp 无 停止Pod 无 crictl stopp 无 删除Pod 无 crictl rmp 无 Containerd创建并启动的容器会被kubelet立即删除,不支持暂停、恢复、重启、重命名、等待容器,Containerd不具备docker构建、导入、导出、比较、推送、查找、打标签镜像的能力,Containerd不支持复制文件,可通过修改containerd的配置文件实现登录镜像仓库。
  • 节点操作系统与容器引擎对应关系 v1.23及以上的VPC网络集群都支持Containerd,容器隧道网络集群从v1.23.2-r0开始支持Containerd。 表2 CCE集群节点操作系统与容器引擎对应关系 操作系统 内核版本 容器引擎 容器存储Rootfs 容器运行时 CentOS 7.6 3.x Docker 1.23起支持Containerd 1.19.16以下版本集群使用Device Mapper 1.19.16及以上版本集群使用OverlayFS runC EulerOS 2.3 3.x Docker Device Mapper runC EulerOS 2.5 3.x Docker Device Mapper runC EulerOS 2.9 4.x Docker 1.23起支持Containerd OverlayFS runC Ubuntu 18.04 4.x Docker 1.23起支持Containerd OverlayFS runC Ubuntu 22.04 4.x Docker 1.23起支持Containerd OverlayFS runC Huawei Cloud EulerOS 1.1 3.x Docker Containerd OverlayFS runC Huawei Cloud EulerOS 2.0 5.x Docker Containerd OverlayFS runC 表3 CCE Turbo集群节点操作系统与容器引擎对应关系 节点类型 操作系统 内核版本 容器引擎 容器存储Rootfs 容器运行时 弹性云服务器-虚拟机 CentOS 7.6 3.x Docker Containerd OverlayFS runC Ubuntu 18.04 4.x EulerOS 2.9 4.x Huawei Cloud EulerOS 1.1 3.x Huawei Cloud EulerOS 2.0 5.x 弹性云服务器-物理机 EulerOS 2.9 4.x Containerd Device Mapper Kata 表4 鲲鹏节点操作系统与容器引擎对应关系 操作系统 内核版本 容器引擎 容器存储Rootfs 容器运行时 Huawei Cloud EulerOS 2.0 5.x Docker Containerd OverlayFS runC EulerOS 2.9 4.x Docker Containerd OverlayFS runC EulerOS 2.8 4.x Docker OverlayFS runC
  • 静态创建对象存储卷时指定挂载Secret 使用访问密钥创建Secret后,在创建PV时只需要关联上Secret,就可以使用Secret中的访问密钥(AK/SK)挂载对象存储卷。 登录OBS控制台,创建对象存储桶,记录桶名称和存储类型,以并行文件系统为例。 新建一个pv的yaml文件,如pv-example.yaml。 apiVersion: v1 kind: PersistentVolume metadata: name: pv-obs-example annotations: pv.kubernetes.io/provisioned-by: everest-csi-provisioner spec: accessModes: - ReadWriteMany capacity: storage: 1Gi csi: nodePublishSecretRef: name: test-user namespace: default driver: obs.csi.everest.io fsType: obsfs volumeAttributes: everest.io/obs-volume-type: STANDARD everest.io/region: cn-north-4 storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisioner volumeHandle: obs-normal-static-pv persistentVolumeReclaimPolicy: Delete storageClassName: csi-obs 参数 描述 nodePublishSecretRef 挂载时指定的密钥,其中 name:指定secret的名字 namespace:指定secret的命令空间 fsType 文件类型,支持“obsfs”与“s3fs”,取值为s3fs时创建是obs对象桶,配套使用s3fs挂载;取值为obsfs时创建的是obs并行文件系统,配套使用obsfs挂载,推荐使用。 volumeHandle 对象存储的桶名称。 创建PV。 kubectl create -f pv-example.yaml PV创建完成后,就可以创建PVC关联PV。 新建一个PVC的yaml文件,如pvc-example.yaml。 PVC yaml文件配置示例: apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: csi.storage.k8s.io/node-publish-secret-name: test-user csi.storage.k8s.io/node-publish-secret-namespace: default volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner everest.io/obs-volume-type: STANDARD csi.storage.k8s.io/fstype: obsfs name: obs-secret namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: csi-obs volumeName: pv-obs-example 参数 描述 csi.storage.k8s.io/node-publish-secret-name 指定secret的名字 csi.storage.k8s.io/node-publish-secret-namespace 指定secret的命令空间 创建PVC。 kubectl create -f pvc-example.yaml PVC创建后,就可以创建工作负载挂载PVC使用存储。
  • 动态创建对象存储卷时指定挂载密钥 动态创建对象存储卷时,可通过如下方法指定挂载密钥。 新建一个pvc的yaml文件,如pvc-example.yaml。 apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: csi.storage.k8s.io/node-publish-secret-name: test-user csi.storage.k8s.io/node-publish-secret-namespace: default everest.io/obs-volume-type: STANDARD csi.storage.k8s.io/fstype: obsfs name: obs-secret namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: csi-obs 参数 描述 csi.storage.k8s.io/node-publish-secret-name 指定secret的名字 csi.storage.k8s.io/node-publish-secret-namespace 指定secret的命令空间 创建PVC。 kubectl create -f pvc-example.yaml PVC创建后,就可以创建工作负载挂载PVC使用存储。
  • 配置验证 根据上述步骤,使用IAM用户的密钥挂载对象存储卷。假设工作负载名称为obs-secret,容器内挂载目录是/temp,IAM用户权限为CCE ReadOnlyAccess和Tenant Guest。 查询工作负载实例名称。 kubectl get po | grep obs-secret 期望输出: obs-secret-5cd558f76f-vxslv 1/1 Running 0 3m22s 查询挂载目录下对象,查询正常。 kubectl exec obs-secret-5cd558f76f-vxslv -- ls -l /temp/ 尝试在挂载目录内写入数据,写入失败。 kubectl exec obs-secret-5cd558f76f-vxslv -- touch /temp/test 期望输出: touch: setting times of '/temp/test': No such file or directory command terminated with exit code 1 参考桶策略配置,给挂载桶的子用户设置读写权限。 再次尝试在挂载目录内写入数据,写入成功。 kubectl exec obs-secret-5cd558f76f-vxslv -- touch /temp/test 查看容器内挂载目录,验证数据写入成功。 kubectl exec obs-secret-5cd558f76f-vxslv -- ls -l /temp/ 期望输出: -rwxrwxrwx 1 root root 0 Jun 7 01:52 test
共100000条