华为云用户手册

  • Pod安全策略开放非安全系统配置示例 节点池管理中可以为相应的节点池配置allowed-unsafe-sysctls,CCE从1.17.17集群版本开始,需要在Pod安全策略的allowedUnsafeSysctls字段中增加相应的配置才能生效,配置详情请参考表1。 除修改全局Pod安全策略外,也可增加新的Pod安全策略,如开放net.core.somaxconn非安全系统配置,新增Pod安全策略示例参考如下: apiVersion: policy/v1beta1kind: PodSecurityPolicymetadata: annotations: seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' name: sysctl-pspspec: allowedUnsafeSysctls: - net.core.somaxconn allowPrivilegeEscalation: true allowedCapabilities: - '*' fsGroup: rule: RunAsAny hostIPC: true hostNetwork: true hostPID: true hostPorts: - max: 65535 min: 0 privileged: true runAsGroup: rule: RunAsAny runAsUser: rule: RunAsAny seLinux: rule: RunAsAny supplementalGroups: rule: RunAsAny volumes: - '*'---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: sysctl-psprules: - apiGroups: - "*" resources: - podsecuritypolicies resourceNames: - sysctl-psp verbs: - use---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: sysctl-psproleRef: kind: ClusterRole name: sysctl-psp apiGroup: rbac.authorization.k8s.iosubjects:- kind: Group name: system:authenticated apiGroup: rbac.authorization.k8s.io
  • 恢复原始Pod安全策略 如果您已经修改默认Pod安全策略后,想恢复原始Pod安全策略,请执行以下操作。 创建一个名为policy.yaml的描述文件。其中,policy.yaml为自定义名称,您可以随意命名。 vi policy.yaml 描述文件内容如下。 apiVersion: policy/v1beta1kind: PodSecurityPolicymetadata: name: psp-global annotations: seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'spec: privileged: true allowPrivilegeEscalation: true allowedCapabilities: - '*' volumes: - '*' hostNetwork: true hostPorts: - min: 0 max: 65535 hostIPC: true hostPID: true runAsUser: rule: 'RunAsAny' seLinux: rule: 'RunAsAny' supplementalGroups: rule: 'RunAsAny' fsGroup: rule: 'RunAsAny' ---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: psp-globalrules: - apiGroups: - "*" resources: - podsecuritypolicies resourceNames: - psp-global verbs: - use ---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: psp-globalroleRef: kind: ClusterRole name: psp-global apiGroup: rbac.authorization.k8s.iosubjects:- kind: Group name: system:authenticated apiGroup: rbac.authorization.k8s.io 执行如下命令: kubectl apply -f policy.yaml
  • 添加对象存储卷 参照创建无状态负载(Deployment)、创建有状态负载(StatefulSet)、创建守护进程集(DaemonSet)或创建普通任务(Job)创建工作负载或普通任务,在添加容器后,展开“数据存储”,选择“ 云存储 ”页签下,单击“添加云存储”。 选择存储类型为“对象存储”。 表2 对象存储参数设置 参数 参数说明 云存储类型 选择“对象存储”。 对象存储有标准存储和低频访问存储两个存储类型,主要适用于大数据分析、原生云应用程序数据、静态网站托管、备份/活跃归档等场景。 分配方式 使用已有存储 云存储名称:选择已创建的存储,您需要提前创建对象存储。 子类型:选择的云存储的存储类别,仅为显示用,如标准存储、低频访问存储。 自动分配存储 在 对象存储服务 OBS侧对应创建的存储实例类别,可选择如下两种类型: 并行文件系统:集群版本在v1.15及以上且Everest插件版本在1.0.2以上时,支持创建可供obsfs挂载的并行文件系统。详情请参见什么是并行文件系统和OBS并行文件系统使用指导。 存储格式:默认为 CS I。 对象桶:桶(Bucket)是对象存储服务OBS中存储对象的容器。详情请参见什么是桶。 子类型:可选择“标准存储”或“低频访问存储”。 存储格式:默认为CSI。 说明: 并行文件系统是OBS(对象存储)经过优化的高性能文件系统,在通过容器挂载方式使用OBS的场景中,推荐您使用并行文件系统,不推荐使用对象桶。 添加容器挂载 配置如下参数: 挂载路径:输入挂载路径,如:/tmp。 数据存储挂载到容器上的路径,请不要挂载在系统目录下,如“/”、“/var/run”等,会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。 须知: 挂载高危目录的情况下 ,建议使用低权限帐号启动,否则可能会造成宿主机高危文件被破坏。 设置权限。 只读:只能读容器路径中的数据卷。 读写:可修改容器路径中的数据卷,容器迁移时新写入的数据不会随之迁移,会造成数据丢失。 单击“添加容器挂载”可增加多条设置,单击“确定”完成配置。 单击“确定”。
  • 插件概述 CCE提供了多种类型的插件,用于管理集群的扩展功能,以支持选择性扩展满足特性需求的功能。 表1 插件列表 插件名称 插件简介 CoreDNS(系统资源插件,必装) CoreDNS插件是一款通过链式插件的方式为Kubernetes提供 域名 解析服务的DNS服务器。 storage-driver(系统资源插件,必装) storage-driver插件是用于对接块存储、文件存储、对象存储、极速文件存储等Iaas存储服务的FlexVolume驱动。 Everest(系统资源插件,必装) Everest是一个云原生容器存储系统,基于CSI为Kubernetes v1.15.6及以上版本集群对接云硬盘服务 EVS、对象存储服务 OBS、弹性文件服务 SFS、极速文件存储 SFS Turbo等存储服务的能力。 npd(系统资源插件,必装) node-problem-detector(简称:npd)是一款监控集群节点异常事件的插件,以及对接第三方监控平台功能的组件。它是一个在每个节点上运行的守护程序,可从不同的守护进程中搜集节点问题并将其报告给apiserver。node-problem-detector可以作为DaemonSet运行, 也可以独立运行。 Dashboard Kubernetes Dashboard是Kubernetes集群基于Web的通用UI,集合了命令行可以操作的所有命令。它允许用户管理在集群中运行应用程序并对其进行故障排除,以及管理集群本身。 autoscaler 集群自动扩缩容插件autoscaler,是根据pod调度状态及资源使用情况对集群的工作节点进行自动扩容缩容的插件。 metrics-server Metrics-Server是集群核心资源监控数据的聚合器。 cce-hpa-controller cce-hpa-controller插件是一款CCE自研的插件,能够基于CPU利用率、内存利用率等指标,对无状态工作负载进行弹性扩缩容。 prometheus Prometheus是一套开源的系统监控报警框架。在云容器引擎CCE中,支持以插件的方式快捷安装Prometheus。 web-terminal web-terminal是一款支持在Web界面上使用Kubectl的插件。它支持使用WebSocket通过浏览器连接Linux,提供灵活的接口便于集成到独立系统中,可直接作为一个服务连接,通过cmdb获取信息并登录服务器。 virtual kubelet Virtual Kubelet是基于社区Virtual Kubelet开源项目开发的插件,该插件支持用户在短时高负载场景下,将部署在CCE上的无状态负载(Deployment)、有状态负载(StatefulSet)、普通任务(Job)三种资源类型的容器实例(Pod),弹性创建到华为云云容器实例CCI服务上,以减少集群扩容带来的消耗。 gpu-beta gpu-beta插件是支持在容器中使用GPU显卡的设备管理插件,仅支持Nvidia驱动。 huawei-npu huawei-npu是支持容器里使用huawei NPU设备的管理插件。 volcano Volcano源自于华为云高性能批量计算解决方案,在支撑华为云一站式 AI开发平台 ModelArts、云容器实例CCI等服务稳定运行中发挥重要作用。Volcano提供了高性能任务调度引擎、高性能异构芯片管理、高性能任务运行管理等通用计算能力,通过接入AI、大数据、基因、渲染等诸多行业计算框架服务终端用户。 nginx-ingress nginx-ingress为Service提供了可直接被集群外部访问的 虚拟主机 、负载均衡、SSL代理、HTTP路由等应用层转发功能。 父主题: 插件管理
  • 命名空间类别 命名空间按创建类型分为两大类:集群默认创建的、用户创建的。 集群默认创建的:集群在启动时会默认创建default、kube-public、kube-system、kube-node-lease命名空间。 default:所有未指定Namespace的对象都会被分配在default命名空间。 kube-public:此命名空间下的资源可以被所有人访问(包括未认证用户),用来部署公共插件、容器模板等。 kube-system:所有由Kubernetes系统创建的资源都处于这个命名空间。 kube-node-lease:每个节点在该命名空间中都有一个关联的“Lease”对象,该对象由节点定期更新。NodeStatus和NodeLease都被视为来自节点的心跳,在v1.13之前的版本中,节点的心跳只有NodeStatus,NodeLease特性从v1.13开始引入。NodeLease比NodeStatus更轻量级,该特性在集群规模扩展性和性能上有明显提升。 用户创建的:用户可以按照需要创建命名空间,例如开发环境、联调环境和测试环境分别创建对应的命名空间。或者按照不同的业务创建对应的命名空间,例如系统若分为登录和游戏服务,可以分别创建对应命名空间。
  • 操作步骤 参照创建文件存储卷中操作创建极速文件存储卷,记录极速文件存储卷名称。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建一个文件,用于创建工作负载。假设文件名为sfsturbo-statefulset-example.yaml。 touch sfsturbo-statefulset-example.yaml vi sfsturbo-statefulset-example.yaml 配置示例: apiVersion: apps/v1kind: StatefulSetmetadata: name: sfsturbo-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: sfsturbo-statefulset-example template: metadata: labels: app: sfsturbo-statefulset-example spec: volumes: - name: pvc-sfsturbo-example persistentVolumeClaim: claimName: pvc-sfsturbo-example containers: - name: container-0 image: 'nginx:latest' volumeMounts: - name: pvc-sfsturbo-example mountPath: /tmp restartPolicy: Always imagePullSecrets: - name: default-secret serviceName: sfsturbo-statefulset-example-headless updateStrategy: type: RollingUpdate 表1 关键参数说明 参数 描述 replicas 实例数。 name 新建工作负载的名称。 image 新建工作负载使用的镜像。 mountPath 容器内挂载路径。 serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 claimName 已有PVC名称。 spec.template.spec.containers.volumeMounts.name和spec.template.spec.volumes.name有映射关系,必须保持一致。 创建有状态工作负载。 kubectl create -f sfsturbo-statefulset-example.yaml
  • 验证极速文件系统的持久化存储 查询部署的工作负载(以sfsturbo-statefulset-example为例)的实例和极速文件存储文件。 执行以下命令,查看工作负载对应的实例名称。 kubectl get po | grep sfsturbo-statefulset-example 期望输出: sfsturbo-statefulset-example-0 1/1 Running 0 2m5s 执行以下命令,查看/tmp目录下是否挂载了极速文件存储。 kubectl exec sfsturbo-statefulset-example-0 -- mount|grep /tmp 期望输出: 192.168.0.108:/ on /tmp type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.0.108,mountvers=3,mountport=20048,mountproto=tcp,local_lock=all,addr=192.168.0.108) 执行以下命令,在/tmp路径下创建问题test。 kubectl exec sfsturbo-statefulset-example-0 -- touch /tmp/test 执行以下命令,查看/tmp路径下的文件。 kubectl exec sfsturbo-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test 执行以下命令,删除名称为sfsturbo-statefulset-example-0的实例。 kubectl delete po sfsturbo-statefulset-example-0 验证重建后的实例,文件是否仍然存在。 执行以下命令,查看重建的实例名称。 kubectl get po 预期输出: sfsturbo-statefulset-example-0 1/1 Running 0 2m 执行以下命令,查看/tmp路径下的文件。 kubectl exec sfsturbo-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test test文件在实例重建之后仍然存在,说明极速文件系统数据可持久化保存。
  • 添加文件存储卷 参照创建无状态负载(Deployment)、创建有状态负载(StatefulSet)、创建守护进程集(DaemonSet)或创建普通任务(Job)创建工作负载或普通任务,在添加容器后,展开“数据存储”。在“云存储”页签,单击“添加云存储”。 选择存储类型为“文件存储”。 表2 挂载文件存储参数配置 参数 参数说明 云存储类型 文件存储:文件存储适用于多种使用场景,包括 媒体处理 、内容管理、大数据和分析应用程序等。 分配方式 使用已有存储 云存储名称:选择已创建的存储,您需要提前创建存储,创建存储步骤请参见创建文件存储卷。 子类型:已创建的文件存储子类型。 存储容量:该容量值为PVC的属性值,若在IaaS侧实施过存储扩容后,容量值不一致是正常的。CCE1.13集群开始支持端到端容器存储扩容功能后,PVC容量才会和存储实体容量一致 自动分配存储 自动创建存储,需要输入存储的容量。 子类型:文件存储子类型为NFS。 存储容量:单位为GB。请不要超过存储容量配额,否则会创建失败。 存储格式:默认选择CSI。 CSI,即Container Storage Interface,容器存储接口机制,用于在Kubernetes和外部存储系统之间建立一套标准的存储管理接口,通过该接口为容器提供存储服务。 加密:勾选“KMS加密”后,将为文件存储提供易用、高安全性的密钥管理服务(Key Management Service,KMS),该功能仅在部分Region的1.13.10及以上版本的集群中支持。若未创建委托请单击“创建委托”,并配置如下参数: 委托名称:委托表示委托方通过创建信任关系,给被委托方授予访问其资源的权限。当“委托名称”为“SFSAccessKMS”时,表示已经成功授权SFS访问KMS,授权成功后,SFS可以获取KMS密钥用来加解密文件系统。 密钥名称:密钥资源创建完成后,可在容器应用中加载使用。如何创建密钥请参见创建密钥。 密钥ID:默认生成。 添加容器挂载 配置如下参数: 子路径:输入文件存储的子路径,如:tmp。 Kubernetes中数据卷挂载的subpath,指引用卷内的子路径而不是其根,不填写时默认为根。现只支持文件存储,必须是相对路径,且不能以“/”或“../”开头。 挂载路径:输入挂载路径,如:/tmp。 数据存储挂载到容器上的路径,请不要挂载在系统目录下,如“/”、“/var/run”等,会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。 须知: 挂载高危目录的情况下 ,建议使用低权限帐号启动,否则可能会造成宿主机高危文件被破坏。 设置权限。 只读:只能读容器路径中的数据卷。 读写:可修改容器路径中的数据卷,容器迁移时新写入的数据不会随之迁移,会造成数据丢失。 单击“添加容器挂载”可增加多条设置,单击“确定”完成配置。 单击“确定”。
  • 验证对象存储的持久化存储 查询部署的工作负载(以obs-statefulset-example为例)的实例和对象存储。 执行以下命令,查看工作负载对应的实例名称。 kubectl get po | grep obs-statefulset-example 期望输出: obs-statefulset-example-0 1/1 Running 0 2m5s 执行以下命令,查看/tmp目录下是否挂载了对象存储。 kubectl exec obs-statefulset-example-0 -- mount|grep /tmp 期望输出: s3fs on /tmp type fuse.s3fs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other) 执行以下命令,在/tmp路径下创建文件test。 kubectl exec obs-statefulset-example-0 -- touch /tmp/test 执行以下命令,查看/tmp路径下的文件。 kubectl exec obs-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test 执行以下命令,删除名称为obs-statefulset-example-0的实例 kubectl delete po obs-statefulset-example-0 验证重建后的实例,文件是否仍然存在。 执行以下命令,查看重建的实例名称 kubectl get po 预期输出: obs-statefulset-example-0 1/1 Running 0 2m 执行以下命令,查看/tmp路径下的文件 kubectl exec obs-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test test文件在实例重建之后仍然存在,说明对象存储数据可持久化保存。
  • 操作步骤 参照存储卷声明PVC中操作创建对象存储卷,并获取PVC名称。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建一个YAML文件,用于创建工作负载。假设文件名为obs-statefulset-example.yaml。 touch obs-statefulset-example.yaml vi obs-statefulset-example.yaml 配置示例: apiVersion: apps/v1kind: StatefulSetmetadata: name: obs-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: obs-statefulset-example template: metadata: labels: app: obs-statefulset-example spec: volumes: - name: pvc-obs-example persistentVolumeClaim: claimName: pvc-obs-example containers: - name: container-0 image: 'nginx:latest' volumeMounts: - name: pvc-obs-example mountPath: /tmp restartPolicy: Always imagePullSecrets: - name: default-secret serviceName: obs-statefulset-example-headless # Headless Service的名称 表1 关键参数说明 参数 描述 replicas 实例数。 name 新建工作负载的名称。 image 新建工作负载使用的镜像。 mountPath 容器内挂载路径。 serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 claimName 已有PVC名称。 在有状态工作负载中基于PVCTemplate独占式使用对象存储。 yaml示例如下: apiVersion: apps/v1kind: StatefulSetmetadata: name: obs-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: obs-statefulset-example template: metadata: labels: app: obs-statefulset-example spec: containers: - name: container-0 image: 'nginx:latest' volumeMounts: - name: pvc-obs-auto-example mountPath: /tmp restartPolicy: Always imagePullSecrets: - name: default-secret volumeClaimTemplates: - metadata: name: pvc-obs-auto-example namespace: default annotations: everest.io/obs-volume-type: STANDARD spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: csi-obs serviceName: obs-statefulset-example-headless 创建有状态工作负载。 kubectl create -f obs-statefulset-example.yaml
  • 添加极速文件存储卷 参照创建无状态负载(Deployment)、创建有状态负载(StatefulSet)、创建守护进程集(DaemonSet)或创建普通任务(Job)创建工作负载或普通任务,在添加容器后,展开“数据存储”,在“云存储”页签,单击“添加云存储”。 选择存储类型为“极速文件存储”。 表1 极速文件存储参数说明 参数 参数说明 云存储类型 极速文件存储:适用于多种使用场景,主要面向DevOps、容器微服务、企业办公等场景。 分配方式 使用已有存储 云存储名称:选择已创建的存储,您需要提前导入存储,导入存储步骤请参见导入极速文件存储卷。 添加容器挂载 配置如下参数: 子路径:输入文件存储的子路径,如:tmp。 Kubernetes中数据卷挂载的subpath,指引用卷内的子路径而不是其根,不填写时默认为根。现只支持文件存储,必须是相对路径,且不能以“/”或“../”开头。 挂载路径:输入挂载路径,如:/tmp。 数据存储挂载到容器上的路径,请不要挂载在系统目录下,如“/”、“/var/run”等,会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。 须知: 挂载高危目录的情况下 ,建议使用低权限帐号启动,否则可能会造成宿主机高危文件被破坏。 设置权限。 只读:只能读容器路径中的数据卷。 读写:可修改容器路径中的数据卷,容器迁移时新写入的数据不会随之迁移,会造成数据丢失。 单击“添加容器挂载”可增加多条设置,单击“确定”完成配置。 单击“确定”。
  • 操作步骤 请参见通过kubectl连接集群,使用kubectl连接集群。 执行如下命令,配置名为“sfsturbo-deployment-example.yaml”的创建deployment的yaml文件。 touch sfsturbo-deployment-example.yaml vi sfsturbo-deployment-example.yaml 在无状态工作负载中基于pvc共享式使用极速文件存储示例: apiVersion: apps/v1 kind: Deployment metadata: name: sfsturbo-deployment-example # 工作负载名称 namespace: default spec: replicas: 1 selector: matchLabels: app: sfsturbo-deployment-example template: metadata: labels: app: sfsturbo-deployment-example spec: containers: - image: nginx name: container-0 volumeMounts: - mountPath: /tmp # 挂载路径 name: pvc-sfsturbo-example restartPolicy: Always imagePullSecrets: - name: default-secret volumes: - name: pvc-sfsturbo-example persistentVolumeClaim: claimName: pvc-sfsturbo-example # 挂载PVC 表1 关键参数说明 参数 描述 name 为创建的无状态工作负载名称。 app 为无状态工作负载名称。 mountPath 为容器内挂载路径,此处示例中为“/tmp”。 “spec.template.spec.containers.volumeMounts.name” 和 “spec.template.spec.volumes.name”有映射关系,必须保持一致。 执行如下命令创建工作负载。 kubectl create -f sfsturbo-deployment-example.yaml
  • 无状态负载使用云硬盘 请参见通过kubectl连接集群,使用kubectl连接集群。 执行如下命令,配置名为“evs-deployment-example.yaml”的创建无状态工作负载的yaml文件。 touch evs-deployment-example.yaml vi evs-deployment-example.yaml 在无状态工作负载中基于pvc共享式使用云硬盘存储示例: apiVersion: apps/v1 kind: Deployment metadata: name: evs-deployment-example namespace: default spec: replicas: 1 selector: matchLabels: app: evs-deployment-example template: metadata: labels: app: evs-deployment-example spec: containers: - image: nginx name: container-0 volumeMounts: - mountPath: /tmp name: pvc-evs-example imagePullSecrets: - name: default-secret restartPolicy: Always volumes: - name: pvc-evs-example persistentVolumeClaim: claimName: pvc-evs-auto-example 表1 关键参数说明 前置路径 参数 描述 spec.template.spec.containers.volumeMounts name 容器内挂载卷的名称。 spec.template.spec.containers.volumeMounts mountPath 容器内挂载路径,示例中挂载到“/tmp”路径。 spec.template.spec.volumes name 卷的名称。 spec.template.spec.volumes.persistentVolumeClaim claimName 已有PVC名称。 “spec.template.spec.containers.volumeMounts.name ”和 “spec.template.spec.volumes.name”有映射关系,必须保持一致。 执行如下命令创建工作负载。 kubectl create -f evs-deployment-example.yaml
  • 有状态负载使用云硬盘 请参见通过kubectl连接集群,使用kubectl连接集群。 执行如下命令,配置名为“evs-statefulset-example.yaml”的创建有状态工作负载的yaml文件。 touch evs-statefulset-example.yaml vi evs-statefulset-example.yaml 在有状态工作负载中基于PVCTemplate独占式使用云硬盘存储。 yaml示例如下: apiVersion: apps/v1kind: StatefulSetmetadata: name: evs-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: evs-statefulset-example template: metadata: labels: app: evs-statefulset-example spec: containers: - name: container-0 image: 'nginx:latest' volumeMounts: - name: pvc-evs-auto-example mountPath: /tmp restartPolicy: Always imagePullSecrets: - name: default-secret volumeClaimTemplates: - metadata: name: pvc-evs-auto-example namespace: default labels: failure-domain.beta.kubernetes.io/region: cn-north-4 failure-domain.beta.kubernetes.io/zone: cn-north-4b annotations: everest.io/disk-volume-type: SAS spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk serviceName: evs-statefulset-example-headless updateStrategy: type: RollingUpdate 表2 关键参数说明 前置路径 参数 描述 metadata name 创建的工作负载名称。 spec.template.spec.containers image 工作负载的镜像。 spec.template.spec.containers.volumeMount mountPath 容器内挂载路径,示例中挂载到“/tmp”路径。 spec serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 “spec.template.spec.containers.volumeMounts.name ”和 “spec.volumeClaimTemplates.metadata.name”有映射关系,必须保持一致。 执行如下命令创建工作负载。 kubectl create -f evs-statefulset-example.yaml
  • 验证云硬盘的持久化存储 查询部署的工作负载(以evs-statefulset-example为例)的实例和云硬盘文件。 执行以下命令,查看工作负载对应的实例名称。 kubectl get po | grep evs-statefulset-example 期望输出: evs-statefulset-example-0 1/1 Running 0 22h 执行以下命令,查看/tmp目录下是否挂载了云硬盘。 kubectl exec evs-statefulset-example-0 -- df tmp 期望输出: /dev/sda 10255636 36888 10202364 1% /tmp 执行以下命令,在/tmp路径下创建问题test。 kubectl exec evs-statefulset-example-0 -- touch /tmp/test 执行以下命令,查看/tmp路径下的文件。 kubectl exec evs-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test 执行以下命令,删除名称为evs-statefulset-example-0的实例 kubectl delete po evs-statefulset-example-0 验证重建后的实例,文件是否仍然存在 执行以下命令,查看重建的实例名称 kubectl get po 预期输出: evs-statefulset-example-0 1/1 Running 0 2m 执行以下命令,查看/tmp路径下的文件 kubectl exec evs-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test test文件在实例重建之后仍然存在,说明云硬盘数据可持久化保存
  • 操作步骤 请参见通过kubectl连接集群,使用kubectl连接集群。 执行如下命令,配置名为“obs-deployment-example.yaml”的创建Pod的yaml文件。 touch obs-deployment-example.yaml vi obs-deployment-example.yaml 在无状态工作负载中基于pvc共享式使用对象存储示例: apiVersion: apps/v1 kind: Deployment metadata: name: obs-deployment-example # 工作负载名称 namespace: default spec: replicas: 1 selector: matchLabels: app: obs-deployment-example template: metadata: labels: app: obs-deployment-example spec: containers: - image: nginx name: container-0 volumeMounts: - mountPath: /tmp # 挂载路径 name: pvc-obs-example restartPolicy: Always imagePullSecrets: - name: default-secret volumes: - name: pvc-obs-example persistentVolumeClaim: claimName: pvc-obs-auto-example # PVC名称 “spec.template.spec.containers.volumeMounts.name”和 “spec.template.spec.volumes.name”有映射关系,必须保持一致。 执行如下命令创建工作负载。 kubectl create -f obs-deployment-example.yaml
  • 操作步骤 参照存储卷声明PVC中操作创建文件存储卷,记录文件存储卷名称。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建一个YAML文件,用于创建工作负载。假设文件名为sfs-statefulset-example.yaml。 touch sfs-statefulset-example.yaml vi sfs-statefulset-example.yaml 配置示例: apiVersion: apps/v1kind: StatefulSetmetadata: name: sfs-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: sfs-statefulset-example template: metadata: labels: app: sfs-statefulset-example spec: volumes: - name: pvc-sfs-example persistentVolumeClaim: claimName: pvc-sfs-example containers: - name: container-0 image: 'nginx:latest' volumeMounts: - name: pvc-sfs-example mountPath: /tmp restartPolicy: Always imagePullSecrets: - name: default-secret serviceName: sfs-statefulset-example-headless updateStrategy: type: RollingUpdate 表1 关键参数说明 前置路径 参数 描述 spec replicas 实例数。 metadata name 新建工作负载的名称。 spec.template.spec.containers image 新建工作负载使用的镜像。 spec.template.spec.containers.volumeMounts mountPath 容器内挂载路径。 spec serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 spec.template.spec.volumes.persistentVolumeClaim claimName 已有PVC名称。 在有状态工作负载中基于PVCTemplate独占式使用文件存储: yaml配置示例如下: apiVersion: apps/v1kind: StatefulSetmetadata: name: sfs-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: sfs-statefulset-example template: metadata: labels: app: sfs-statefulset-example spec: containers: - name: container-0 image: 'nginx:latest' volumeMounts: - name: pvc-sfs-auto-example mountPath: /tmp restartPolicy: Always imagePullSecrets: - name: default-secret volumeClaimTemplates: - metadata: name: pvc-sfs-auto-example namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: csi-nas serviceName: sfs-statefulset-example-headless updateStrategy: type: RollingUpdate spec.template.spec.containers.volumeMounts.name和spec.template.spec.volumes.name有映射关系,必须保持一致。 创建有状态工作负载。 kubectl create -f sfs-statefulset-example.yaml
  • 验证文件系统的持久化存储 查询部署的工作负载(以sfs-statefulset-example为例)的实例和文件存储。 执行以下命令,查看工作负载对应的实例名称。 kubectl get po | grep sfs-statefulset-example 期望输出: sfs-statefulset-example-0 1/1 Running 0 2m5s 执行以下命令,查看/tmp目录下是否挂载了文件存储。 kubectl exec sfs-statefulset-example-0 -- mount|grep /tmp 期望输出: sfs-nas01.cn-north-4.myhuaweicloud.com:/share-c56b9aa4 on /tmp type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.79.96.32,mountvers=3,mountport=2050,mountproto=tcp,local_lock=all,addr=10.79.96.32) 执行以下命令,在/tmp路径下创建问题test。 kubectl exec sfs-statefulset-example-0 -- touch /tmp/test 执行以下命令,查看/tmp路径下的文件。 kubectl exec sfs-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test 执行以下命令,删除名称为sfs-statefulset-example-0的实例 kubectl delete po sfs-statefulset-example-0 验证重建后的实例,文件存储卷内的数据文件会否仍然存在 执行以下命令,查看重建的实例名称 kubectl get po 预期输出: sfs-statefulset-example-0 1/1 Running 0 2m 执行以下命令,查看/tmp路径下的文件 kubectl exec sfs-statefulset-example-0 -- ls -l /tmp 预期输出: -rw-r--r-- 1 root root 0 Jun 1 02:50 test test文件在实例重建之后仍然存在,说明文件系统数据可持久化保存
  • 添加云硬盘存储卷 参照创建无状态负载(Deployment)、创建有状态负载(StatefulSet)或创建普通任务(Job)创建工作负载或普通任务,在添加容器后,展开“数据存储”。在“云存储”页签,单击“添加云存储”。 选择存储类型为“云硬盘”。 表2 挂载云硬盘参数配置 参数 参数说明 云存储类型 云硬盘:云硬盘的使用方式与传统服务器硬盘完全一致。同时,云硬盘具有更高的数据可靠性,更高的I/O吞吐能力和更加简单易用等特点,适用于文件系统、数据库或者其他需要块存储设备的系统软件或工作负载。 注意: 如需挂载云硬盘,创建工作负载时的实例数量必须选择为1个实例,即单实例,选择多实例后挂载云硬盘的选项将置灰,无法挂载。 创建有状态工作负载并添加云存储时,云硬盘暂不支持使用已有存储。 云硬盘不支持跨可用区挂载,且暂时不支持被多个工作负载、同一个工作负载的多个实例或多个任务使用。 分配方式 使用已有存储 选择已创建的存储,您需要提前创建好存储。 针对同一集群和命名空间,创建无状态工作负载时可以选择“使用已有存储”。 创建有状态工作负载时暂不支持选择“使用已有存储”,只能使用“自动分配存储”。 自动分配存储 选择自动分配存储后,需要配置如下选项: 访问模式:是用来对PV进行访问模式的设置,用于描述用户应用对存储资源的访问权限。 ReadWriteOnce (RWO):基于EVS非共享卷提供容器负载单Pod单读单写块存储的功能,但是该卷只能被单个节点挂载。v1.13.10-r1开始支持RWO模式的EVS卷。 可用区:存储所在的可用区,自动分配存储仅支持Node节点所在可用区。 子类型:选择存储的子类型。 高I/O:是指由SAS存储提供资源的磁盘类型。 超高I/O:是指由SSD存储提供资源的磁盘类型。 存储容量:输入存储容量,单位为GB。请不要超过存储容量配额,否则会创建失败。 存储格式:默认选择CSI。 CSI,即Container Storage Interface,容器存储接口机制,用于在Kubernetes和外部存储系统之间建立一套标准的存储管理接口,通过该接口为容器提供存储服务。 加密:勾选“KMS加密”后,将为云硬盘提供易用、高安全性的密钥管理服务(Key Management Service,KMS),该功能仅在部分Region的1.13.10及以上版本的集群中支持。若未创建委托请单击“创建委托”,并配置如下参数: 委托名称:委托表示委托方通过创建信任关系,给被委托方授予访问其资源的权限。当“委托名称”为“EVSAccessKMS”时,表示已经成功授权EVS访问KMS,授权成功后,EVS可以获取KMS密钥用来加解密云硬盘系统。 密钥名称:密钥资源创建完成后,可在容器应用中加载使用。如何创建密钥请参见创建密钥。 密钥ID:默认生成。 添加容器挂载 单击“添加容器挂载”。 挂载路径:输入数据卷挂载到容器上的路径。 须知: 请不要挂载在系统目录下,如“/”、“/var/run”等,会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。 挂载高危目录的情况下 ,建议使用低权限帐号启动,否则可能会造成宿主机高危文件被破坏。 设置权限。 只读:只能读容器路径中的数据卷。 读写:可修改容器路径中的数据卷,容器迁移时新写入的数据不会随之迁移,会造成数据丢失。 图1 添加云存储 单击“确定”。
  • 约束与限制 CCE默认创建计费模式为“按需计费”的云硬盘。如需使用包周期的云硬盘,请参考云硬盘包周期。 云硬盘不支持跨可用区挂载,且暂时不支持被多个工作负载、同一个工作负载的多个实例或多个任务使用。 由于CCE集群各节点之间暂不支持共享盘的数据共享功能,多个节点挂载使用同一个云硬盘可能会出现读写冲突、数据缓存冲突等问题,所以创建无状态工作负载时,若使用了EVS云硬盘,建议工作负载只选择一个实例。 1.19.10以下版本的集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,当新Pod被调度到另一个节点时,会导致之前Pod不能正常读写。 1.19.10及以上版本集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,新Pod会因为无法挂载云硬盘导致无法成功启动。 创建有状态工作负载并添加云存储时,云硬盘暂不支持使用已有存储。 不支持导入分区过或者具有非ext4文件系统的云硬盘。 CCE集群中的容器存储目前已支持加密(Kubernetes 1.13版本及以上),当前仅在部分区域(Region)提供端到端支持。 存储不支持选择企业项目,新创建的存储卷默认创建到default企业项目下。
  • 前提条件 Ingress为后端工作负载提供网络访问,因此集群中需提前部署可用的工作负载。若您无可用工作负载,可参考创建无状态负载(Deployment)、创建有状态负载(StatefulSet)或创建守护进程集(DaemonSet)部署工作负载。 为上述工作负载配置Service,支持的Service类型如表1,可参考集群内访问(ClusterIP)或节点访问(NodePort)配置示例Service。 表1 支持Service类型 Ingress类型 访问类型 集群内访问(ClusterIP) 节点访问(NodePort) ELBIngress 负载均衡路由 不支持 支持 ENI负载均衡路由 支持 不支持 NginxIngress 负载均衡路由 支持 支持 ENI负载均衡路由 支持 不支持
  • 主管:DAVID 用户“DAVID”为该公司某部门的主管,根据权限设计需要为其配置CCE服务的所有权限(包括集群权限和命名空间权限),因此需要在 统一身份认证 服务 IAM 中单独为DAVID创建用户组“cce-admin”,并配置所有项目的权限:“CCE Administrator”,这样主管DAVID的权限就配置好了。 CCE Administrator:CCE的管理员权限,拥有该服务的所有权限,不需要再赋予其他权限。 CCE FullAccess、CCE ReadOnlyAccess:CCE的集群管理权限,仅针对与集群相关的资源(如集群、节点)有效,您必须确保同时配置了“命名空间权限”,才能有操作Kubernetes资源(如工作负载、Service等)的权限。
  • 概述 随着容器技术的快速发展,原有的分布式任务调度模式正在被基于Kubernetes的技术架构所取代。云容器引擎(Cloud Container Engine,简称CCE)是华为云推出的高度可扩展的、高性能的企业级Kubernetes集群,支持社区原生应用和工具。借助云容器引擎,您可以在华为云上轻松部署、管理和扩展容器化应用程序,快速高效的将微服务部署在云端。 为方便企业中的管理人员对集群中的资源权限进行管理,CCE后台提供了多种维度的细粒度权限策略和管理方式。CCE的权限管理包括“集群权限”和“命名空间权限”两种能力,分别从集群和命名空间两个层面对用户组或用户进行细粒度授权,具体解释如下: 集群权限:是基于IAM系统策略的授权,可以让用户组拥有“集群管理”、“节点管理”、“节点池管理”、“模板市场”、“插件管理”权限。 命名空间权限:是基于Kubernetes RBAC能力的授权,可以让用户或用户组拥有Kubernetes资源的权限,如“工作负载”、“网络管理”、“存储管理”、“命名空间”等的权限。 基于IAM系统策略的“集群权限”与基于Kubernetes RBAC能力的“命名空间权限”,两者是完全独立的,互不影响,但要配合使用。同时,为用户组设置的权限将作用于用户组下的全部用户。当给用户或用户组添加多个权限时,多个权限会同时生效(取并集)。
  • 运维工程师:WILLIAM 运维工程师“WILLIAM”虽然也有了所有集群和命名空间的只读权限,但还需要在统一身份认证服务 IAM中为其设置北京四的集群管理权限,因此单独为其创建一个用户组“cce-sre-b4”,然后配置北京四项目的“CCE FullAccess”。 图7 为用户WILLIAM所在的用户组配置北京四项目的集群管理权限 由于之前已经为其设置过所有命名空间的只读权限,所以运维工程师“WILLIAM”现在就拥有了北京四的集群管理权限和所有命名空间的只读权限。
  • 相关问题 能否只配置命名空间权限,不配置集群管理权限? 答:由于界面权限是由IAM系统策略进行判断,所以,如果未配置集群管理权限,就没有打开界面的权限。 如果不配置集群管理权限的情况下,是否可以使用API呢? 答:答案也是否定的,因为API都需要进行IAM的token认证。 如果不配置集群管理权限,是否可以使用kubectl命令呢? 答:答案是肯定的。但前提是要先从界面上下载kubectl配置文件。所以,如果先配置了集群权限,然后再界面下载认证文件。后面再删除集群管理权限(保留命名空间权限),依然可以使用kubectl来操作Kubernetes集群。
  • 操作步骤 请参见通过kubectl连接集群,使用kubectl连接集群。 执行如下命令,配置名为“sfs-deployment-example.yaml”的创建Pod的yaml文件。 touch sfs-deployment-example.yaml vi sfs-deployment-example.yaml 在无状态工作负载中基于pvc共享式使用文件存储示例: apiVersion: apps/v1 kind: Deployment metadata: name: sfs-deployment-example # 工作负载名称 namespace: default spec: replicas: 1 selector: matchLabels: app: sfs-deployment-example template: metadata: labels: app: sfs-deployment-example spec: containers: - image: nginx name: container-0 volumeMounts: - mountPath: /tmp # 挂载路径 name: pvc-sfs-example imagePullSecrets: - name: default-secret restartPolicy: Always volumes: - name: pvc-sfs-example persistentVolumeClaim: claimName: pvc-sfs-auto-example # 挂载PVC “spec.template.spec.containers.volumeMounts.name” 和 “spec.template.spec.volumes.name”有映射关系,必须保持一致。 执行如下命令创建工作负载。 kubectl create -f sfs-deployment-example.yaml
  • 直接访问Pod的问题 Pod创建完成后,如何访问Pod呢?直接访问Pod会有如下几个问题: Pod会随时被Deployment这样的控制器删除重建,那访问Pod的结果就会变得不可预知。 Pod的IP地址是在Pod启动后才被分配,在启动前并不知道Pod的IP地址。 应用往往都是由多个运行相同镜像的一组Pod组成,逐个访问Pod也变得不现实。 举个例子,假设有这样一个应用程序,使用Deployment创建了前台和后台,前台会调用后台做一些计算处理,如图1所示。后台运行了3个Pod,这些Pod是相互独立且可被替换的,当Pod出现状况被重建时,新建的Pod的IP地址是新IP,前台的Pod无法直接感知。 图1 Pod间访问
  • 使用Service解决Pod的访问问题 Kubernetes中的Service对象就是用来解决上述Pod访问问题的。Service有一个固定IP地址(在创建CCE集群时有一个服务网段的设置,这个网段专门用于给Service分配IP地址),Service将访问它的流量转发给Pod,具体转发给哪些Pod通过Label来选择,而且Service可以给这些Pod做负载均衡。 那么对于上面的例子,为后台添加一个Service,通过Service来访问Pod,这样前台Pod就无需感知后台Pod的变化,如图2所示。 图2 通过Service访问Pod
  • 通过kubectl命令行设置 本节以nginx为例,创建图2中的节点亲和性。 前提条件 已有使用nginx容器的工作负载和节点。 操作步骤 使用内置节点标签kubernetes.io/hostname,并添加相应的节点,同时设置操作符为In,最后单击“确定”提交。 设置后的工作负载节点亲和性所得的yaml如下: apiVersion: apps/v1kind: Deploymentmetadata: name: nginx namespace: defaultspec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx imagePullPolicy: Always name: nginx imagePullSecrets: - name: default-secret affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - 192.168.6.174
  • 通过kubectl命令行设置 本节以nginx为例,创建图2中的工作负载亲和性。 前提条件 已有使用nginx容器的工作负载和节点。 操作步骤 使用默认的命名空间default,拓扑域使用内置的节点标签kubernetes.io/hostname用于表示以节点为区分范围,设置标签app和type,标签值为redis和database。同时设置操作符为In,最后单击“确定”提交。 设置后的工作负载亲和性所得的yaml如下: apiVersion: apps/v1kind: Deploymentmetadata: name: nginx namespace: defaultspec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx imagePullPolicy: Always name: nginx imagePullSecrets: - name: default-secret affinity: nodeAffinity: {} podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - redis - key: type operator: In values: - database namespaces: - default topologyKey: kubernetes.io/hostname
共100000条