华为云用户手册

  • Pod列表 Pod列表中包含了Pod名称、状态、命名空间、Pod IP、所在节点、重启次数、CPU申请/限制、内存申请/限制,以及CPU和内存使用量、使用率等详细信息。 图4 Pod列表 您可以通过在列表上方按照Pod名称、状态、命名空间、Pod IP和所在节点进行筛选,快速找到需要的Pod。您也可以单击“导出”按钮来导出全部Pod数据,或者选择部分Pod进行导出,此时仅导出所选中的数据。导出的文件为“.xlsx”格式,文件命名中包含时间戳。 单击Pod名称可以查看Pod的详细监控数据。更多相关内容,请参见Pod监控。
  • 操作步骤 登录CCE控制台,单击集群名称进入集群。 查看集群概览页,在右边“连接信息”下证书认证一栏,单击“下载”。 图1 获取证书 在弹出的“证书获取”窗口中,根据系统提示选择证书的过期时间并下载集群X509证书。 下载的证书包含client.key、client.crt、ca.crt三个文件,请妥善保管您的证书,不要泄露。 集群中容器之间互访不需要证书。 使用集群证书调用Kubernetes原生API。 例如使用curl命令调用接口查看Pod信息,如下所示,其中192.168.0.18:5443为集群API Server地址。 curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://192.168.0.18:5443/api/v1/namespaces/default/pods/ 更多集群接口请参见Kubernetes API。
  • Pod标签 在控制台创建工作负载时,会默认为Pod添加如下标签,其中app的值为工作负载名称。 YAML示例如下: ... spec: selector: matchLabels: app: nginx version: v1 template: metadata: labels: app: nginx version: v1 spec: ... 您也可以根据需要为Pod添加其他标签,可用于设置工作负载亲和性与反亲和性调度。如下图,假设为工作负载(例如名称为APP1、APP2、APP3)定义了3个Pod标签:release、env、role。不同工作负载定义了不同的取值,分别为: APP 1:[release:alpha;env:development;role:frontend] APP 2:[release:beta;env:testing;role:frontend] APP 3:[release:alpha;env:production;role:backend] 图1 标签案例 例如,设置工作负载亲和性的“key/value”值为“role/backend”,则会选择APP3进行亲和性调度,详情请参见工作负载亲和(podAffinity)。
  • Pod注解 CCE提供一些使用Pod的高级功能,这些功能使用时可以通过给YAML添加注解Annotation实现。具体的Annotation如下表所示。 表1 Pod Annotation 注解 说明 默认值 kubernetes.AOM.log.stdout 容器标准输出采集参数,不配置默认将全部容器的标准输出上报至AOM,可配置采集指定容器或全部不采集。 示例: 全部不采集: kubernetes.AOM.log.stdout: '[]' 采集container-1和container-2容器: kubernetes.AOM.log.stdout: '["container-1","container-2"]' - metrics.alpha.kubernetes.io/custom-endpoints AOM监控指标上报参数,可将指定指标上报是AOM服务。 具体使用请参见使用AOM监控自定义指标。 - prometheus.io/scrape Prometheus指标上报参数,值为true表示当前负载开启上报。 具体使用请参见使用云原生监控插件监控自定义指标。 - prometheus.io/path Prometheus采集的url路径。 具体使用请参见使用云原生监控插件监控自定义指标。 /metrics prometheus.io/port Prometheus采集的endpoint端口号。 具体使用请参见使用云原生监控插件监控自定义指标。 - prometheus.io/scheme Prometheus采集协议,值可以填写http或https 具体使用请参见使用云原生监控插件监控自定义指标。 - kubernetes.io/ingress-bandwidth Pod的入口带宽 具体使用请参见为Pod配置QoS。 - kubernetes.io/egress-bandwidth Pod的出口带宽 具体使用请参见为Pod配置QoS。 -
  • 全域统一调度和资源分级管控 全域统一调度 应用的全域统一调度的核心是全域和统一,比如:分布式云场景中跨云、跨集群的统一调度,以及不同在线应用、离线任务的统一调度。 首先,Volcano通过静态分析,获取应用的静态特征,如:CPU、内存、存储、GPU等资源的需求,应用间亲和性、区域亲和性、云平台亲和性等。 接着,Volcano对接监控系统,获取不同云平台资源、集群资源的动态数据,以及应用运行的数据,分析其规律,获得其运行态势,如:业务分级(天/周/月)的潮汐规律性、CPU敏感型、L3缓存敏感型、内存敏感型等。 最后,通过Volcano丰富多样的、按需启用的调度策略,将应用调度到合适的环境中。如:基于预测的智能调度策略、基于业务的binpack装箱/重调度策略、基于运行态势的资源超卖策略等。 Volcano将分布式云平台中的资源统一管理,将不同类型的应用调度到合适的位置,有效的解决了多集群带来的资源碎片问题和因应用迭代带来的节点规格不匹配问题,帮助用户从繁杂的资源规划和版本迭代带来的变化中解脱出来。 资源分级管控 应用被调度到合适的运行环境后,如何来保障其所需要的资源呢? 基于Huawei Cloud EulerOS 2.0操作系统,从CPU、L3缓存、内存、网络、存储等全方位提供资源隔离能力,并以内核态为主,用户态为辅,通过快速抢占(毫秒)和快速驱逐(秒级),保障在线业务的服务质量。 资源隔离的措施,如:CPU的绑核、NUMA亲和性、潮汐亲和特性,网络带宽控制等,有效的保障资源敏感型业务的SLO。 资源优先级控制的措施,如:CPU分级控制、内存分级压制、网络优先级控制、磁盘IO的优先级控制等,在提升资源分配率的同时,又少影响或不影响优先级高的业务SLO。 资源分级管控为业务潮汐明显的在线业务间混部、在线和离线业务混部奠定了基础。解决了应用预留资源较多、资源无法分时复用的问题。
  • 功能介绍 功能 描述 参考文档 动态资源超卖 根据在线作业和离线作业类型,通过Volcano调度将集群中申请而未使用的资源(即申请量与使用量的差值)利用起来,实现资源超卖和混合部署,提升集群资源利用率。 动态资源超卖 CPU Burst弹性限流 提供一种可以短暂突破CPU Limit值的弹性限流机制,以降低业务长尾响应时间,可以有效提升时延敏感型业务的服务质量。 CPU Burst弹性限流 出口网络带宽保障 平衡在线业务与离线业务对出口网络带宽的使用,保证在线业务有足够的网络带宽。 出口网络带宽保障
  • 本地存储对比 对比维度 本地持久卷(Local PV) 本地临时卷(Local Ephemeral Volume) 临时路径(EmptyDir) 主机路径(HostPath) 概念 将节点的本地数据盘通过LVM组成存储池(VolumeGroup),然后划分LV给容器挂载使用。 基于Kubernetes原生的EmptyDir类型,将节点的本地数据盘通过LVM组成存储池(VolumeGroup),然后划分LV作为EmptyDir的存储介质给容器挂载使用,相比原生EmptyDir默认的存储介质类型性能更好。 Kubernetes原生的EmptyDir类型,生命周期与容器实例相同,并支持指定内存作为存储介质。容器实例消亡时,EmptyDir会被删除,数据会永久丢失。 将容器所在宿主机的文件目录挂载到容器指定的挂载点中。 主要特点 低延迟、高IO,非高可用的持久卷。 存储卷通过Label绑定节点,且为非共享存储,只能在单个Pod中挂载。 本地临时卷,存储空间来自本地LV。 本地临时卷,存储空间来自本地的kubelet根目录或内存。 挂载主机节点文件系统上的文件或目录,支持自动创建主机目录,Pod可迁移(不绑定节点)。 存储卷挂载方式 不支持静态存储卷 支持通过动态存储卷使用本地持久卷 详情请参见使用本地临时卷。 详情请参见使用临时路径。 详情请参见主机路径(HostPath)。 应用场景 IO要求高、应用自带高可用方案的场景,例如:高可用部署MySQL。 缓存空间,例如基于磁盘的归并排序。 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。 在Web服务器容器服务数据时,保存内容管理器容器获取的文件。 缓存空间,例如基于磁盘的归并排序。 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。 在Web服务器容器服务数据时,保存内容管理器容器获取的文件。 运行一个需要使用节点文件。例如容器中需使用Docker,可使用HostPath挂载节点的/var/lib/docker路径。 须知: HostPath卷存在许多安全风险,最佳做法是尽可能避免使用HostPath。 当必须使用HostPath卷时,它的范围应仅限于所需的文件或目录,并以只读方式挂载。
  • 企业项目支持说明 该功能需要everest插件升级到1.2.33及以上版本。 自动创建存储: CCE支持使用存储类创建云硬盘和对象存储类型PVC时指定企业项目,将创建的存储资源(云硬盘和对象存储)归属于指定的企业项目下,企业项目可选为集群所属的企业项目或default企业项目。 若不指定企业项目,则创建的存储资源默认使用存储类StorageClass中指定的企业项目。 对于自定义的StorageClass,可以在StorageClass中指定企业项目,详见指定StorageClass的企业项目。StorageClass中如不指定的企业项目,则默认为default企业项目。 对于CCE提供的 csi-disk 和 csi-obs 存储类,所创建的存储资源属于default企业项目。 使用已有存储: 使用PV创建PVC时,因为存储资源在创建时已经指定了企业项目,如果PVC中指定企业项目,则务必确保在PVC和PV中指定的everest.io/enterprise-project-id保持一致,否则两者无法正常绑定。
  • 云存储对比 对比维度 云硬盘EVS 文件存储SFS 极速文件存储SFS Turbo 对象存储OBS 概念 云硬盘(Elastic Volume Service)可以为云服务器提供高可靠、高性能、规格丰富并且可弹性扩展的块存储服务,可满足不同场景的业务需求,适用于分布式文件系统、开发测试、数据仓库以及高性能计算等场景。 SFS为用户提供一个完全托管的共享文件存储,能够弹性伸缩至PB规模,具备高可用性和持久性,为海量数据、高带宽型应用提供有力支持。适用于多种应用场景,包括HPC、媒体处理、文件共享、内容管理和Web服务等。 SFS Turbo为用户提供一个完全托管的共享文件存储,能够弹性伸缩至320TB规模,具备高可用性和持久性,为海量的小文件、低延迟高IOPS型应用提供有力支持。适用于多种应用场景,包括高性能网站、日志存储、压缩解压、DevOps、企业办公、容器应用等。 对象存储服务(Object Storage Service,OBS)提供海量、安全、高可靠、低成本的数据存储能力,可供用户存储任意类型和大小的数据。适合企业备份/归档、视频点播、视频监控等多种数据存储场景。 存储数据的逻辑 存放的是二进制数据,无法直接存放文件,如果需要存放文件,需要先格式化文件系统后使用。 存放的是文件,会以文件和文件夹的层次结构来整理和呈现数据。 存放的是文件,会以文件和文件夹的层次结构来整理和呈现数据。 存放的是对象,可以直接存放文件,文件会自动产生对应的系统元数据,用户也可以自定义文件的元数据。 访问方式 只能在ECS/BMS中挂载使用,不能被操作系统应用直接访问,需要格式化成文件系统进行访问。 在ECS/BMS中通过网络协议挂载使用。需要指定网络地址进行访问,也可以将网络地址映射为本地目录后进行访问。 提供标准的文件访问协议NFS(仅支持NFSv3),用户可以将现有应用和工具与SFS Turbo无缝集成。 可以通过互联网或专线访问。需要指定桶地址进行访问,使用的是HTTP和HTTPS等传输协议。 静态存储卷 支持,请参见通过静态存储卷使用已有云硬盘。 支持,请参见通过静态存储卷使用已有文件存储。 支持,请参见通过静态存储卷使用已有极速文件存储。 支持,请参见通过静态存储卷使用已有对象存储。 动态存储卷 支持,请参见通过动态存储卷使用云硬盘。 支持,请参见通过动态存储卷使用文件存储。 不支持 支持,请参见通过动态存储卷使用对象存储。 主要特点 非共享存储,每个云盘只能在单个节点挂载。 共享存储,可提供高性能、高吞吐存储服务。 高性能、高带宽、共享存储。 共享存储,用户态文件系统。 应用场景 HPC高性能计算、企业核心集群应用、企业应用系统和开发测试等。 说明: 高性能计算:主要是高速率、高IOPS的需求,用于作为高性能存储,比如工业设计、能源勘探等。 HPC高性能计算、媒体处理、内容管理和Web服务、大数据和分析应用程序等。 说明: 高性能计算:主要是高带宽的需求,用于共享文件存储,比如基因测序、图片渲染等。 高性能网站、日志存储、DevOps、企业办公等。 大数据分析、静态网站托管、在线视频点播、基因测序、智能视频监控、备份归档、企业云盘(网盘)等。 容量 TB级别 SFS 1.0:PB级别 SFS 3.0:EB级别 通用型:TB级别 EB级别 时延 1~2ms SFS 1.0:3~20ms SFS 3.0:10ms 通用型:1~5ms 10ms 最大IOPS 因规格而异,范围为2.2K~256K SFS 1.0:2K SFS 3.0:百万级 通用型:最大达100K 千万级 带宽 MB/s级别 SFS 1.0:GB/s级别 SFS 3.0:TB/s级别 通用型:最大为GB/s级别 TB/s级别
  • 通过控制台创建 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“服务”,切换至“路由”页签,在右上角单击“创建路由”。 设置Ingress参数。本示例中仅列举必选参数,其余参数可根据需求参考通过控制台创建ELB Ingress进行设置。 名称:自定义服务名称,可与工作负载名称保持一致。 负载均衡器:选择弹性负载均衡的类型、创建方式。 类型:本例中仅支持选择“独享型”。 创建方式:本文中以选择已有ELB为例进行说明,关于自动创建的配置参数请参见负载均衡器。 监听器配置: 前端协议:支持HTTP和HTTPS。本文以HTTP协议为例。 对外端口:开放在负载均衡服务地址的端口,可任意指定。 高级配置: 配置 说明 使用限制 数据压缩 开启将对特定文件类型进行压缩;关闭则不会对任何文件类型进行压缩。 Brotli支持压缩所有类型。 Gzip支持压缩的类型如下: text/xml text/plain text/css application/javascript application/x-javascript application/rss+xml application/atom+xml application/xml application/json。 独享型ELB实例支持配置。 图1 配置gzip数据压缩 转发策略配置:填写域名匹配规则及需要访问的目标Service。请求的访问地址与转发规则匹配时(转发规则由域名、URL组成,例如:10.117.117.117:80/helloworld),此请求将被转发到对应的目标Service处理。 单击“确定”,创建Ingress。
  • 环境变量查看 如果configmap-example和secret-example的内容如下。 $ kubectl get configmap configmap-example -oyaml apiVersion: v1 data: configmap_key: configmap_value kind: ConfigMap ... $ kubectl get secret secret-example -oyaml apiVersion: v1 data: secret_key: c2VjcmV0X3ZhbHVl # c2VjcmV0X3ZhbHVl为secret_value的base64编码 kind: Secret ... 则进入Pod中查看的环境变量结果如下。 $ kubectl get pod NAME READY STATUS RESTARTS AGE env-example-695b759569-lx9jp 1/1 Running 0 17m $ kubectl exec env-example-695b759569-lx9jp -- printenv / # env key=value # 自定义环境变量 key1=configmap_value # 配置项键值导入 key2=secret_value # 密钥键值导入 key3=env-example-695b759569-lx9jp # Pod的metadata.name key4=1 # container1这个容器的limits.cpu,单位为Core,向上取整 configmap_key=configmap_value # 配置项导入,原配置项中的键值直接会导入结果 secret_key=secret_value # 密钥导入,原密钥中的键值直接会导入结果
  • 操作场景 环境变量是指容器运行环境中设定的一个变量,环境变量可以在工作负载部署后修改,为工作负载提供极大的灵活性。 CCE中设置的环境变量与Dockerfile中的“ENV”效果相同。 容器启动后,容器中的内容不应修改。如果修改配置项(例如将容器应用的密码、证书、环境变量配置到容器中),当容器重启(例如节点异常重新调度Pod)后,会导致配置丢失,业务异常。 配置信息应通过入参等方式导入容器中,以免重启后配置丢失。 环境变量支持如下几种方式设置。 自定义:手动填写环境变量名称及对应的参数值。 配置项导入:将配置项中所有键值都导入为环境变量。 配置项键值导入:将配置项中某个键的值导入作为某个环境变量的值。例如图1中将configmap-example这个配置项中configmap_key的值configmap_value导入为环境变量key1的值,导入后容器中将会存在一个名为key1的环境变量,其值为configmap_value。 密钥导入:将密钥中所有键值都导入为环境变量。 密钥键值导入:将密钥中某个键的值导入作为某个环境变量的值。例如图1中将secret-example这个配置项中secret_key的值secret_value导入为环境变量key2的值,导入后容器中将会存在一个名为key2的环境变量,其值为secret_value。 变量/变量引用:用Pod定义的字段作为环境变量的值。例如图1中将此Pod的名称导入为环境变量key3的值,导入后容器中将会存在一个名为key3的环境变量,其值为该Pod的名称。 资源引用:用容器定义的资源申请值或限制值作为环境变量的值。例如图1中将容器container-1的CPU限制值导入为环境变量key4的值,导入后容器中将会存在一个名为key4的环境变量,其值为容器container-1的CPU限制值。
  • YAML样例 apiVersion: apps/v1 kind: Deployment metadata: name: env-example namespace: default spec: 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: configmap_key - name: key2 # 密钥键值导入 valueFrom: secretKeyRef: name: secret-example key: secret_key - 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
  • 开启集群控制面审计日志 创建集群时开启 登录云容器引擎(CCE)控制台。 在控制台上方导航栏,单击“购买集群”,填写集群配置并单击“下一步:插件选择”。 在“插件选择”页面中,选择安装“云原生日志采集插件”并单击“下一步:插件配置”。 在“插件配置”页面中,在“云原生日志采集插件”配置中勾选“kubernetes审计日志”。 图1 创建集群时开启集群审计日志 单击“下一步:确认配置”完成集群创建。
  • 定时轮转 在插件使用说明,通过使用该插件,用户可完成基本的凭据挂载功能,即能够将存储在凭据管理服务中的凭据写入到Pod内。 若将在SPC对象中声明的凭据版本改为”latest”,如下所示: apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: spc-test spec: provider: cce parameters: objects: | - objectName: "secret_1" objectVersion: "latest" # change "v1"to "latest" objectType: "csms" 更新该SPC对象后,插件将周期性地向凭据管理服务发起请求,获取凭据secret_1最新版本的值,并将其刷新至引用了该SPC对象的Pod内。此处插件周期性发起请求的时间间隔由安装插件时设置的rotation_poll_interval参数确定。
  • 实时感知SPC变化 在使用Volume挂载凭据、定时轮转的演示中,其实已经使用到了实时感知SPC变化的能力。为了演示说明,在SPC对象中新增一个凭据secret_2,如下所示: apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: spc-test spec: provider: cce parameters: objects: | - objectName: "secret_1" objectVersion: "latest" objectType: "csms" - objectName: "secret_2" objectVersion: "v1" objectType: "csms" 更新该SPC对象后,新增的secret_2将很快挂载至引用了该SPC对象的Pod内。
  • 版本记录 表4 CCE密钥管理(对接 DEW)插件版本记录 插件版本 支持的集群版本 更新特性 1.1.2 v1.21 v1.23 v1.25 v1.27 v1.28 v1.29 适配CCE v1.29集群 支持同步csms凭据时创建secret 1.0.31 v1.21 v1.23 v1.25 v1.27 v1.28 适配CCE v1.27集群 适配CCE v1.28集群 1.0.9 v1.19 v1.21 v1.23 v1.25 - 1.0.6 v1.19 v1.21 v1.23 v1.25 - 1.0.3 v1.19 v1.21 v1.23 v1.25 适配CCE v1.25集群 1.0.2 v1.19 v1.21 v1.23 适配CCE v1.23集群 1.0.1 v1.19 v1.21 支持主动感知SecretProviderClass对象的变化
  • 查看组件日志 查看插件的Pod $ kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE csi-secrets-store-76tj2 3/3 Running 0 11h dew-provider-hm5fq 1/1 Running 0 11h 查看dew-provider组件Pod日志 $ kubectl logs dew-provider-hm5fq -n kube-system …日志信息略… … 查看csi-secrets-store组件Pod日志,由于csi-secrets-store组件的Pod包含多个容器,在查看日志信息时,需通过”-c”命令指定某个容器。其中,secrets-store容器作为该插件的主业务容器,其包含了主要的日志信息。 $ kubectl logs csi-secrets-store-76tj2 -c secrets-store -n kube-system …日志信息略… …
  • 使用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。
  • 约束与限制 数据加密服务包含密钥管理(Key Management Service, KMS)、云凭据管理(Cloud Secret Management Service,CSMS)和密钥对管理(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。 单击“安装”。 待插件安装完成后,选择对应的集群,然后单击左侧导航栏的“插件中心”,可在“已安装插件”页签中查看相应的插件。
  • 插件说明 基础挂载能力:安装完该插件后,通过创建SecretProviderClass对象,在业务Pod中声明Volume并进行引用,当启动Pod时,就会将在SecretProviderClass对象中声明的凭据信息挂载至Pod内。 定时轮转能力:当Pod正常运行后,若其在SPC中声明的、存储在云凭据管理服务中的凭据发生了更新,通过定时轮转,可以将最新的凭据值刷新至Pod内。使用该能力时,需要将凭据的版本指定为”latest”。 实时感知SPC变化能力:当Pod正常运行后,若用户修改了在SPC中声明的凭据信息(如新增凭据、改变原有凭据的版本号等),插件可实时感知该变化,并将更新后的凭据刷新至Pod内。
  • 约束限制 当且仅当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)时,使用出口网络保障功能无法生效。
  • 配置验证 根据上述步骤,使用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
  • 动态创建对象存储卷时指定挂载密钥 动态创建对象存储卷时,可通过如下方法指定挂载密钥。 新建一个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使用存储。
  • 使用访问密钥创建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
共100000条