华为云用户手册

  • 操作步骤 登录OBS控制台,创建对象存储桶,记录桶名称和存储类型。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建两个yaml文件,用于创建PersistentVolume(PV)、PersistentVolumeClaim(PVC),假设文件名为pv-obs-example.yaml、pvc-obs-example.yaml。 touch pv-obs-example.yaml pvc-obs-example.yaml K8S集群版本(K8S version) 说明 yaml示例 1.11 ≤ K8S version ≤ 1.13 1.11以上及1.13版本集群 请参见1.11~1.13 yaml文件配置示例 K8S version = 1.9 1.9版本集群 请参见1.9 yaml文件配置示例 1.11 ≤ K8S version ≤ 1.13(1.11以上及1.13版本集群) PV yaml文件配置示例: apiVersion: v1 kind: PersistentVolume metadata: name: pv-obs-example annotations: pv.kubernetes.io/provisioned-by: flexvolume-huawei.com/fuxiobsspec: accessModes: - ReadWriteMany capacity: storage: 1Gi claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: pvc-obs-example namespace: default flexVolume: driver: huawei.com/fuxiobs fsType: obs options: fsType: obs region: cn-north-4 storage_class: STANDARD volumeID: test-obs persistentVolumeReclaimPolicy: Delete storageClassName: obs-standard 表1 关键参数说明 参数 描述 driver 挂载依赖的存储驱动,对象存储配置为“huawei.com/fuxiobs”。 storage_class 存储类型,包括STANDARD(标准桶)、STANDARD_IA(低频访问桶)。 region Region对应的值请参见地区和终端节点。 volumeID 对象存储的桶名称。 获取方法:在CCE控制台,单击左侧栏目树中的“资源管理-存储管理”,在“对象存储卷”页签下单击PVC的名称,在PVC详情页的“PV详情”页签下复制“PV名称”后的内容即可。 storage 存储容量,单位为Gi。此处配置为固定值1Gi。 storageClassName 对象存储支持的存储类型,包括obs-standard(标准)、obs-standard-ia(低频)。 spec.claimRef.apiVersion 固定值"v1"。 spec.claimRef.kind 固定值"PersistentVolumeClaim"。 spec.claimRef.name 与下一步创建的pvc的name一致。 spec.claimRef.namespace 与下一步创建的pvc的namespace一致。 PVC yaml文件配置示例: apiVersion: v1kind: PersistentVolumeClaimmetadata: annotations: volume.beta.kubernetes.io/storage-class: obs-standard volume.beta.kubernetes.io/storage-provisioner: flexvolume-huawei.com/fuxiobs name: pvc-obs-example namespace: defaultspec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi volumeName: pv-obs-example 表2 关键参数说明 参数 描述 volume.beta.kubernetes.io/storage-class 对象存储支持的存储类型,包括obs-standard、obs-standard-ia。 volume.beta.kubernetes.io/storage-provisioner 必须使用flexvolume-huawei.com/fuxiobs。 volumeName PV的名称。 storage 存储容量,单位为Gi。此处配置为固定值1Gi。 K8S version = 1.9(1.9版本集群) PV yaml文件配置示例: apiVersion: v1 kind: PersistentVolume metadata: name: pv-obs-example namespace: default spec: accessModes: - ReadWriteMany capacity: storage: 1Gi flexVolume: driver: huawei.com/fuxiobs fsType: obs options: fsType: obs kubernetes.io/namespace: default region: cn-north-4 storage_class: STANDARD volumeID: test-obs persistentVolumeReclaimPolicy: Delete storageClassName: obs-standard 表3 关键参数说明 参数 描述 driver 挂载依赖的存储驱动,对象存储配置为“huawei.com/fuxiobs”。 storage_class 存储类型,包括STANDARD(标准桶)、STANDARD_IA(低频访问桶)。 region Region对应的值请参见地区和终端节点。 volumeID 对象存储的桶名称。 获取方法:在CCE控制台,单击左侧栏目树中的“资源管理-存储管理”,在“对象存储卷”页签下单击PVC的名称,在PVC详情页的“PV详情”页签下复制“PV名称”后的内容即可。 storage 存储容量,单位为Gi。此处配置为固定值1Gi。 storageClassName 对象存储支持的存储类型,包括obs-standard(标准)、obs-standard-ia(低频)。 PVC yaml文件配置示例: apiVersion: v1kind: PersistentVolumeClaimmetadata: annotations: volume.beta.kubernetes.io/storage-class: obs-standard volume.beta.kubernetes.io/storage-provisioner: flexvolume-huawei.com/fuxiobs name: pvc-obs-example namespace: defaultspec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi volumeName: pv-obs-example volumeNamespace: default 表4 关键参数说明 参数 描述 volume.beta.kubernetes.io/storage-class 对象存储支持的存储类型,包括obs-standard、obs-standard-ia。 volume.beta.kubernetes.io/storage-provisioner 必须使用flexvolume-huawei.com/fuxiobs。 volumeName PV的名称。 storage 存储容量,单位为Gi。此处配置为固定值1Gi。 创建PV。 kubectl create -f pv-obs-example.yaml 创建PVC。 kubectl create -f pvc-obs-example.yaml
  • Pod Annotation说明 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服务。 具体使用请参见自定义监控。 - prometheus.io/scrape Prometheus指标上报参数,值为true表示当前负载开启上报。 具体使用请参见使用Prometheus插件监控。 - prometheus.io/path Prometheus采集的url路径。 具体使用请参见使用Prometheus插件监控。 /metrics prometheus.io/port Prometheus采集的endpoint端口号。 具体使用请参见使用Prometheus插件监控。 - prometheus.io/scheme Prometheus采集协议,值可以填写http或https 具体使用请参见使用Prometheus插件监控。 - kubernetes.io/ingress-bandwidth Pod的入口带宽 具体使用请参见Pod Annotation说明。 - kubernetes.io/egress-bandwidth Pod的出口带宽 具体使用请参见Pod Annotation说明。 - 父主题: 工作负载
  • 操作步骤 参照创建对象存储卷中操作创建对象存储卷,并获取PVC名称。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建一个YAML文件,用于创建工作负载。假设文件名为obs-statefulset-example.yaml。 touch obs-statefulset-example.yaml vi obs-statefulset-example.yaml yaml示例如下: apiVersion: apps/v1kind: StatefulSetmetadata: name: obs-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: obs-statefulset-example serviceName: qwqq template: metadata: annotations: metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]' pod.alpha.kubernetes.io/initialized: "true" creationTimestamp: null labels: app: obs-statefulset-example spec: affinity: {} containers: image: nginx:latest imagePullPolicy: Always name: container-0 volumeMounts: - mountPath: /tmp name: pvc-obs-example imagePullSecrets: - name: default-secret volumes: - name: pvc-obs-example persistentVolumeClaim: claimName: cce-obs-demo 表1 关键参数说明 参数 描述 replicas 实例数。 name 新建工作负载的名称。 image 新建工作负载使用的镜像。 mountPath 容器内挂载路径。 serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 claimName 已有PVC名称。 创建有状态工作负载。 kubectl create -f obs-statefulset-example.yaml
  • 指定StorageClass的企业项目 CCE支持使用存储类创建云硬盘和对象存储类型PVC时指定企业项目,将创建的存储资源(云硬盘和对象存储)归属于指定的企业项目下,企业项目可选为集群所属的企业项目或default企业项目。 若不指定企业项目,则创建的存储资源默认使用存储类StorageClass中指定的企业项目,CCE提供的 csi-disk 和 csi-obs 存储类,所创建的存储资源属于default企业项目。 如果您希望通过StorageClass创建的存储资源能与集群在同一个企业项目,则可以自定义StorageClass,并指定企业项目ID,如下所示。 该功能需要Everest插件升级到1.2.33及以上版本。 kind: StorageClassapiVersion: storage.k8s.io/v1metadata: name: csi-disk-epid # 自定义名称provisioner: everest-csi-provisionerparameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SAS everest.io/enterprise-project-id: 86bfc701-9d9e-4871-a318-6385aa368183 # 指定企业项目id everest.io/passthrough: 'true'reclaimPolicy: DeleteallowVolumeExpansion: truevolumeBindingMode: Immediate
  • 自定义StorageClass 自定义高I/O类型StorageClass,使用YAML描述如下,这里取名为csi-disk-sas,指定云硬盘类型为SAS,即高I/O。 apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: csi-disk-sas # 高IO StorageClass名字,用户可自定义parameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SAS # 云硬盘高I/O类型,用户不可自定义 everest.io/passthrough: "true"provisioner: everest-csi-provisionerreclaimPolicy: DeletevolumeBindingMode: ImmediateallowVolumeExpansion: true # true表示允许扩容 超高I/O类型StorageClass,这里取名为csi-disk-ssd,指定云硬盘类型为SSD,即超高I/O。 apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: csi-disk-ssd # 超高I/O StorageClass名字,用户可自定义parameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SSD # 云硬盘超高I/O类型,用户不可自定义 everest.io/passthrough: "true"provisioner: everest-csi-provisionerreclaimPolicy: DeletevolumeBindingMode: ImmediateallowVolumeExpansion: true reclaimPolicy:底层云存储的回收策略,支持Delete、Retain回收策略。 Delete:删除PVC,PV资源与云硬盘均被删除。 Retain:删除PVC,PV资源与底层存储资源均不会被删除,需要手动删除回收。PVC删除后PV资源状态为“已释放(Released)”,不能直接再次被PVC绑定使用。 此处设置的回收策略对SFS Turbo类型的存储无影响,因此删除集群或删除PVC时不会回收包周期的SFS Turbo资源。 如果数据安全性要求较高,建议使用Retain以免误删数据。 定义完之后,使用kubectl create命令创建。 # kubectl create -f sas.yamlstorageclass.storage.k8s.io/csi-disk-sas created# kubectl create -f ssd.yamlstorageclass.storage.k8s.io/csi-disk-ssd created 再次查询StorageClass,回显如下,可以看到多了两个类型的StorageClass。 # kubectl get scNAME PROVISIONER AGEcsi-disk everest-csi-provisioner 17dcsi-disk-sas everest-csi-provisioner 2m28scsi-disk-ssd everest-csi-provisioner 16scsi-disk-topology everest-csi-provisioner 17dcsi-nas everest-csi-provisioner 17dcsi-obs everest-csi-provisioner 17dcsi-sfsturbo everest-csi-provisioner 17d 其他类型存储自定义方法类似,可以使用 kubectl 获取YAML,在YAML基础上根据需要修改。 文件存储 # kubectl get sc csi-nas -oyamlkind: StorageClassapiVersion: storage.k8s.io/v1metadata: name: csi-nasprovisioner: everest-csi-provisionerparameters: csi.storage.k8s.io/csi-driver-name: nas.csi.everest.io csi.storage.k8s.io/fstype: nfs everest.io/share-access-level: rw everest.io/share-access-to: 5e3864c6-e78d-4d00-b6fd-de09d432c632 # 集群所在VPC ID everest.io/share-is-public: 'false' everest.io/zone: xxxxx # 可用区reclaimPolicy: DeleteallowVolumeExpansion: truevolumeBindingMode: Immediate 对象存储 # kubectl get sc csi-obs -oyamlkind: StorageClassapiVersion: storage.k8s.io/v1metadata: name: csi-obsprovisioner: everest-csi-provisionerparameters: csi.storage.k8s.io/csi-driver-name: obs.csi.everest.io csi.storage.k8s.io/fstype: s3fs # 对象存储文件类型,s3fs是对象桶,obsfs是并行文件系统 everest.io/obs-volume-type: STANDARD # OBS桶的存储类别reclaimPolicy: DeletevolumeBindingMode: Immediate
  • 指定默认StorageClass 您还可以指定某个StorageClass作为默认StorageClass,这样在创建PVC时不指定StorageClassName就会使用默认StorageClass创建。 例如将csi-disk-ssd指定为默认StorageClass,则可以按如下方式设置。 apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: csi-disk-ssd annotations: storageclass.kubernetes.io/is-default-class: "true" # 指定集群中默认的StorageClass,一个集群中只能有一个默认的StorageClassparameters: csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io csi.storage.k8s.io/fstype: ext4 everest.io/disk-volume-type: SSD everest.io/passthrough: "true"provisioner: everest-csi-provisionerreclaimPolicy: DeletevolumeBindingMode: ImmediateallowVolumeExpansion: true 先删除之前创建的csi-disk-ssd,再使用kubectl create命令重新创建,然后再查询StorageClass,显示如下。 # kubectl delete sc csi-disk-ssdstorageclass.storage.k8s.io "csi-disk-ssd" deleted# kubectl create -f ssd.yamlstorageclass.storage.k8s.io/csi-disk-ssd created# kubectl get scNAME PROVISIONER AGEcsi-disk everest-csi-provisioner 17dcsi-disk-sas everest-csi-provisioner 114mcsi-disk-ssd (default) everest-csi-provisioner 9scsi-disk-topology everest-csi-provisioner 17dcsi-nas everest-csi-provisioner 17dcsi-obs everest-csi-provisioner 17dcsi-sfsturbo everest-csi-provisioner 17d
  • 配置验证 使用csi-disk-sas创建PVC。 apiVersion: v1kind: PersistentVolumeClaimmetadata: name: sas-diskspec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk-sas 创建并查看详情,如下所示,可以发现能够创建,且StorageClass显示为csi-disk-sas # kubectl create -f sas-disk.yaml persistentvolumeclaim/sas-disk created# kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEsas-disk Bound pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO csi-disk-sas 24s# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO Delete Bound default/sas-disk csi-disk-sas 30s 在CCE控制台界面上查看PVC详情,在“PV详情”页签下可以看到磁盘类型是高I/O。 不指定StorageClassName,使用默认配置,如下所示,并未指定storageClassName。 apiVersion: v1kind: PersistentVolumeClaimmetadata: name: ssd-diskspec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi 创建并查看,可以看到PVC ssd-disk的StorageClass为csi-disk-ssd,说明默认使用了csi-disk-ssd。 # kubectl create -f ssd-disk.yaml persistentvolumeclaim/ssd-disk created# kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEsas-disk Bound pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO csi-disk-sas 16mssd-disk Bound pvc-4d2b059c-0d6c-44af-9994-f74d01c78731 10Gi RWO csi-disk-ssd 10s# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpvc-4d2b059c-0d6c-44af-9994-f74d01c78731 10Gi RWO Delete Bound default/ssd-disk csi-disk-ssd 15spvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO Delete Bound default/sas-disk csi-disk-sas 17m 在CCE控制台界面上查看PVC详情,在“PV详情”页签下可以看到磁盘类型是超高I/O。
  • 应用现状 CCE中使用存储时,最常见的方法是创建PVC时通过指定StorageClassName定义要创建存储的类型,如下所示,使用PVC申请一个SAS(高I/O)类型云硬盘/块存储。 apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-evs-example namespace: default annotations: everest.io/disk-volume-type: SASspec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk 可以看到在CCE中如果需要指定云硬盘的类型,是通过everest.io/disk-volume-type: SAS字段指定,这里SAS是云硬盘的类型,代表高I/O,还有SSD(超高I/O)可以指定。 这种写法在如下几种场景下存在问题: 部分用户觉得使用everest.io/disk-volume-type指定云硬盘类型比较繁琐,希望只通过StorageClassName指定。 部分用户是从自建Kubernetes或其他Kubernetes服务切换到CCE,已经写了很多应用的YAML文件,这些YAML文件中通过不同StorageClassName指定不同类型存储,迁移到CCE上时,使用存储就需要修改大量YAML文件或Helm Chart包,这非常繁琐且容易出错。 部分用户希望能够设置默认的StorageClassName,所有应用都使用默认存储类型,在YAML中不用指定StorageClassName也能按创建默认类型存储。
  • 解决方案 本文介绍在CCE中自定义StorageClass的方法,并介绍设置默认StorageClass的方法,通过不同StorageClassName指定不同类型存储。 对于第一个问题:可以将SAS、SSD类型云硬盘分别定义一个StorageClass,比如定义一个名为csi-disk-sas的StorageClass,这个StorageClass创建SAS类型的存储,则前后使用的差异如下图所示,编写YAML时只需要指定StorageClassName,符合特定用户的使用习惯。 对于第二个问题:可以定义与用户现有YAML中相同名称的StorageClass,这样可以省去修改YAML中StorageClassName的工作。 对于第三个问题:可以设置默认的StorageClass,则YAML中无需指定StorageClassName也能创建存储,按如下写法即可。 apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-evs-example namespace: defaultspec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi
  • 查看组件日志 查看插件的Pod $ kubectl get pod -n kube-systemNAME READY STATUS RESTARTS AGEcsi-secrets-store-76tj2 3/3 Running 0 11hdew-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…日志信息略……
  • 实时感知SPC变化 在插件使用说明、定时轮转的演示中,其实已经使用到了实时感知SPC变化的能力。为了演示说明,在SPC对象中新增一个凭据secret_2,如下所示: apiVersion: secrets-store.csi.x-k8s.io/v1kind: SecretProviderClassmetadata: name: spc-testspec: provider: cce parameters: objects: | - objectName: "secret_1" objectVersion: "latest" objectType: "csms" - objectName: "secret_2" objectVersion: "v1" objectType: "csms" 更新该SPC对象后,新增的secret_2将很快挂载至引用了该SPC对象的Pod内。
  • 卸载插件 插件卸载时,会同时删除相关的CRD资源。即使重装插件,原有的SecretProviderClass对象也不可用,请谨慎操作。插件卸载再重装后,若需使用原有的SecretProviderClass资源,需重新手动创建。 登录CCE控制台,在“集群管理”中选择相应集群,然后单击左侧导航栏的“插件管理”,在“已安装插件”页签下,单击“dew-provider”下的“卸载”。 在弹出的窗口中,单击“是”,可卸载该插件。
  • 定时轮转 在插件使用说明,通过使用该插件,用户可完成基本的凭据挂载功能,即能够将存储在凭据管理服务中的凭据写入到Pod内。 若将在SPC对象中声明的凭据版本改为”latest”,如下所示: apiVersion: secrets-store.csi.x-k8s.io/v1kind: SecretProviderClassmetadata: name: spc-testspec: provider: cce parameters: objects: | - objectName: "secret_1" objectVersion: "latest" # change "v1"to "latest" objectType: "csms" 更新该SPC对象后,插件将周期性地向凭据管理服务发起请求,获取凭据secret_1最新版本的值,并将其刷新至引用了该SPC对象的Pod内。
  • 升级/编辑插件 登录CCE控制台,在“集群管理”中选择相应集群,然后在左侧导航栏中选择“插件管理”,在“已安装插件”页签下,单击“dew-provider”下的“ 升级”。 如果不存在“升级”按钮,则说明当前插件版本是最新的版本,不需要进行升级操作。可单击“编辑”按钮进行编辑,修改插件的配置参数。 升级或修改“dew-provider”插件时,会替换原先节点上的插件实例,并安装新的“dew-provider”插件。 在新console下升级插件时,默认升级为可用的最新版本。 参考安装插件中的参数说明进行参数配置,单击“确定”即可。
  • 插件说明 基本原理 dew-provider插件由两个组件组成,分别为secrets-store-csi-driver和dew-provider,两者均以DaemonSet的方式部署。 secrets-store-csi-driver负责维护两个CRD资源,即SecretProviderClass(以下简称为SPC)和SecretProviderClassPodStatus(以下简称为spcPodStatus),其中SPC用于描述用户感兴趣的凭据信息(比如指定凭据的版本、凭据的名称等),由用户创建,并在业务Pod中进行引用;spcPodStatus用于跟踪Pod与凭据的绑定关系,由csi-driver自动创建,用户无需关心。一个Pod对应一个spcPodStatus,当Pod正常启动后,会生成一个与之对应的spcPodStatus;当Pod生命周期结束时,相应的spcPodStatus也会被删除。 dew-provider负责与云凭据管理服务交互,从云凭据管理服务中获取指定的凭据,并挂载到业务Pod内。 功能说明 基础挂载能力:安装完该插件后,通过创建SecretProviderClass对象,在业务Pod中声明Volume并进行引用,当启动Pod时,就会将在SecretProviderClass对象中声明的凭据信息挂载至Pod内。 定时轮转能力:当Pod正常运行后,若其在SPC中声明的、存储在云凭据管理服务中的凭据发生了更新,通过定时轮转,可以将最新的凭据值刷新至Pod内。使用该能力时,需要将凭据的版本指定为”latest”。 实时感知SPC变化能力:当Pod正常运行后,若用户修改了在SPC中声明的凭据信息(如新增凭据、改变原有凭据的版本号等),插件可实时感知该变化,并将更新后的凭据刷新至Pod内。
  • 插件使用说明 创建ServiceAccount。 创建ServiceAccount对象,其中声明了允许业务使用的凭据名称,若用户引用了未在此处声明的凭据,则挂载失败,最终导致Pod无法运行。 根据如下模板创建serviceaccount.yaml,在cce.io/dew-resource字段中声明允许业务使用的凭据名称。这里声明了secret_1和secret_2,表示允许业务引用这两个凭据对象。在后续的操作中,若用户在业务中引用了secret_3,则无法通过校验,从而导致无法正常挂载该凭据,最终业务Pod将无法运行。 apiVersion: v1kind: ServiceAccountmetadata: 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 saNAME SECRETS AGEdefault 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/v1kind: SecretProviderClassmetadata: name: spc-testspec: provider: cce # 固定为cce parameters: objects: | - objectName: "secret_1" objectVersion: "v1" objectType: "csms" 参数 参数类型 是否必选 参数说明 objectName String 是 凭据名称。若同一个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 spcNAME AGEspc-test 20h 至此,一个名为“spc-test”的SecretProviderClass对象已正常创建。该对象将在后续的业务Pod中被引用。 创建业务Pod。 这里以创建一个nginx应用为例。 定义业务负载,在serviceAccountName中引用此前创建好的ServiceAccount对象,secretProviderClass中引用此前创建好的SPC对象,并在mountPath中指定容器内的挂载路径(这里需注意,用户不应该指定”/”,” /var/run”等特殊目录,否则可能影响容器的正常启动)。 apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-spc labels: app: nginxspec: 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 执行 kubectl apply -f deployment.yaml 创建业务Pod。 查看Pod是否已经正常创建,如下所示: $ kubectl get podNAME READY STATUS RESTARTS AGEnginx-spc-67c9d5b594-642np 1/1 Running 0 20s 进入容器,查看指定的凭据是否正常写入。如下所示: $ kubectl exec -ti nginx-spc-67c9d5b594-642np -- /bin/bashroot@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# lssecret_1 可以看到,用户在SPC对象中声明的secret_1已正常写入Pod。 此外,还可以通过获取spcPodStatus查看Pod与凭据的绑定情况。如下所示: $ kubectl get spcpsNAME AGEnginx-spc-67c9d5b594-642np-default-spc-test 103s$ kubectl get spcps nginx-spc-67c9d5b594-642np-default-spc-test -o yaml......status:mounted: trueobjects: # 挂载的凭据信息- id: secret_1version: v1podName: nginx-spc-67c9d5b594-642np # 引用了SPC对象的PodsecretProviderClassName: spc-test # SPC对象targetPath: /mnt/paas/kubernetes/kubelet/pods/6dd29596-5b78-44fb-9d4c-a5027c420617/volumes/kubernetes.io~csi/secrets-store-inline/mount
  • 约束与限制 数据加密服务包含密钥管理(Key Management Service, KMS)、云凭据管理(Cloud Secret Management Service,CSMS)和密钥对管理(Key Pair Service, KPS)等服务。当前,该插件仅支持对接其中的云凭据管理服务。 支持的集群版本:v1.19+。 支持的集群类型:CCE集群和CCE Turbo集群。 允许创建的SecretProviderClass对象个数上限:500个。
  • 安装插件 登录CCE控制台,单击左侧导航栏的“插件市场”,在“插件市场”页签下,单击“dew-provider”下的“安装”按钮。 在安装插件页面,选择安装的集群,在参数配置栏进行参数配置。参数配置说明如下。 参数 参数说明 rotation_poll_interval 轮转时间间隔。单位:分钟,即m(注意不是min)。 轮转时间间隔表示向云凭据管理服务发起请求并获取最新的凭据的周期,合理的时间间隔范围为[1m, 1440m],默认值为2m。 单击“安装”。 待插件安装完成后,选择对应的集群,然后单击左侧导航栏的“插件管理”,可在“已安装插件”页签中查看相应的插件。
  • 约束与限制 Pod间互访设置QoS限速支持容器隧道网络模型、VPC网络模型和云原生2.0网络模型,其中VPC网络模型和云原生2.0模型在使用Pod网络限速时需遵循以下约束: 仅支持1.19.10以上的集群版本。 仅支持普通容器(容器运行时为runc),不支持安全容器(容器运行时为kata)。 仅支持限制Pod访问Pod的场景限速,不对访问节点,对外访问产生影响。 带宽限速上限值为机型带宽上限和4.3G两者之间的最小值。 目前仅支持兆(M)级别以上的限速。
  • 前提条件 集群必须已安装nginx-ingress插件,具体操作可参考安装插件。 Ingress为后端工作负载提供网络访问,因此集群中需提前部署可用的工作负载。若您无可用工作负载,可参考创建无状态负载(Deployment)、创建有状态负载(StatefulSet)或创建守护进程集(DaemonSet)部署工作负载。 为上述工作负载配置ClusterIP类型或NodePort类型的Service,可参考集群内访问(ClusterIP)或节点访问(NodePort)配置示例Service。 选择HTTPS协议对外提供访问时,需要提前创建IngressTLS类型的密钥证书,创建密钥的方法请参见创建密钥。
  • 操作步骤 您可以通过对Pod添加annotations指定Pod出口带宽和入口带宽,如下所示。 apiVersion: v1kind: Podmetadata: annotations: kubernetes.io/ingress-bandwidth: 100M kubernetes.io/egress-bandwidth: 100M... kubernetes.io/ingress-bandwidth:Pod的入口带宽 kubernetes.io/egress-bandwidth:Pod的出口带宽 如果不设置这两个参数,则表示不限制带宽。
  • networking.k8s.io/v1版本Ingress说明 CCE在1.23版本集群开始Ingress切换到networking.k8s.io/v1版本。 v1版本参数相较v1beta1参数有如下区别。 ingress类型由annotations中kubernetes.io/ingress.class变为使用spec.ingressClassName字段。 backend的写法变化。 每个路径下必须指定路径类型pathType,支持如下类型。 ImplementationSpecific: 对于这种路径类型,匹配方法取决于具体Ingress Controller的实现。在CCE中会使用ingress.beta.kubernetes.io/url-match-mode指定的匹配方式,这与v1beta1方式相同。 Exact:精确匹配 URL 路径,且区分大小写。 Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个匹配。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。
  • Grafana数据持久化 当前Prometheus插件中Grafana数据没做持久化,如果Grafana容器重启会导致数据丢失。您可以给Grafana容器挂载云存储,从而实现Grafana数据持久化。 请参见通过kubectl连接集群,使用kubectl连接Grafana所在集群。 创建云硬盘存储PVC。 apiVersion: v1kind: PersistentVolumeClaimmetadata: name: grafana-pvc namespace: monitoring annotations: everest.io/disk-volume-type: SSD labels: failure-domain.beta.kubernetes.io/region: cn-north-4 failure-domain.beta.kubernetes.io/zone: cn-north-4bspec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk 云硬盘必须与Grafana所在节点在同一个可用区,否则无法挂载。 failure-domain.beta.kubernetes.io/region:云硬盘所在的区域。 failure-domain.beta.kubernetes.io/zone:云硬盘所在的AZ。 storage:云硬盘大小,请根据需要选择。 您还可以在CCE控制台创建云硬盘存储,具体方法请参见使用存储类创建PVC。 修改Grafana工作负载配置,挂载云硬盘。 kubectl edit deploy grafana -n monitoring 在YAML文件中给容器添加云硬盘挂载,如下所示。其中PVC名称必须与2中名称一致,挂载路径必须为“/var/lib/grafana”。 另外必须修改grafana负载的升级策略,最大Pod数量为1。 ... template: spec: volumes: - name: cce-pvc-grafana persistentVolumeClaim: claimName: grafana-pvc... containers: - volumeMounts: - name: cce-pvc-grafana mountPath: /var/lib/grafana... strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 修改完成后保存配置,Grafana负载会升级并挂载云硬盘。
  • 查看流量统计 dolphin插件的监控信息以普罗米修斯exporter格式输出,有两种方式获取dolphin插件的监控信息: 安装prometheus插件,prometheus插件会自动对接dolphin插件并周期性采集监控信息。 直接访问dolphin插件提供的服务端口10001,形如http://{POD_IP}:10001/metrics 注意,如果在节点上访问dolphin服务端口,需要放通节点和pod的安全组限制。 您可以通过安装Prometheus插件查看监控信息,Prometheus插件的使用方法请参见使用Prometheus插件监控。 表1 当前支持的监控指标 监控指标 对应参数 ipv4发送公网报文数 ip4_send_pkt_internet ipv4发送公网字节数 ip4_send_byte_internet ipv4接收报文数 ip4_rcv_pkt ipv4接收字节数 ip4_rcv_byte ipv4发送报文数 ip4_send_pkt ipv4发送字节数 ip4_send_byte 示例1(ipv4发送公网报文数): dolphin_ip4_send_pkt_internet{app="nginx",pod="default/nginx-66c9c65dbf-zjg24",task="kube-system/example-task "} 241 如上示例中,pod所在命名空间为default,pod名称为nginx-66c9c65dbf-zjg24,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该pod的发送公网报文数为241。 示例2(ipv4发送公网字节数): dolphin_ip4_send_byte_internet{app="nginx",pod="default/nginx-66c9c65dbf-zjg24",task="kube-system/example-task" } 23618 如上示例中,pod所在命名空间为default,pod名称为nginx-66c9c65dbf-zjg24,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该pod的发送公网字节数为23618。 示例3(ipv4发送报文数): dolphin_ip4_send_pkt{app="nginx",pod="default/nginx-66c9c65dbf-zjg24",task="kube-system/example-task "} 379 如上示例中,pod所在命名空间为default,pod名称为nginx-66c9c65dbf-zjg24,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该pod的发送报文数为379。 示例4(ipv4发送字节数): dolphin_ip4_send_byte{app="nginx",pod="default/nginx-66c9c65dbf-zjg24",task="kube-system/example-task "} 33129 如上示例中,pod所在命名空间为default,pod名称为nginx-66c9c65dbf-zjg24,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该pod的发送字节数为33129。 示例5(ipv4接收报文数): dolphin_ip4_rcv_pkt{app="nginx",pod="default/nginx-66c9c65dbf-zjg24",task="kube-system/example-task "} 464 如上示例中,pod所在命名空间为default,pod名称为nginx-66c9c65dbf-zjg24,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该pod的接收报文数为464。 示例6(ipv4接收字节数): dolphin_ip4_rcv_byte{app="nginx",pod="default/nginx-66c9c65dbf-zjg24",task="kube-system/example-task "} 34654 如上示例中,pod所在命名空间为default,pod名称为nginx-66c9c65dbf-zjg24,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该pod的接收字节数为34654。 若容器无用户指定的标签,返回体中标签值为not found。形如: dolphin_ip4_send_byte_internet{test="not found", pod="default/nginx-66c9c65dbf-zjg24",task="default" } 23618
  • 插件简介 dolphin是一款容器网络流量监控管理插件,当前版本可支持从CCE Turbo集群安全容器以及运行时为containerd的普通容器的流量统计。 当前支持流量统计信息ipv4发送公网报文数和字节数、ipv4接收报文数和字节数以及ipv4发送报文数和字节数,且支持通过PodSelector来对监控后端作选择,支持多监控任务、可选监控指标,且支持用户获取Pod的label标签信息。监控信息已适配Prometheus格式,可以通过调用Prometheus接口查看监控数据。
  • 下发监控任务 当前用户可通过创建CR的方式下发监控任务,当前用户可以通过API或登录工作节点kubectl apply的方式创建CR,后续将支持前端界面的创建。一个CR代表着一个监控任务,提供selector、podLabel、ip4Tx等可选参数,具体参考以下CR的创建模板: apiVersion: crd.dolphin.io/v1 kind: MonitorPolicy metadata: name: example-task #监控任务名 namespace: kube-system #必填,namespace必须为kube-system spec: selector: #选填,配置dolphin插件监控的后端,形如labelSelector格式,默认将监控本节点所有容器 matchLabels: app: nginx matchExpressions: - key: app operator: In values: - nginx podLabel: [app] #选填,用户标签 ip4Tx: #选填,ipv4发送报文数和发送字节数这两个指标的开关,默认不开 enable: true ip4Rx: #选填,ipv4接收报文数和发送字节数这两个指标的开关,默认不开 enable: true ip4TxInternet: #选填,ipv4发送公网报文数和发送公网字节数这两个指标的开关,默认不开 enable: true
  • 购买节点步骤 CCE Turbo集群创建完成后,您可以在集群中购买节点。 单击创建的CCE Turbo集群卡片下方的“购买节点”按钮,在节点配置步骤中参照如下表格设置节点参数。 计算配置: 配置节点云服务器的规格与操作系统,为节点上的容器应用提供基本运行环境。 表1 计算配置参数 参数 参数说明 可用区 节点云服务器所在的可用区,集群下节点创建在不同可用区下可以提高可靠性。创建后不可修改。 建议您选择“随机分配”,可根据选择的节点规格随机分配一个可以使用的可用区。 可用区是在同一区域下,电力、网络隔离的物理区域,可用区之间内网互通,不同可用区之间物理隔离。如果您需要提高工作负载的高可靠性,建议您将云服务器创建在不同的可用区。 容器运行时 选择节点上容器使用的运行时(Runtime),不同容器运行时支持的节点规格不同,创建后不可修改。 普通容器:runc运行时。使用控制台创建默认使用Docker容器引擎。 安全容器:kata运行时。节点选择安全容器后,创建工作负载时如果也选择“安全容器”,则该工作负载只能运行在使用安全容器的节点上。默认使用Containerd容器引擎。 两种容器运行时的对比请参见普通容器与安全容器的区别。 节点规格 请根据业务需求选择相应的节点规格。 CCE Turbo集群的节点目前仅支持基于擎天软硬件协同架构的机型。 操作系统 公共镜像:请选择节点对应的操作系统。 私有镜像:裸金属服务器支持使用私有镜像,私有镜像制作方法具体请参见制作CCE节点自定义镜像。 节点名称 节点云服务器使用的名称,不支持重名,批量创建时将作为云服务器名称的前缀。 系统会默认生成名称,支持修改。 节点名称以小写字母开头,支持小写字母、数字和中划线(-),不能以中划线(-)结尾。 登录方式 支持密码和密钥对。 选择“密码”:用户名默认为“root”,请输入登录节点的密码,并确认密码。 登录节点时需要使用该密码,请妥善管理密码,系统无法获取您设置的密码内容。 选择“密钥对”:选择用于登录本节点的密钥对,支持选择共享密钥。 密钥对用于远程登录节点时的身份认证。若没有密钥对,可单击选项框右侧的“创建密钥对”来新建,创建密钥对操作步骤请参见创建密钥对。 存储配置: 配置节点云服务器上的存储资源,方便节点上的容器软件与容器应用使用。请根据实际场景设置磁盘大小。 表2 存储配置参数 参数 参数说明 系统盘 节点云服务器使用的系统盘,供操作系统使用。您可以设置系统盘的规格为40GB-1024GB之间的数值,缺省值为50GB。 数据盘 节点云服务器使用的数据盘,供容器运行时和Kubelet组件使用。您可以设置数据盘的规格为100GB-32768GB之间的数值,缺省值为100GB。数据盘可提供的云硬盘类型与上方系统盘一致。 注意: 若数据盘卸载或损坏,会导致docker服务异常,最终导致节点不可用。建议不要删除该数据盘。 单击后方的“展开高级设置”可进行如下设置: 自定义空间分配:勾选后可定义容器运行时在数据盘上占用的空间比例,容器运行时的空间用于存放容器运行时工作目录、容器镜像数据以及镜像元数据。 加密:数据盘加密功能可为您的数据提供强大的安全防护,加密磁盘生成的快照及通过这些快照创建的磁盘将自动继承加密功能。 默认不加密。 点选“加密”后,可在弹出的“加密设置”对话框中,选择已有的密钥,若没有可选的密钥,请单击后方的链接创建新密钥,完成创建后单击刷新按钮。 网络配置: 配置节点云服务器的网络资源,用于访问节点和容器应用。 表3 网络配置参数 参数 参数说明 节点子网 节点子网默认使用创建集群时的子网配置,可在此进行修改。创建后不可修改。 高级配置: 节点能力增强,可在此配置节点的标签、污点、启动命令等功能。 表4 高级配置参数 参数 参数说明 K8S标签 单击“添加标签”可以设置附加到Kubernetes 对象(比如Pods)上的键值对,最多可以添加10条标签 使用该标签可区分不同节点,可结合工作负载的亲和能力实现容器Pod调度到指定节点的功能。详细请参见Labels and Selectors。 资源标签 通过为资源添加标签,可以对资源进行自定义标记,实现资源的分类。 您可以在TMS中创建“预定义标签”,预定义标签对所有支持标签功能的服务资源可见,通过使用预定义标签可以提升标签创建和迁移效率。具体请参见创建预定义标签。 CCE服务会自动帮您创建CCE-Dynamic-Provisioning-Node=节点id的标签。 Taints 默认为空。支持给节点加Taints来设置反亲和性,每个节点最多配置10条Taints,每条Taints包含以下3个参数: Key:必须以字母或数字开头,可以包含字母、数字、连字符、下划线和点,最长63个字符;另外可以使用DNS子域作为前缀。 Value:必须以字符或数字开头,可以包含字母、数字、连字符、下划线和点,最长63个字符。 Effect:只可选NoSchedule,PreferNoSchedule或NoExecute。 须知: Taints配置时需要配合Pod的toleration使用,否则可能导致扩容失败或者Pod无法调度到扩容节点。 节点池创建后可单击列表项的“编辑”修改配置,修改后将同步到节点池下的已有节点。 最大实例数 节点最大可以正常运行的实例数(Pod),该数量包含系统默认实例,取值范围为16~256。 该设置的目的为防止节点因管理过多实例而负载过重,请根据您的业务需要进行设置,相关说明请参见节点最多可以创建多少个Pod。 云服务器组 云服务器组是对云服务器的一种逻辑划分,同一云服务器组中的云服务器遵从同一策略。 反亲和性策略:同一云服务器组中的云服务器分散地创建在不同主机上,提高业务的可靠性。 选择已创建的云服务器组,或单击“新建云服务器组”创建,创建完成后单击刷新按钮。 安装前执行脚本 请输入脚本命令,大小限制为0~1000字符。 脚本将在Kubernetes软件安装前执行,可能导致Kubernetes软件无法正常安装,需谨慎使用。常用于格式化数据盘等场景。 安装后执行脚本 请输入脚本命令,大小限制为0~1000字符。 脚本将在Kubernetes软件安装后执行,不影响Kubernetes软件安装。常用于修改Docker配置参数等场景。 委托 委托是由租户管理员在统一身份认证服务上创建的。通过委托,可以将云主机资源共享给其他帐号,或委托更专业的人或团队来代为管理。 如果没有委托请单击右侧“新建委托”创建。 单击“下一步:配置确认”,确认所设置的服务选型参数、规格和费用等信息。 确认规格和费用后,单击“提交”,节点开始创建。 若选择购买“包年包月”的节点,请单击“去支付”,根据界面提示进行付款操作。 系统将自动跳转到节点列表页面,待节点状态为“可用”,表示节点添加成功。添加节点预计需要6-10分钟左右,请耐心等待。 单击“返回节点列表”,待状态为可用,表示节点创建成功。
  • 约束与限制 创建节点过程中会使用域名方式从OBS下载软件包,需要能够使用云上内网DNS解析OBS域名,否则会导致创建不成功。为此,节点所在子网需要配置为内网DNS地址,从而使得节点使用内网DNS。在创建子网时DNS默认配置为内网DNS,如果您修改过子网的DNS,请务必确保子网下的DNS服务器可以解析OBS服务域名,否则需要将DNS改成内网DNS。 CCE Turbo集群的节点目前仅支持基于擎天软硬件协同架构的机型。
  • 通过工作负载YAML进行DNS配置 您也可以通过YAML的方式创建工作负载,以nginx应用为例,其YAML文件中的DNS配置示例如下: apiVersion: apps/v1kind: Deploymentmetadata: name: nginx namespace: defaultspec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: container-1 image: nginx:latest imagePullPolicy: IfNotPresent imagePullSecrets: - name: default-secret dnsPolicy: None dnsConfig: options: - name: ndots value: '5' - name: timeout value: '3' nameservers: - 10.2.3.4 searches: - my.dns.search.suffix dnsPolicy字段说明: dnsPolicy字段是应用设置的DNS策略,默认值为“ClusterFirst”。基于dnsPolicy策略生成的域名解析文件会与dnsConfig设置的DNS参数进行合并,合并规则将在表2中说明,dnsPolicy当前支持四种参数值: 表1 dnsPolicy字段说明 参数 说明 ClusterFirst(默认值) 应用对接CoreDNS(CCE集群的CoreDNS默认级联云上DNS)。这种场景下,容器既能够解析service注册的集群内部域名,也能够解析发布到互联网上的外部域名。由于该配置下,域名解析文件设置了search搜索域列表和ndots: 5,因此当访问外部域名和集群内部长域名(如kubernetes.default.svc.cluster.local)时,大部分域名都会优先遍历search搜索域列表,导致至少有6次无效的DNS查询,只有访问集群内部短域名(如kubernetes)时,才不存在无效的DNS查询。 ClusterFirstWithHostNet 对于配置主机网络的应用,即设置hostNetwork字段为true时,默认对接kubelet的“--resolv-conf”参数指向的域名解析文件(CCE集群在该配置下对接云上DNS)。如需对接集群的Kube-DNS/CoreDNS,dnsPolicy字段需设置为ClusterFirstWithHostNet,此时容器的域名解析文件配置与“ClusterFirst”一致,也存在无效的DNS查询。 ...spec: containers: - image: nginx:latest imagePullPolicy: IfNotPresent name: container-1 restartPolicy: Always hostNetwork: true dnsPolicy: ClusterFirstWithHostNet Default 容器的域名解析文件使用kubelet的“--resolv-conf”参数指向的域名解析文件(CCE集群在该配置下对接云上DNS),没有配置search搜索域列表和options。该配置只能解析注册到互联网上的外部域名,无法解析集群内部域名,且不存在无效的DNS查询。 None 设置为None之后,必须设置dnsConfig字段,此时容器的域名解析文件将完全通过dnsConfig的配置来生成。 此处如果dnsPolicy字段未被指定,其默认值为ClusterFirst,而不是Default。 dnsConfig字段说明: dnsConfig为应用设置DNS参数,设置的参数将合并到基于dnsPolicy策略生成的域名解析文件中。当dnsPolicy为“None”,应用的域名解析文件完全由dnsConfig指定;当dnsPolicy不为“None”时,会在基于dnsPolicy生成的域名解析文件的基础上,追加dnsConfig中配置的dns参数。 表2 dnsConfig字段说明 参数 说明 options DNS的配置选项,其中每个对象可以具有name属性(必需)和value属性(可选)。该字段中的内容将合并到基于dnsPolicy生成的域名解析文件的options字段中,dnsConfig的options的某些选项如果与基于dnsPolicy生成的域名解析文件的选项冲突,则会被dnsConfig所覆盖。 nameservers DNS的IP地址列表。当应用的dnsPolicy设置为“None”时,列表必须至少包含一个IP地址,否则此属性是可选的。列出的DNS的IP列表将合并到基于dnsPolicy生成的域名解析文件的nameserver字段中,并删除重复的地址。 searches 域名查询时的DNS搜索域列表,此属性是可选的。指定后,提供的搜索域列表将合并到基于dnsPolicy生成的域名解析文件的search字段中,并删除重复的域名。Kubernetes最多允许6个搜索域。
  • DNS配置项说明 在Linux系统的节点或者容器里执行cat /etc/resolv.conf命令,能够查看到DNS配置,以Kubernetes集群的容器DNS配置为例: nameserver 10.247.x.xsearch default.svc.cluster.local svc.cluster.local cluster.localoptions ndots:5 配置项说明: nameserver:容器解析域名时查询的DNS服务器的IP地址列表。如果设置为10.247.x.x说明DNS对接到Kube-DNS/CoreDNS,如果是其他IP地址,则表示采用云上DNS或者用户自建的DNS。 search:定义域名的搜索域列表,当访问的域名不能被DNS解析时,会把该域名与搜索域列表中的域依次进行组合,并重新向DNS发起请求,直到域名被正确解析或者尝试完搜索域列表为止。对于CCE集群来说,容器的搜索域列表配置3个域,当解析一个不存在的域名时,会产生8次DNS查询,因为对于每个域名需要查询两次,分别是IPv4和IPv6。 options:定义域名解析配置文件的其他选项,常见的有timeout、ndots等等。 Kubernetes集群容器的域名解析文件设置为options ndots:5,该参数的含义是当域名的“.”个数小于ndots的值,会先把域名与search搜索域列表进行组合后进行DNS查询,如果均没有被正确解析,再以域名本身去进行DNS查询。当域名的“.”个数大于或者等于ndots的值,会先对域名本身进行DNS查询,如果没有被正确解析,再把域名与search搜索域列表依次进行组合后进行DNS查询。 如查询www.***.com域名时,由于该域名的“.”个数为2,小于ndots的值,所以DNS查询请求的顺序依次为:www.***.default.svc.cluster.local、www.***.com.svc.cluster.local、 www.***.com.cluster.local和 www.***.com,需要发起至少7次DNS查询请求才能解析出该域名的IP。可以看出,这种配置在访问外部域名时,存在大量冗余的DNS查询,存在优化点。 完整的Linux域名解析文件配置项说明可以参考文档:http://man7.org/linux/man-pages/man5/resolv.conf.5.html。
共100000条