华为云用户手册

  • 注意事项 重置节点功能不会重置控制节点,仅能对工作节点进行重置操作,如果重置后节点仍然不可用,请删除该节点重新创建。 重置节点将对节点操作系统进行重置安装,节点上已运行的工作负载业务将会中断,请在业务低峰期操作。 节点重置后系统盘和docker数据盘将会被清空,重置前请事先备份重要数据。 用户节点如果有自行挂载了数据盘,重置完后会清除挂载信息,请事先备份重要数据,重置完成后请重新执行挂载行为,数据不会丢失。 节点上的工作负载实例的IP会发生变化,但是不影响容器网络通信。 云硬盘必须有剩余配额。 操作过程中,后台会把当前节点设置为不可调度状态。
  • 集群的网络 从网络的角度看,集群的节点都位于VPC之内,节点上又运行着容器,每个容器都需要访问,节点与节点、节点与容器、容器与容器都需要访问。 集群的网络可以分成三个网络来看。 节点网络:为集群内节点分配IP地址。 容器网络:为集群内容器分配IP地址,负责容器的通信,当前支持多种容器网络模型,不同模型有不同的工作机制。 服务网络:服务(Service)是用来解决访问容器的Kubernetes对象,每个Service都有一个固定的IP地址。 在创建集群时,您需要为各个网络选择合适的网段,确保各网段之间不存在冲突,每个网段下有足够的IP地址可用。集群创建后不支持修改容器网络模型,您需要在创建前做好规划和选择。 强烈建议您在创建集群前详细了解集群的网络以及容器网络模型,具体请参见网络概述。
  • 创建Deployment挂载已有数据卷 新建一个deployment的yaml文件,deployment-test.yaml。 配置示例: apiVersion: apps/v1kind: Deploymentmetadata: name: test-turbo-subpath-example namespace: default generation: 1 labels: appgroup: ''spec: replicas: 1 selector: matchLabels: app: test-turbo-subpath-example template: metadata: labels: app: test-turbo-subpath-example spec: containers: - image: nginx:latest name: container-0 volumeMounts: - mountPath: /tmp name: pvc-sfs-turbo-example restartPolicy: Always imagePullSecrets: - name: default-secret volumes: - name: pvc-sfs-turbo-example persistentVolumeClaim: claimName: sfs-turbo-test 其中: name:创建的工作负载名称。 image:工作负载的镜像。 mountPath:容器内挂载路径,示例中挂载到“/tmp”路径。 claimName:已有的pvc名称。 kubectl create -f deployment-test.yaml创建deployment负载。
  • Statefulset动态创建subpath模式的数据卷 新建一个statefulset的yaml文件,statefulset-test.yaml。 配置示例: apiVersion: apps/v1kind: StatefulSetmetadata: name: test-turbo-subpath namespace: default generation: 1 labels: appgroup: ''spec: replicas: 2 selector: matchLabels: app: test-turbo-subpath template: metadata: labels: app: test-turbo-subpath annotations: metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]' pod.alpha.kubernetes.io/initialized: 'true' spec: containers: - name: container-0 image: 'nginx:latest' env: - name: PAAS_APP_NAME value: deploy-sfs-nfs-rw-in - name: PAAS_NAMESPACE value: default - name: PAAS_PROJECT_ID value: 8190a2a1692c46f284585c56fc0e2fb9 resources: {} volumeMounts: - name: sfs-turbo-160024548582479676 mountPath: /tmp terminationMessagePath: /dev/termination-log terminationMessagePolicy: File imagePullPolicy: IfNotPresent restartPolicy: Always terminationGracePeriodSeconds: 30 dnsPolicy: ClusterFirst securityContext: {} imagePullSecrets: - name: default-secret affinity: {} schedulerName: default-scheduler volumeClaimTemplates: - metadata: name: sfs-turbo-160024548582479676 namespace: default annotations: {} spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: sfsturbo-sc-test serviceName: wwww podManagementPolicy: OrderedReady updateStrategy: type: RollingUpdate revisionHistoryLimit: 10 其中: name:创建的工作负载名称。 image:工作负载的镜像。 mountPath:容器内挂载路径,示例中挂载到“/tmp”路径。 “spec.template.spec.containers.volumeMounts.name ”和 “spec.volumeClaimTemplates.metadata.name”有映射关系,必须保持一致。 storageClassName: 填写自建的sc名称。 kubectl create -f statefulset-test.yaml创建statefulset负载。
  • Kubernetes集群架构 Kubernetes集群包含Master节点(控制节点)和Node节点(计算节点/工作节点),应用部署在Node节点上,且可以通过配置选择应用部署在某些特定的节点上。 通过云容器引擎服务创建的集群,Master节点将由云容器引擎服务托管,您只需创建Node节点。 Kubernetes集群的架构如下所示: 图1 Kubernetes集群架构 Master节点 Master节点是集群的控制节点,由API Server、Scheduler、Controller Manager和ETCD四个组件构成。 API Server:各组件互相通讯的中转站,接受外部请求,并将信息写到ETCD中。 Controller Manager:执行集群级功能,例如复制组件,跟踪Node节点,处理节点故障等等。 Scheduler:负责应用调度的组件,根据各种条件(如可用的资源、节点的亲和性等)将容器调度到Node上运行。 ETCD:一个分布式数据存储组件,负责存储集群的配置信息。 在生产环境中,为了保障集群的高可用,通常会部署多个Master,如CCE的集群高可用模式就是3个Master节点。 Node节点 Node节点是集群的计算节点,即运行容器化应用的节点。 kubelet:kubelet主要负责同Container Runtime打交道,并与API Server交互,管理节点上的容器。 kube-proxy:应用组件间的访问代理,解决节点上应用的访问问题。 Container Runtime:容器运行时,如Docker,最主要的功能是下载镜像和运行容器。
  • 创建subpath类型SFS Turbo存储卷 subpath模式的卷请勿通过前端进行“扩容”、“解关联”、“删除”等操作。 创建SFS turbo资源,选择网络时,请选择与集群相同的vpc与子网。 新建一个sc的yaml文件,例如sfsturbo-sc-test.yaml。 配置示例: apiVersion: storage.k8s.io/v1allowVolumeExpansion: truekind: StorageClassmetadata: name: sfsturbo-sc-testmountOptions:- lockparameters: csi.storage.k8s.io/csi-driver-name: sfsturbo.csi.everest.io csi.storage.k8s.io/fstype: nfs everest.io/archive-on-delete: "true" everest.io/share-access-to: 7ca2dba2-1234-1234-1234-626371a8fb3a everest.io/share-expand-type: bandwidth everest.io/share-export-location: 192.168.1.1:/sfsturbo/ everest.io/share-source: sfs-turbo everest.io/share-volume-type: STANDARD everest.io/volume-as: subpath everest.io/volume-id: 0d773f2e-1234-1234-1234-de6a35074696provisioner: everest-csi-provisionerreclaimPolicy: DeletevolumeBindingMode: Immediate 其中: name:storageclass的名称。 mountOptions:选填字段;mount挂载参数。 everest 1.2.8以下,1.1.13以上版本仅开放对nolock参数配置,mount操作默认使用nolock参数,无需配置。nolock=false时,使用lock参数。 everest 1.2.8及以上版本支持更多参数,默认使用如下所示配置,具体请参见设置挂载参数。此处不能配置为nolock=true,会导致挂载失败。 mountOptions:- vers=3- timeo=600- nolock- hard everest.io/volume-as:该参数需设置为“subpath”来使用subpath模式。 everest.io/share-access-to:选填字段。subpath模式下,填写SFS Turbo资源的所在VPC的ID。 everest.io/share-expand-type:选填字段。若SFS Turbo资源存储类型为增强版(标准型增强版、性能型增强版),设置为bandwidth。 everest.io/share-export-location:挂载根配置。由SFS Turbo共享路径和子目录组成,共享路径可至SFS Turbo服务页面查询,子路径由用户自定义,后续指定该sc创建的pvc均位于该子目录下。 everest.io/share-volume-type:选填字段。填写SFS Turbo的类型。标准型为STANDARD,性能型为PERFORMANCE。对于增强型需配合“everest.io/share-expand-type”字段使用,everest.io/share-expand-type设置为“bandwidth”。 everest.io/zone:选填字段。指定SFS Turbo资源所在的可用区。 everest.io/volume-id:SFS Turbo资源的卷ID,可至SFS Turbo界面查询。 everest.io/archive-on-delete:若该参数设置为“true”,在回收策略为“Delete”时,删除pvc会将pv的原文档进行归档,归档目录的命名规则“archived-$pv名称.时间戳”,为“false”时,会将pv对应的SFS Turbo子目录删除。默认进行归档。 执行kubectl create -f sfsturbo-sc-test.yaml。 新建一个pvc的yaml文件,sfs-turbo-test.yaml。 配置示例: apiVersion: v1kind: PersistentVolumeClaimmetadata: name: sfs-turbo-test namespace: defaultspec: accessModes: - ReadWriteMany resources: requests: storage: 50Gi storageClassName: sfsturbo-sc-test volumeMode: Filesystem 其中: name: PVC的名称。 storageClassName:SC的名称。 storage:subpath模式下,该参数无实际意义,容量受限于Turbo资源的总容量,若Turbo资源总容量不足,请及时到Turbo界面扩容。 执行kubectl create -f sfs-turbo-test.yaml。 对subpath类型的SFS Turbo扩容时,没有实际的扩容意义。该操作不会对SFS Turbo资源进行实际的扩容,需要用户自行保证Turbo的总容量不被耗尽。
  • 查看/切换视图 登录CCE控制台,单击集群名称进入集群详情页。 在左侧导航栏中选择“容器智能分析”,单击“仪表盘”页签,默认展示集群视图。 设置查看视图的相关参数。各个视图可供设置的参数不同,请参见表1。 设置视图的时间窗。 在页面右上角处,选择时间段,或者自定义时间,并单击刷新界面。 容器智能分析仪表盘提供了预置视图,您可单击视图名称边上的“切换视图”按钮,选择需要的视图查看监控数据。系统预置视图如表1所示。 表1 预置视图 视图名称 视图参数 视图中包含的监控指标 集群视图(默认视图) 集群 节点数 磁盘不可用节点数 不可用节点数 CPU使用率 CPU Requests水位 CPU Limits水位 内存使用率 内存Requests水位 内存Limits水位 Pod数 容器数 CPU使用量 内存使用量 网络接收速率 网络发送速率 网络平均接收速率 网络平均发送速率 接收数据包速率 发送数据包速率 丢包速率(接收) 丢包速率(发送) 磁盘读写IO速率(读+写) 磁盘读写吞吐量(读+写) APIServer视图 集群 实例 存活数 QPS 请求成功率(读) 处理中请求数 请求速率(读) 请求错误率(读) 请求时延(读)(P99) 请求速率(写) 请求错误率(写) 请求时延(写)(P99) 工作队列增加速率 工作队列深度 工作队列时延(P99) 内存使用量 CPU使用量 Go routine数 Pod视图 集群 命名空间 pod 容器数 运行中容器数 Pod状态 容器重启次数 CPU使用量 CPU Throttling 内存使用量 网络接收速率 网络发送速率 接收数据包速率 发送数据包速率 丢包速率(接收) 丢包速率(发送) Pod磁盘读写IO速率(读+写) Pod磁盘读写吞吐量(读+写) 容器磁盘读写IO速率(读+写) 容器磁盘读写吞吐量(读+写) 文件系统使用率 文件系统使用量 主机视图 集群 节点 CPU使用率 平均负载 内存使用量 内存使用率 磁盘写入速率 磁盘读取速率 磁盘空间使用 磁盘IO TCP连接 UDP使用情况 最大文件描述符 已使用文件描述符 Socket使用情况 文件系统异常 磁盘速率 IO延迟 IO队列数 进程状态 Node视图 集群 节点 CPU使用率 CPU Requests水位 CPU Limits水位 内存使用率 内存Requests水位 内存Limits水位 内存使用量 网络接收速率 网络发送速率 网络接收速率(Pod) 网络发送速率(Pod) 接收数据包速率 发送数据包速率 丢包速率(接收) 丢包速率(发送) 节点磁盘读写IO速率(读+写) 节点磁盘读写吞吐量(读+写) CoreDNS视图 集群 实例 请求速率 请求速率(记录类型) 请求速率(区域) 请求速率(DO标志位) 请求数据包(UDP) 请求数据包(TCP) 响应速率(响应状态码) 响应时延 响应数据包(UDP) 响应数据包(TCP) 缓存记录数 缓存命中率 PVC视图 集群 命名空间 PV PVC PV状态 PVC状态 PVC使用量 PVC使用率 PVC inodes PVC inodes使用率 PVC每小时使用量 PVC每天使用量 PVC每周使用量 一周后PVC使用量 Kubelet 集群 实例 运行中Kubelet 运行中Pod 运行中容器 实际卷数量 期望卷数量 配置错误数量 操作速率 操作错误率 操作时延 Pod启动速率 Pod启动时延(99分位) 存储操作速率 存储操作错误率 存储操作时延(99分位) 控制组管理器操作速率 控制组管理器操作时延(99分位) PLEG relist速率 PLEG relist间隔 PLEG relist时延(99分位) RPC速率 请求时延(99分位) 内存使用量 CPU使用量 Go routine数 Prometheus 集群 job instance Target同步 Target数量 平均抓取间隔 抓取失败 Samples添加速率 Head中Series数量 Head块数量 查询速率 P90查询耗时 Prometheus Remote Write 集群 实例 url 远端样本滞后比率 远程写流量 当前队列数 最大队列数 最小队列数 期望队列数 队列容量 挂起中的样本数 TSDB当前段 远程写入当前段 样本丢弃率 样本失败率 样本重试率 入队失败重试率 节点池视图 集群 节点池 节点池CPU分配率 节点CPU分配率 节点池内存分配率 节点内存分配率 节点数量趋势
  • 跨VPC访问 跨VPC访问通常采用对等连接等方法打通VPC。 容器隧道网络只需将节点网络与对端VPC打通,容器自然就能访问对端VPC。 云原生网络2.0与容器隧道网络类似,将容器所在子网网段与对端VPC打通即可。 VPC网络由于容器网段独立,除了要打通VPC网段,还要打通容器网段。 例如有如下两个VPC。 vpc-demo:网段为192.168.0.0/16,集群在vpc-demo内,容器网段为10.0.0.0/16。 vpc-demo2:网段为10.1.0.0/16。 创建一个名为peering-demo的对等连接(本端为vpc-demo,对端为vpc-demo2),注意对端VPC的路由添加容器网段,如下所示。 这样配置后,在vpc-demo2中就能够访问容器网段10.0.0.0/16。具体访问时要关注安全组配置,打通端口配置。
  • 访问其他云服务 与CCE进行内网通信的与服务常见服务有:RDS、D CS 、Kafka、RabbitMQ、ModelArts等。 访问其他云服务除了上面所说的VPC内访问和跨VPC访问的网络配置外,还需要关注所访问的云服务是否允许外部访问,如DCS的Redis实例,需要添加白名单才允许访问。通常这些云服务会允许同VPC下IP访问,但是VPC网络模型下容器网段与VPC网段不同,需要特殊处理,将容器网段加入到白名单中。
  • VPC内访问 根据集群容器网络模型不同,从容器访问内部网络有不同表现。 容器隧道网络 容器隧道网络在节点网络基础上通过隧道封装网络数据包,容器访问同VPC下其他资源时,只要节点能访问通,容器就能访问通。如果访问不通,需要确认对端资源的安全组配置是否能够允许容器所在节点访问。 云原生网络2.0 云原生网络2.0模型下,容器直接从VPC网段内分配IP地址,容器网段是节点所在VPC的子网,容器与VPC内其他地址天然能够互通。如果访问不通,需要确认对端资源的安全组配置是否能够允许容器网段访问。 VPC网络 VPC网络使用了VPC路由功能来转发容器的流量,容器网段与节点VPC不在同一个网段,容器访问同VPC下其他资源时,需要对端资源的安全组能够允许容器网段访问。 例如如下集群,集群节点所在网段为192.168.10.0/24,容器网段为172.16.0.0/16。 VPC下(集群外)有一个地址为192.168.10.52的ECS,其安全组规则仅允许集群节点的IP网段访问。 此时如果从容器中ping 192.168.10.52,会发现无法ping通。 kubectl exec test01-6cbbf97b78-krj6h -it -- /bin/sh/ # ping 192.168.10.25PING 192.168.10.25 (192.168.10.25): 56 data bytes^C--- 192.168.10.25 ping statistics ---104 packets transmitted, 0 packets received, 100% packet loss 在安全组放通容器网段172.16.0.0/16访问。 此时再从容器中ping 192.168.10.52,会发现可以ping通。 $ kubectl exec test01-6cbbf97b78-krj6h -it -- /bin/sh/ # ping 192.168.10.25PING 192.168.10.25 (192.168.10.25): 56 data bytes64 bytes from 192.168.10.25: seq=0 ttl=64 time=1.412 ms64 bytes from 192.168.10.25: seq=1 ttl=64 time=1.400 ms64 bytes from 192.168.10.25: seq=2 ttl=64 time=1.299 ms64 bytes from 192.168.10.25: seq=3 ttl=64 time=1.283 ms^C--- 192.168.10.25 ping statistics ---4 packets transmitted, 4 packets received, 0% packet loss
  • 容器访问内网不通的定位方法 如前所述,从容器中访问内部网络不通的情况可以按如下路径排查: 查看要访问的对端服务器安全组规则,确认是否允许容器访问。 容器隧道网络模型需要放通容器所在节点的IP地址 VPC网络模型需要放通容器网段 云原生网络2.0需要放通容器所在子网网段 查看要访问的对端服务器是否设置了白名单,如DCS的Redis实例,需要添加白名单才允许访问。添加容器和节点网段到白名单后可解决问题。 查看要访问的对端服务器上是否安装了容器引擎,是否存在与CCE中容器网段冲突的情况。如果有网络冲突,会导致无法访问。
  • 导入存储池 创建节点时导入 在创建节点时,在存储配置中可以为节点添加数据盘,选择“作为临时存储卷”导入存储池,详情请参见创建节点。 图1 导入临时卷 手动导入 如果创建节点时没有导入临时存储卷,或当前存储卷容量不够,可以进行手动导入。 前往ECS控制台为节点添加SCSI类型的磁盘。操作步骤详情请参见新增磁盘。 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“容器存储”,并切换至“存储池”页签。 查看已添加磁盘的节点,选择“导入临时卷”,导入时可以选择写入模式。 线性:线性逻辑卷是将一个或多个物理卷整合为一个逻辑卷,实际写入数据时会先往一个基本物理卷上写入,当存储空间占满时再往另一个基本物理卷写入。 条带化:创建逻辑卷时指定条带化,当实际写入数据时会将连续数据分成大小相同的块,然后依次存储在多个物理卷上,实现数据的并发读写从而提高读写性能。多块卷才能选择条带化。
  • 查看巡检详情 在页面的顶部,您可以看到集群健康诊断的总体情况,其中包括风险等级,高危、中危、低危和正常检查项的数量,正常检查项占比,以及需要重点关注的检查项数据。此外,系统还会根据检查结果提供巡检问题和修复建议,供您参考。 图1 健康诊断总体情况 页面中还展示了Master、集群、节点、工作负载和外部依赖多个维度的所有巡检项,包括检查项、状态、诊断结果、说明和恢复建议。您可以单击相应检查项的“查看详情”按钮,以查看预警说明和恢复建议。 图2 诊断详情
  • 高级Rewrite配置 对于一些复杂高级的Rewrite需求,可以通过如下注解来实现,其本质也是修改Nginx的配置文件(nginx.conf),可以实现上面提到的“nginx.ingress.kubernetes.io/rewrite-target”注解的功能,但是自定义程度更高,适合更加复杂的Rewrite需求。 nginx.ingress.kubernetes.io/server-snippet:在nginx.conf的“server”字段中添加自定义配置。 nginx.ingress.kubernetes.io/configuration-snippet:在nginx.conf的“location”字段中添加自定义配置。 通过以上两个注解可以在nginx.conf中的“server”或“location”字段中插入Rewrite指令,完成URL的重写,示例如下: annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/configuration-snippet: | rewrite ^/stylesheets/(.*)$ /something/stylesheets/$1 redirect; # 添加 /something 前缀 rewrite ^/images/(.*)$ /something/images/$1 redirect; # 添加 /something 前缀 如上两条规则在访问URL中添加了“/something”路径,即: 当用户访问rewrite.bar.com/stylesheets/new.css时,重写为rewrite.bar.com/something/stylesheets/new.css 当用户访问rewrite.bar.com/images/new.jpg时,重写为rewrite.bar.com/something/images/new.jpg
  • 自定义检查项配置 登录CCE控制台,单击集群名称进入集群。 在左侧选择“节点管理”,单击“故障检测策略”。 在跳转的页面中查看当前检查项配置,单击检查项操作列的“编辑”,自定义检查项配置。 当前支持以下配置: 启用/停用:自定义某个检查项的开启或关闭。 目标节点配置:检查项默认运行在全部节点,用户可根据特殊场景需要自定义修改故障阈值。例如竞价实例中断回收检查只运行在竞价实例节点。 触发阈值配置:默认阈值匹配常见故障场景,用户可根据特殊场景需要自定义修改故障阈值。例如调整“连接跟踪表耗尽”触发阈值由90%调整至80%。 检查周期:默认检查周期为30秒,可根据用户场景需要自定义修改检查周期。 故障应对策略:故障产生后,可根据用户场景自定义修改故障应对策略,当前故障应对策略如下: 表1 故障应对策略 故障应对策略 效果 提示异常 上报Kuberentes事件。 禁止调度 上报Kuberentes事件,并为节点添加NoSchedule污点。 驱逐节点负载 上报Kuberentes事件,并为节点添加NoExecute污点。该操作会驱逐节点上的负载,可能导致业务不连续,请谨慎选择。
  • 通过ELB健康检查设置Pod就绪状态 使用Pod readiness Gates方式如下: 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“工作负载”,在右上角单击“YAML创建”。 YAML内容如下: kind: DeploymentapiVersion: apps/v1metadata: name: nginx namespace: default labels: version: v1spec: replicas: 1 selector: matchLabels: app: nginx version: v1 template: metadata: labels: app: nginx version: v1 spec: containers: - name: container-1 image: nginx:latest imagePullSecrets: - name: default-secret readinessGates: - conditionType: target-health.elb.k8s.cce/specific-service-name # 指定ServiceName。 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% # 配合以下两个参数,可以控制ELB后端个数,实现优雅滚动升级。 maxSurge: 25% 单击“确定”创建工作负载后,查看工作负载状态,Pod处于未就绪状态。 在左侧导航栏中选择“服务发现”,在右上角单击“创建服务”,并进行以下配置。 Service名称:需要与Pod中readinessGates字段设置的名称一致。 访问类型:选择负载均衡型Service。 选择器:单击“引用负载标签”,选择上一步中创建的工作负载并单击“确定”。 负载均衡器:必须使用独享型ELB,您可以选择已有的ELB或自动创建新的ELB。 负载均衡器配置:开启健康检查(不开启则默认为健康检查成功)。 前往ELB控制台,查看对应的后端服务器组,健康检查状态正常。 在CCE控制台中查看工作负载状态处于“运行中”。
  • 约束与限制 该特性存在集群版本限制,仅在以下版本中生效: v1.19集群:v1.19.16-r5及以上版本 v1.21集群:v1.21.8-r0及以上版本 v1.23集群:v1.23.6-r0及以上版本 v1.25集群:v1.25.2-r0及以上版本 该功能只支持直通场景,即 CCE Turbo 集群中使用独享型ELB的场景。 该功能需在Pod中配置特定的readinessGates字段,指定标签target-health.elb.k8s.cce/{serviceName},其中{serviceName}为服务名称。 Pod就绪状态只在最初对接ELB后端时生效,后续健康检查状态不再影响Pod就绪状态。
  • 操作步骤 使用"kubernetes.io/elb.health-check-options"注解的示例如下: apiVersion: v1kind: Servicemetadata: name: nginx namespace: default labels: {} annotations: kubernetes.io/elb.class: union kubernetes.io/elb.id: 038ffbda-bd3a-48bb-8b8c-a8582601fd97 kubernetes.io/elb.lb-algorithm: ROUND_ROBIN kubernetes.io/elb.health-check-flag: 'on' kubernetes.io/elb.health-check-options: '{ "target_service_port": "TCP:80", //【必填】spec.ports添加健康检查的目标端口,由协议、端口号组成,如:TCP:80 "monitor_port": "", //【可选】重新指定的健康检查端口,不指定时默认使用业务端口。请确保该端口在Pod所在节点已被监听,否则会影响健康检查结果 "protocol":"TCP", "delay":"5", "timeout":"10", "max_retries":"3", "path":"/" }'spec: selector: {} externalTrafficPolicy: Cluster ports: - name: cce-service-0 targetPort: 80 nodePort: 0 port: 80 protocol: TCP type: LoadBalancer loadBalancerIP: **.**.**.** 表1 elb.health-check-options字段数据结构说明 参数 是否必填 参数类型 描述 target_service_port 是 String spec.ports添加健康检查的目标端口,由协议、端口号组成,如:TCP:80 monitor_port 否 String 重新指定的健康检查端口,不指定时默认使用业务端口。 说明: 请确保该端口在Pod所在节点已被监听,否则会影响健康检查结果。 delay 否 String 开始健康检查的初始等待时间(秒) 默认值:5,取值范围:1-50 timeout 否 String 健康检查的超时时间(秒) 默认值:10,取值范围1-50 max_retries 否 String 健康检查的最大重试次数 默认值:3,取值范围1-10 protocol 否 String 健康检查的协议 默认值:取关联服务的协议 取值范围:“TCP”、“UDP”或者“HTTP” path 否 String 健康检查的URL,协议是“HTTP”时配置 默认值:“/” 取值范围:1-10000字符
  • 通过kubectl命令行设置 您可以通过对StatefulSet添加annotations来设置是否开启Pod固定EIP功能,同时需要开启随Pod创建EIP功能,如下所示。 apiVersion: apps/v1kind: StatefulSetmetadata: name: nginxspec: serviceName: nginx replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx annotations: pod.alpha.kubernetes.io/initialized: 'true' yangtse.io/static-eip: 'true' yangtse.io/static-eip-expire-no-cascading: 'false' yangtse.io/static-eip-expire-duration: 5m yangtse.io/pod-with-eip: 'true' yangtse.io/eip-bandwidth-size: '5' yangtse.io/eip-network-type: 5_bgp yangtse.io/eip-charge-mode: bandwidth yangtse.io/eip-ip-version: '4' spec: containers: - name: container-0 image: nginx:alpine resources: limits: cpu: 100m memory: 200Mi requests: cpu: 100m memory: 200Mi imagePullSecrets: - name: default-secret 表1 Pod固定EIP的annotation配置 annotation 默认值 参数说明 取值范围 yangtse.io/static-eip false 是否开启Pod固定EIP,只有StatefulSet类型的Pod或无ownerReferences的Pod支持,默认不开启。 "false"或"true" yangtse.io/static-eip-expire-duration 5m 删除固定EIP的Pod后,对应的固定EIP过期回收的时间间隔。 支持时间格式为Go time type,例如1h30m、5m。关于Go time type,请参见Go time type。 yangtse.io/static-eip-expire-no-cascading false 是否关闭StatefulSet工作负载的级联回收。 默认为false,表示StatefulSet删除后,会级联删除对应的固定EIP。如果您需要在删除StatefulSet对象后,在EIP过期回收时间内保留对应的固定EIP,用于下一次重建同名的StatefulSet再次使用对应的固定EIP,请将该参数设为true。 "false"或"true" 表2 EIP跟随Pod创建的annotation配置 annotation 默认值 参数说明 取值范围 yangtse.io/pod-with-eip false 是否需要跟随Pod创建EIP并绑定到该Pod。 "false"或"true" yangtse.io/eip-bandwidth-size 5 带宽大小,单位为Mbit/s。 默认1Mbit/s~2000Mbit/s 具体范围以各区域配置为准,详情请参见弹性公网IP控制台。 yangtse.io/eip-network-type 5_bgp 公网IP类型。 5_bgp 5_union 5_sbgp 具体类型以各区域配置为准,详情请参见弹性公网IP控制台。 yangtse.io/eip-charge-mode bandwidth 按流量计费或按带宽计费。 默认取值为traffic,表示按流量计费。 bandwidth:按带宽计费 traffic:按流量计费 yangtse.io/eip-ip-version 4 公网EIP的版本,例如IPv4,IPv6。 默认取值为4,即表示IPv4。 4 6 yangtse.io/eip-bandwidth-id 空 已有的带宽ID,填写该值时会忽略其他自动创建EIP相关的annotation。 - yangtse.io/eip-bandwidth-name Pod名称 带宽名称。 1-64个字符,支持数字、字母、中文、_(下划线)、-(中划线)、.(点) 最小长度:1 最大长度:64
  • 时区同步 创建工作负载时,支持设置容器使用节点相同的时区。您可以在创建工作负载时打开时区同步配置。 时区同步功能依赖容器中挂载的本地磁盘(HostPath),如下所示,开启时区同步后,Pod中会通过HostPath方式,将节点的“/etc/localtime”挂载到容器的“/etc/localtime”,从而使得节点和容器使用相同的时区配置文件。 kind: DeploymentapiVersion: apps/v1metadata: name: test namespace: defaultspec: replicas: 2 selector: matchLabels: app: test template: metadata: labels: app: test spec: volumes: - name: vol-162979628557461404 hostPath: path: /etc/localtime type: '' containers: - name: container-0 image: 'nginx:alpine' volumeMounts: - name: vol-162979628557461404 readOnly: true mountPath: /etc/localtime imagePullPolicy: IfNotPresent imagePullSecrets: - name: default-secret 父主题: 容器设置
  • 为CoreDNS配置存根域 集群管理员可以修改CoreDNS Corefile的ConfigMap以更改服务发现的工作方式。 若集群管理员有一个位于10.150.0.1的Consul域名解析服务器,并且所有Consul的域名都带有.consul.local的后缀。 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“插件管理”,在“已安装插件”下,在CoreDNS下单击“编辑”,进入插件详情页。 在“参数配置”下添加存根域。格式为一个键值对,键为DNS后缀域名,值为一个或一组DNS IP地址,如 'consul.local --10.150.0.1'。 单击“确定”完成配置更新。 在左侧导航栏中选择“配置项与密钥”,在“kube-system”命名空间下,查看coredns配置项数据,确认是否更新成功。 对应Corefile内容如下: .:5353 { bind {$POD_IP} cache 30 errors health {$POD_IP}:8080 kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } loadbalance round_robin prometheus {$POD_IP}:9153 forward . /etc/resolv.conf { policy random } reload ready {$POD_IP}:8081}consul.local:5353 { bind {$POD_IP} errors cache 30 forward . 10.150.0.1}
  • 使用CoreDNS级联自建DNS CoreDNS默认使用节点的/etc/resolv.conf文件进行解析,您也可以修改成外部DNS的解析地址。 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“插件管理”,在“已安装插件”下,在CoreDNS下单击“编辑”,进入插件详情页。 在“参数配置”下编辑高级配置,在plugins字段修改以下内容。 { "configBlock": "policy random", "name": "forward", "parameters": ". 192.168.1.1"} 单击“确定”完成配置更新。 在左侧导航栏中选择“配置项与密钥”,在“kube-system”命名空间下,查看coredns配置项数据,确认是否更新成功。 对应Corefile内容如下: .:5353 { bind {$POD_IP} cache 30 errors health {$POD_IP}:8080 kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } loadbalance round_robin prometheus {$POD_IP}:9153 forward . 192.168.1.1 { policy random } reload ready {$POD_IP}:8081}
  • 解决方案 使用CoreDNS有以下几种自定义域名解析的方案。 为CoreDNS配置存根域:可以直接在控制台添加,简单易操作。 使用 CoreDNS Hosts 插件配置任意域名解析:简单直观,可以添加任意解析记录,类似在本地/etc/hosts中添加解析记录。 使用 CoreDNS Rewrite 插件指向域名到集群内服务:相当于给Kubernetes中的Service名称取了个别名,无需提前知道解析记录的IP地址。 使用 CoreDNS Forward 插件将自建 DNS 设为上游 DNS:自建DNS中,可以管理大量的解析记录,解析记录专门管理,增删记录无需修改CoreDNS配置。
  • 修改CoreDNS Hosts配置 在CoreDNS中修改hosts后,可以不用单独在每个Pod中配置hosts添加解析记录。 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“插件管理”,在“已安装插件”下,在CoreDNS下单击“编辑”,进入插件详情页。 在“参数配置”下编辑高级配置,在plugins字段添加以下内容。 { "configBlock": "192.168.1.1 www.example.com\nfallthrough", "name": "hosts"} 此处配置不能遗漏fallthrough字段,fallthrough表示当在hosts找不到要解析的域名时,会将解析任务传递给CoreDNS的下一个插件。如果不写fallthrough的话,任务就此结束,不会继续解析,会导致集群内部域名解析失败的情况。 hosts的详细配置请参见https://coredns.io/plugins/hosts/。 单击“确定”完成配置更新。 在左侧导航栏中选择“配置项与密钥”,在“kube-system”命名空间下,查看coredns配置项数据,确认是否更新成功。 对应Corefile内容如下: .:5353 { bind {$POD_IP} hosts { 192.168.1.1 www.example.com fallthrough } cache 30 errors health {$POD_IP}:8080 kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } loadbalance round_robin prometheus {$POD_IP}:9153 forward . /etc/resolv.conf { policy random } reload ready {$POD_IP}:8081}
  • 添加CoreDNS Rewrite配置指向域名到集群内服务 使用 CoreDNS 的 Rewrite 插件,将指定域名解析到某个 Service 的域名。例如,将访问example.com域名的请求重新指向到example.default.svc.cluster.local域名,即指向到default命名空间下的example服务。 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“插件管理”,在“已安装插件”下,在CoreDNS下单击“编辑”,进入插件详情页。 在“参数配置”下编辑高级配置,在plugins字段添加以下内容。 { "name": "rewrite", "parameters": "name example.com example.default.svc.cluster.local"} 单击“确定”完成配置更新。 在左侧导航栏中选择“配置项与密钥”,在“kube-system”命名空间下,查看coredns配置项数据,确认是否更新成功。 对应Corefile内容如下: .:5353 { bind {$POD_IP} rewrite name example.com example.default.svc.cluster.local cache 30 errors health {$POD_IP}:8080 kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } loadbalance round_robin prometheus {$POD_IP}:9153 forward . /etc/resolv.conf { policy random } reload ready {$POD_IP}:8081}
  • 转包周期 如果您在购买按需计费集群后,想更换为包周期计费,可按如下步骤进行操作: 登录CCE控制台,在左侧导航栏中选择“集群管理”。 单击需要转包周期集群后的。 图1 转包周期 在转包周期页面中,选择需要转包周期的集群控制节点和工作节点。 图2 集群及集群下的工作节点转包周期 单击“确定”,等待生成订单并完成支付即可。 在支付时,如果弹出“当前用户无对该资源API访问权限”,请退回重新操作一次即可。
  • 前提条件 集群必须已安装nginx-ingress插件,具体操作可参考安装插件。 Ingress为后端工作负载提供网络访问,因此集群中需提前部署可用的工作负载。若您无可用工作负载,可参考创建无状态负载(Deployment)、创建有状态负载(StatefulSet)或创建守护进程集(DaemonSet)部署工作负载。 为上述工作负载配置ClusterIP类型或NodePort类型的Service,可参考集群内访问(ClusterIP)或节点访问(NodePort)配置示例Service。
  • networking.k8s.io/v1版本Ingress说明 CCE在v1.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 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个匹配。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。
  • Volume(存储卷) 容器中的文件在磁盘上是临时存放的,这给容器中运行的较重要的应用程序带来如下两个问题: 当容器重建时,容器中的文件将会丢失。 当在一个Pod中同时运行多个容器时,容器间需要共享文件。 Kubernetes抽象出了Volume(存储卷)来解决以上两个问题。Kubernetes的Volume是Pod的一部分,Volume不是单独的对象,不能独立创建,只能在Pod中定义。Pod中的所有容器都可以使用Volume,但需要将Volume挂载到容器中的目录下。 实际中使用容器存储如下图所示,可将同一个Volume挂载到不同的容器中,实现不同容器间的存储共享。 存储卷的基本使用原则如下: 一个Pod可以挂载多个Volume。虽然单Pod可以挂载多个Volume,但是并不建议给一个Pod挂载过多存储卷。 一个Pod可以挂载多种类型的Volume。 每个被Pod挂载的Volume卷,可以在不同的容器间共享。 Kubernetes环境推荐使用PVC和PV方式挂载Volume。 存储卷(Volume)的生命周期与挂载它的Pod相同,即Pod被删除的时候,Volume也一起被删除。但是Volume里面的文件可能在Volume消失后仍然存在,这取决于Volume的类型。 Kubernetes提供了非常丰富的Volume类型,您在CCE中可以使用的常用Volume类型如下: 存储卷(Volume)分类 描述 本地存储 适用于本地存储卷,例如HostPath、EmptyDir等。本地存储卷的特点是数据保存在集群的特定节点上,并且不能随着应用漂移,节点停机时数据即不再可用。 云存储 适用于云存储卷,例如SFS、OBS等。云存储卷的特点是数据不在集群的某个节点上,而是在远端的存储服务上,使用存储卷时需要将存储服务挂载到本地使用。 Secret和ConfigMap Secret和ConfigMap是特殊的存储卷,其数据是集群的一些对象信息,该对象数据以卷的形式被挂载到节点上供应用使用。 PVC 一种存储卷定义方式,将存储卷抽象成一个独立于Pod的对象,这个对象定义(关联)的存储信息即存储卷对应的真正存储信息,供Kubernetes负载挂载使用。
  • PV与PVC Kubernetes抽象了PV(PersistentVolume)和PVC(PersistentVolumeClaim)来定义和使用存储,从而让使用者不用关心具体的基础设施,当需要存储资源的时候,只要像CPU和内存一样,声明要多少即可。 PV:PV是PersistentVolume的缩写,译为持久化存储卷,描述的是一个集群里的持久化存储卷,它和节点一样,属于集群级别资源,其对象作用范围是整个Kubernetes集群。PV可以有自己的独立生命周期,不依附于Pod。 PVC:PVC是PersistentVolumeClaim的缩写,译为持久化存储卷声明,描述的是负载对存储的申领。为应用配置存储时,需要声明一个存储需求(即PVC),Kubernetes会通过最佳匹配的方式选择一个满足需求的PV,并与PVC绑定。PVC与PV是一一对应关系,在创建PVC时,需描述请求的持久化存储的属性,比如,存储的大小、可读写权限等等。 在Pod中可以使用Volume关联PVC,即可让Pod使用到存储资源,它们之间的关系如下图所示。 图1 PVC绑定PV
共100000条