华为云用户手册

  • 检查方式 HTTP 请求检查 HTTP 请求方式针对的是提供HTTP/HTTPS服务的容器,集群周期性地对该容器发起HTTP/HTTPS GET请求,如果HTTP/HTTPS response返回码属于200~399范围,则证明探测成功,否则探测失败。使用HTTP请求探测必须指定容器监听的端口和HTTP/HTTPS的请求路径。 例如:提供HTTP服务的容器,HTTP检查路径为:/health-check;端口为:80;主机地址可不填,默认为容器实例IP,此处以172.16.0.186为例。那么集群会周期性地对容器发起如下请求:GET http://172.16.0.186:80/health-check。您也可以为HTTP请求添加一个或多个请求头部,例如设置请求头名称为Custom-Header,对应的值为example。 图1 HTTP请求检查 TCP 端口检查 对于提供TCP通信服务的容器,集群周期性地对该容器建立TCP连接,如果连接成功,则证明探测成功,否则探测失败。选择TCP端口探测方式,必须指定容器监听的端口。 例如:有一个nginx容器,它的服务端口是80,对该容器配置了TCP端口探测,指定探测端口为80,那么集群会周期性地对该容器的80端口发起TCP连接,如果连接成功则证明检查成功,否则检查失败。 图2 TCP 端口检查 执行命令检查 命令检查是一种强大的检查方式,该方式要求用户指定一个容器内的可执行命令,集群会周期性地在容器内执行该命令,如果命令的返回结果是0则检查成功,否则检查失败。 对于上面提到的TCP端口检查和HTTP请求检查,都可以通过执行命令检查的方式来替代: 对于TCP端口探测,可以使用程序对容器的端口尝试connect,如果connect成功,脚本返回0,否则返回-1。 对于HTTP请求探测,可以使用脚本命令来对容器尝试使用wget命令进行探测。 wget http://127.0.0.1:80/health-check 并检查response 的返回码,如果返回码在200~399 的范围,脚本返回0,否则返回-1。如下图: 图3 执行命令检查 必须把要执行的程序放在容器的镜像里面,否则会因找不到程序而执行失败。 如果执行的命令是一个shell脚本,由于集群在执行容器里的程序时,不在终端环境下,因此不能直接指定脚本为执行命令,需要加上脚本解析器。比如脚本是/data/scripts/health_check.sh,那么使用执行命令检查时,指定的程序应该是sh /data/scripts/health_check.sh。 GRPC检查 GRPC检查可以为GRPC应用程序配置启动、活动和就绪探针,而无需暴露任何HTTP端点,也不需要可执行文件。Kubernetes可以通过GRPC 连接到工作负载并查询其状态。 GRPC检查仅在CCE v1.25及以上版本集群中支持。 使用GRPC检查时,您的应用需支持GRPC健康检查协议。 与HTTP和TCP探针类似,如果配置错误,都会被认作是探测失败,例如错误的端口、应用未实现健康检查协议等。 图4 GRPC检查
  • 操作场景 健康检查是指容器运行过程中,根据用户需要,定时检查容器健康状况。若不配置健康检查,如果容器内应用程序异常,Pod将无法感知,也不会自动重启去恢复。最终导致虽然Pod状态显示正常,但Pod中的应用程序异常的情况。 Kubernetes提供了三种健康检查的探针: 存活探针:livenessProbe,用于检测容器是否正常,类似于执行ps命令检查进程是否存在。如果容器的存活检查失败,集群会对该容器执行重启操作;若容器的存活检查成功则不执行任何操作。 就绪探针:readinessProbe,用于检查用户业务是否就绪,如果未就绪,则不转发流量到当前实例。一些程序的启动时间可能很长,比如要加载磁盘数据或者要依赖外部的某个模块启动完成才能提供服务。这时候程序进程已启动,但是并不能对外提供服务。这种场景下该检查方式就非常有用。如果容器的就绪检查失败,集群会屏蔽请求访问该容器;若检查成功,则会开放对该容器的访问。 启动探针:startupProbe,用于探测应用程序容器什么时候启动了。 如果配置了这类探测器,就可以控制容器在启动成功后再进行存活性和就绪检查, 确保这些存活、就绪探针不会影响应用程序的启动。 这可以用于对启动慢的容器进行存活性检测,避免它们在启动运行之前就被终止。
  • 注意事项 该操作会通过重置节点的方式升级操作系统,节点上已运行的工作负载业务可能会由于单实例部署、可调度资源不足等原因产生中断,请您合理评估升级风险,并挑选业务低峰期进行,或对关键业务应用设置PDB策略(Pod Disruption Budget,即干扰预算),升级过程中将严格根据PDB规则保障关键业务的可用性。 节点的系统盘和数据盘将会被清空,重置前请事先备份重要数据。 节点重置会清除用户单独添加的K8S标签和K8S污点,可能导致与节点有绑定关系的资源(本地存储,指定调度节点的负载等)无法正常使用。请谨慎操作,避免对运行中的业务造成影响。 升级操作完成后,节点将会自动开机。 为确保节点稳定性,系统会预留部分CPU和内存资源,用于运行必须的系统组件。
  • 默认节点池 登录CCE控制台。 单击集群名称进入集群,在左侧选择“节点管理”,在右侧选择“节点池”页签。 单击默认节点池名称后的“升级”。 在弹出的“升级操作系统”窗口中,设置升级参数。 目标操作系统:该项无需设置,用于展示目标版本的镜像信息。 升级方式:当前支持节点重置方式进行升级。 每批最大升级节点数:节点升级时,允许节点不可用的最大数量。节点重置方式进行同步时节点将不可用,请合理设置该参数,尽量避免出现集群节点不可用数量过多导致Pod无法调度的情况。 节点列表:选择需要升级的节点。 登录方式: 密码 用户名默认为“root”,请输入登录节点的密码,并确认密码。 登录节点时需要使用该密码,请妥善管理密码,系统无法获取您设置的密码内容。 密钥对 选择用于登录本节点的密钥对,支持选择共享密钥。 密钥对用于远程登录节点时的身份认证。若没有密钥对,可单击选项框右侧的“创建密钥对”来新建,创建密钥对操作步骤请参见创建密钥对。 安装前执行脚本: 请输入脚本命令,命令中不能包含中文字符。脚本命令会进行Base64转码。安装前/后执行脚本统一计算字符,转码后的字符总数不能超过10240。 脚本将在Kubernetes软件安装前执行,可能导致Kubernetes软件无法正常安装,需谨慎使用。 安装后执行脚本: 请输入脚本命令,命令中不能包含中文字符。脚本命令会进行Base64转码。安装前/后执行脚本统一计算字符,转码后的字符总数不能超过10240。 脚本将在Kubernetes软件安装后执行,不影响Kubernetes软件安装。 单击“确定”,即可开始操作系统滚动升级。
  • 解决方案 问题场景一:插件状态异常 请登录CCE控制台,单击集群名称进入集群控制台,前往“插件中心”处查看并处理处于异常状态的插件。 图1 查看插件状态 问题场景二:目标集群版本不支持当前插件版本 检查到该插件由于兼容性等问题无法随集群自动升级。请您登录CCE控制台,在“插件中心”处进行手动升级。 图2 升级插件 问题场景三:插件升级到最新版本后,仍不支持目标集群版本 请您登录CCE控制台,单击集群名称进入集群控制台,在“插件中心”处进行手动卸载,具体插件支持版本以及替换方案可查看帮助文档。 图3 卸载插件 问题场景四:插件配置不满足在升级条件,请在插件升级页面升级插件之后重试 升级前检查出现以下报错: please upgrade addon [ ] in the page of addon managecheck and try again 请您登录CCE控制台,在“插件中心”处手动升级插件。
  • 操作场景 主题备用名称(Subject Alternative Name,缩写SAN)允许将多种值(包括IP地址、 域名 等)与证书关联。SAN通常在TLS握手阶段被用于客户端校验服务端的合法性:服务端证书是否被客户端信任的CA所签发,且证书中的SAN是否与客户端实际访问的IP地址或DNS域名匹配。 当客户端无法直接访问集群内网私有IP地址或者公网弹性IP地址时,您可以将客户端可直接访问的IP地址或者DNS域名通过SAN的方式签入集群服务端证书,以支持客户端开启双向认证,提高安全性。典型场景例如DNAT访问、域名访问等特殊场景。 如果您有特殊的代理访问或跨域访问需求,可以通过自定义SAN实现。域名访问场景的典型使用方式如下: 客户端配置Host域名指定DNS域名地址,或者客户端主机配置/etc/hosts,添加响应域名映射。 云上内网使用, 云解析服务DNS 支持配置集群弹性IP与自定义域名的映射关系。后续更新弹性IP可以继续使用双向认证+自定义域名访问集群,无需重新下载kubeconfig.json配置文件。 自建DNS服务器,自行添加A记录。
  • 使用SAN连接集群 通过kubectl连接集群 修改SAN后,需重新下载kubeconfig.json配置文件。 登录CCE控制台,单击集群名称进入集群。 在集群总览页中的“连接信息”版块,单击kubectl后的“配置”按钮,查看kubectl的连接信息,并在弹出页面中下载配置文件。 配置kubectl。 登录到您的客户端机器,复制1.b中下载的配置文件(kubeconfig.json)到您客户端机器的/home目录下。 配置kubectl认证文件。 cd /home mkdir -p $HOME/.kube mv -f kubeconfig.json $HOME/.kube/config 切换kubectl的访问模式,使用SAN连接集群。 kubectl config use-context customSAN-0 其中customSAN-0为自定义SAN对应的配置名称。如同时设置了多个SAN,每个SAN对应配置名称中的数字从0开始依次增大,例如customSAN-0、customSAN-1,以此类推。 通过X509证书连接集群 修改SAN后,需重新下载X509证书。 登录CCE控制台,单击集群名称进入集群。 查看集群总览页,在右边“连接信息”下证书认证一栏,单击“下载”。 在弹出的“证书获取”窗口中,根据系统提示选择证书的过期时间并下载集群X509证书。 使用集群证书调用Kubernetes原生API。 例如使用curl命令调用接口查看Pod信息,如下所示,其中example.com:5443为自定义SAN。 curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://example.com:5443/api/v1/namespaces/default/pods/ 更多集群接口请参见Kubernetes API。
  • 添加自定义SAN 登录CCE控制台。 在集群列表中单击集群,进入集群详情页。 在连接信息的自定义SAN处单击,在弹出的窗口中添加IP地址或域名,然后单击“保存”。 图1 自定义SAN 1. 当前操作将会短暂重启kube-apiserver并更新kubeconfig.json文件,请避免在此期间操作集群。 2. 请输入域名或IP,以英文逗号(,)分隔,最多128个。 3. 自定义域名如需绑定弹性公网,请确保已配置公网地址。
  • 调度优先级介绍 节点池软亲和调度,是通过节点池上的标签(Label)进行软亲和,具体是通过给每一个节点进行打分的机制来排序筛选最优节点。 原则:尽可能把Pod调度到带有相关标签的节点上。 打分公式如下: score = weight * MaxNodeScore * haveLabel 参数说明: weight:节点池软亲和plugin的权重。 MaxNodeScore:节点最大得分,值为100。 haveLabel:节点上是否存在插件中配置的label,如果有,值为1,如果节点上没有,值为0。
  • 配置Volcano节点池软亲和调度策略 在节点池上配置用于亲和调度的标签。 登录CCE控制台。 单击集群名称进入集群,在左侧选择“节点管理”,在右侧选择“节点池”页签。 单击节点池名称后的“更新”,在弹出的“更新节点池”页面中配置参数,在“K8s标签”中配置对应的标签。 示例如下: 单击左侧导航栏的“插件中心”,在右侧找到Volcano调度器,单击“安装”或“编辑”,并在“参数配置”中设置Volcano调度器配置参数。 { "ca_cert": "", "default_scheduler_conf": { "actions": "allocate, backfill, preempt", "tiers": [ { "plugins": [ { "name": "priority" }, { "name": "gang" }, { "name": "conformance" } ] }, { "plugins": [ { "name": "drf" }, { "name": "predicates" }, { "name": "nodeorder" } ] }, { "plugins": [ { "name": "cce-gpu-topology-predicate" }, { "name": "cce-gpu-topology-priority" }, { "name": "cce-gpu" }, { // 开启节点池亲和性调度 "name": "nodepoolaffinity", // 节点池亲和性调度权重及标签设置 "arguments": { "nodepoolaffinity.weight": 10000, "nodepoolaffinity.label": "nodepool1=nodepool1" } } ] }, { "plugins": [ { "name": "nodelocalvolume" }, { "name": "nodeemptydirvolume" }, { "name": "node CS Ischeduling" }, { "name": "networkresource" } ] } ] }, "server_cert": "", "server_key": "" } 完成以上配置后,单击“确定”。
  • 约束与限制 支持多个PV挂载同一个SFS或SFS Turbo,但有如下限制: 多个不同的PVC/PV使用同一个底层SFS或SFS Turbo卷时,如果挂载至同一Pod使用,会因为PV的volumeHandle参数值相同导致无法为Pod挂载所有PVC,出现Pod无法启动的问题,请避免该使用场景。 PV中persistentVolumeReclaimPolicy参数建议设置为Retain,否则可能存在一个PV删除时级联删除底层卷,其他关联这个底层卷的PV会由于底层存储被删除导致使用出现异常。 重复用底层存储时,建议在应用层做好多读多写的隔离保护,防止产生的数据覆盖和丢失。 对SFS Turbo类型的存储来说,删除集群或删除PVC时不会回收包周期的SFS Turbo资源,您需要在SFS Turbo控制台中自行回收。
  • 验证数据持久化及共享性 查看部署的应用及文件。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-demo 预期输出如下: web-demo-846b489584-mjhm9 1/1 Running 0 46s web-demo-846b489584-wvv5s 1/1 Running 0 46s 依次执行以下命令,查看Pod的/data路径下的文件。 kubectl exec web-demo-846b489584-mjhm9 -- ls /data kubectl exec web-demo-846b489584-wvv5s -- ls /data 两个Pod均无返回结果,说明/data路径下无文件。 执行以下命令,在/data路径下创建static文件。 kubectl exec web-demo-846b489584-mjhm9 -- touch /data/static 执行以下命令,查看/data路径下的文件。 kubectl exec web-demo-846b489584-mjhm9 -- ls /data 预期输出如下: static 验证数据持久化 执行以下命令,删除名称为web-demo-846b489584-mjhm9的Pod。 kubectl delete pod web-demo-846b489584-mjhm9 预期输出如下: pod "web-demo-846b489584-mjhm9" deleted 删除后,Deployment控制器会自动重新创建一个副本。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-demo 预期输出如下,web-demo-846b489584-d4d4j为新建的Pod: web-demo-846b489584-d4d4j 1/1 Running 0 110s web-demo-846b489584-wvv5s 1/1 Running 0 7m50s 执行以下命令,验证新建的Pod中/data路径下的文件是否更改。 kubectl exec web-demo-846b489584-d4d4j -- ls /data 预期输出如下: static static文件仍然存在,则说明数据可持久化保存。 验证数据共享性 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-demo 预期输出如下: web-demo-846b489584-d4d4j 1/1 Running 0 7m web-demo-846b489584-wvv5s 1/1 Running 0 13m 执行以下命令,在任意一个Pod的/data路径下创建share文件。本例中选择名为web-demo-846b489584-d4d4j的Pod。 kubectl exec web-demo-846b489584-d4d4j -- touch /data/share 并查看该Pod中/data路径下的文件。 kubectl exec web-demo-846b489584-d4d4j -- ls /data 预期输出如下: share static 由于写入share文件的操作未在名为web-demo-846b489584-wvv5s的Pod中执行,在该Pod中查看/data路径下是否存在文件以验证数据共享性。 kubectl exec web-demo-846b489584-wvv5s -- ls /data 预期输出如下: share static 如果在任意一个Pod中的/data路径下创建文件,其他Pod下的/data路径下均存在此文件,则说明两个Pod共享一个存储卷。
  • 约束与限制 该特性从以下版本开始支持: v1.19集群:v1.19.16-r5及以上版本 v1.21集群:v1.21.8-r0及以上版本 v1.23集群:v1.23.6-r0及以上版本 v1.25集群:v1.25.2-r0及以上版本 v1.25以上版本集群 该功能只支持直通场景,即 CCE Turbo 集群中使用独享型ELB的场景。 该功能需在Pod中配置特定的readinessGates字段,指定标签target-health.elb.k8s.cce/{serviceName},其中{serviceName}为服务名称。 Pod就绪状态只在最初对接ELB后端时生效,后续健康检查状态不再影响Pod就绪状态。
  • 通过ELB健康检查设置Pod就绪状态 使用Pod readiness Gates方式如下: 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“工作负载”,在右上角单击“YAML创建”。 YAML内容如下: kind: Deployment apiVersion: apps/v1 metadata: name: nginx namespace: default labels: version: v1 spec: 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处于未就绪状态。 事件提示如下: 实例未就绪:correspondingcondition of pod readinessgate "target-health.elb.k8s.cce/specific-service-name" does not exist. 在左侧导航栏中选择“服务”,在右上角单击“创建服务”,并进行以下配置。 Service名称:需要与Pod中readinessGates字段设置的名称一致。 访问类型:选择负载均衡型Service。 选择器:单击“引用负载标签”,选择上一步中创建的工作负载并单击“确定”。 负载均衡器:必须使用独享型ELB,您可以选择已有的ELB或自动创建新的ELB。 健康检查:开启健康检查(不开启则默认为健康检查成功)。 图1 负载均衡配置 前往ELB控制台,查看对应的后端服务器组,健康检查状态正常。 在CCE控制台中查看工作负载状态处于“运行中”。
  • 修改容器单进程最大文件句柄数 登录节点,查看/usr/lib/systemd/system/docker.service文件。 CentOS/EulerOS系统: docker节点: cat /usr/lib/systemd/system/docker.service containerd节点: cat /usr/lib/systemd/system/containerd.service Ubuntu系统: docker节点: cat /lib/systemd/system/docker.service containerd节点: cat /lib/systemd/system/containerd.service LimitNOFILE或LimitNPROC参数设置为infinity时,表示容器单进程最大文件句柄数为1048576。 容器单进程最大文件句柄数通过以下参数设置: ... LimitNOFILE=1048576 LimitNPROC=1048576 ... 执行如下命令修改两个参数,其中1048576为最大文件句柄数的建议取值。 修改容器最大文件句柄数将会重启docker/containerd进程,请知悉。 CentOS/EulerOS系统: docker节点: sed -i "s/LimitNOFILE=[0-9a-Z]*$/LimitNOFILE=1048576/g" /usr/lib/systemd/system/docker.service;sed -i "s/LimitNPROC=[0-9a-Z]*$/LimitNPROC=1048576/g" /usr/lib/systemd/system/docker.service && systemctl daemon-reload && systemctl restart docker containerd节点: sed -i "s/LimitNOFILE=[0-9a-Z]*$/LimitNOFILE=1048576/g" /usr/lib/systemd/system/containerd.service;sed -i "s/LimitNPROC=[0-9a-Z]*$/LimitNPROC=1048576/g" /usr/lib/systemd/system/containerd.service && systemctl daemon-reload && systemctl restart containerd Ubuntu系统: docker节点: sed -i "s/LimitNOFILE=[0-9a-Z]*$/LimitNOFILE=1048576/g" /lib/systemd/system/docker.service;sed -i "s/LimitNPROC=[0-9a-Z]*$/LimitNPROC=1048576/g" /lib/systemd/system/docker.service && systemctl daemon-reload && systemctl restart docker containerd节点: sed -i "s/LimitNOFILE=[0-9a-Z]*$/LimitNOFILE=1048576/g" /usr/lib/systemd/system/containerd.service;sed -i "s/LimitNPROC=[0-9a-Z]*$/LimitNPROC=1048576/g" /usr/lib/systemd/system/containerd.service && systemctl daemon-reload && systemctl restart containerd 查看容器单进程最大文件句柄数,当返回与修改值一致时说明修改正确。 docker节点: # cat /proc/`pidof dockerd`/limits | grep files Max open files 1048576 1048576 files containerd节点: # cat /proc/`pidof containerd`/limits | grep files Max open files 1048576 1048576 files
  • 修改节点单进程最大文件句柄数 登录节点,查看/etc/security/limits.conf文件。 cat /etc/security/limits.conf 节点单进程最大文件句柄数通过以下参数设置: ... root soft nofile 65535 root hard nofile 65535 * soft nofile 65535 * hard nofile 65535 通过sed命令修改最大文件句柄数,其中65535为最大文件句柄数的建议取值。EulerOS 2.3节点/etc/security/limits.conf中没有nofile相关的默认配置,因此不能通过sed命令进行修改。 sed -i "s/nofile.[0-9]*$/nofile 65535/g" /etc/security/limits.conf 重新登录节点,执行以下命令检查是否修改成功,当返回与修改值一致时说明修改正确。 # ulimit -n 65535
  • 配置验证 使用csi-disk-sas创建PVC。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: sas-disk spec: 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 pvc NAME STATUS VOLUME CAPACITY AC CES S MODES STORAGECLASS AGE sas-disk Bound pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO csi-disk-sas 24s # kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO Delete Bound default/sas-disk csi-disk-sas 30s 在CCE控制台界面上查看PVC详情,在“PV详情”页签下可以看到磁盘类型是高I/O。 不指定StorageClassName,使用默认配置,如下所示,并未指定storageClassName。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ssd-disk spec: 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 pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE sas-disk Bound pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO csi-disk-sas 16m ssd-disk Bound pvc-4d2b059c-0d6c-44af-9994-f74d01c78731 10Gi RWO csi-disk-ssd 10s # kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-4d2b059c-0d6c-44af-9994-f74d01c78731 10Gi RWO Delete Bound default/ssd-disk csi-disk-ssd 15s pvc-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: v1 kind: PersistentVolumeClaim metadata: name: pvc-evs-example namespace: default annotations: everest.io/disk-volume-type: SAS spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk 可以看到在CCE中如果需要指定云硬盘的类型,是通过everest.io/disk-volume-type字段指定,这里SAS是云硬盘的类型。 以上是较为基础的StorageClass使用方法,在实际应用中,也可以使用StorageClass进行更为简便的操作: 应用场景 解决方案 操作步骤 在使用annotations指定存储配置时,配置较为繁琐。例如此处使用everest.io/disk-volume-type字段指定云硬盘的类型。 在StorageClass的parameters字段中定义PVC的annotations,编写YAML时只需要指定StorageClassName。 例如,将SAS、SSD类型云硬盘分别定义一个StorageClass,比如定义一个名为csi-disk-sas的StorageClass,这个StorageClass创建SAS类型的存储, 自定义StorageClass 当用户从自建Kubernetes或其他Kubernetes服务迁移到CCE,原先的应用YAML中使用的StorageClass与CCE中使用的不同,导致使用存储时需要修改大量YAML文件或Helm Chart包,非常繁琐且容易出错。 在CCE集群中创建与原有应用YAML中相同名称的StorageClass,迁移后无需再修改应用YAML中的StorageClassName。 例如,迁移前使用的云硬盘存储类为disk-standard,在迁移CCE集群后,可以复制CCE集群中csi-disk存储类的YAML,将其名称修改为disk-standard后重新创建。 在YAML中必须指定StorageClassName才能使用存储,不指定StorageClass时无法正常创建。 在集群中设置默认的StorageClass,则YAML中无需指定StorageClassName也能创建存储。 指定默认StorageClass
  • 自定义StorageClass 本文以自定义云硬盘类型的StorageClass为例,将SAS、SSD类型云硬盘分别定义一个StorageClass,比如定义一个名为csi-disk-sas的StorageClass,这个StorageClass创建SAS类型的存储,则前后使用的差异如下图所示,编写YAML时只需要指定StorageClassName。 自定义高I/O类型StorageClass,使用YAML描述如下,这里取名为csi-disk-sas,指定云硬盘类型为SAS,即高I/O。 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: 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-provisioner reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true # true表示允许扩容 超高I/O类型StorageClass,这里取名为csi-disk-ssd,指定云硬盘类型为SSD,即超高I/O。 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: 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-provisioner reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true reclaimPolicy:底层 云存储 的回收策略,支持Delete、Retain回收策略。 Delete:删除PVC,PV资源与云硬盘均被删除。 Retain:删除PVC,PV资源与底层存储资源均不会被删除,需要手动删除回收。PVC删除后PV资源状态为“已释放(Released)”,不能直接再次被PVC绑定使用。 如果数据安全性要求较高,建议使用Retain以免误删数据。 定义完之后,使用kubectl create命令创建。 # kubectl create -f sas.yaml storageclass.storage.k8s.io/csi-disk-sas created # kubectl create -f ssd.yaml storageclass.storage.k8s.io/csi-disk-ssd created 再次查询StorageClass,回显如下: # kubectl get sc NAME PROVISIONER AGE csi-disk everest-csi-provisioner 17d csi-disk-sas everest-csi-provisioner 2m28s csi-disk-ssd everest-csi-provisioner 16s csi-disk-topology everest-csi-provisioner 17d csi-nas everest-csi-provisioner 17d csi-obs everest-csi-provisioner 17d csi-sfsturbo everest-csi-provisioner 17d
  • 指定StorageClass的企业项目 CCE支持使用存储类创建云硬盘和对象存储类型PVC时指定企业项目,将创建的存储资源(云硬盘和对象存储)归属于指定的企业项目下,企业项目可选为集群所属的企业项目或default企业项目。 若不指定企业项目,则创建的存储资源默认使用存储类StorageClass中指定的企业项目,CCE提供的 csi-disk 和 csi-obs 存储类,所创建的存储资源属于default企业项目。 如果您希望通过StorageClass创建的存储资源能与集群在同一个企业项目,则可以自定义StorageClass,并指定企业项目ID,如下所示。 该功能需要everest插件升级到1.2.33及以上版本。 kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: csi-disk-epid # 自定义名称 provisioner: everest-csi-provisioner parameters: 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: Delete allowVolumeExpansion: true volumeBindingMode: Immediate
  • 指定默认StorageClass 您还可以指定某个StorageClass作为默认StorageClass,这样在创建PVC时不指定StorageClassName就会使用默认StorageClass创建。 例如将csi-disk-ssd指定为默认StorageClass,则可以按如下方式设置。 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-disk-ssd annotations: storageclass.kubernetes.io/is-default-class: "true" # 指定集群中默认的StorageClass,一个集群中只能有一个默认的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 everest.io/passthrough: "true" provisioner: everest-csi-provisioner reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true 先删除之前创建的csi-disk-ssd,再使用kubectl create命令重新创建,然后再查询StorageClass,显示如下。 # kubectl delete sc csi-disk-ssd storageclass.storage.k8s.io "csi-disk-ssd" deleted # kubectl create -f ssd.yaml storageclass.storage.k8s.io/csi-disk-ssd created # kubectl get sc NAME PROVISIONER AGE csi-disk everest-csi-provisioner 17d csi-disk-sas everest-csi-provisioner 114m csi-disk-ssd (default) everest-csi-provisioner 9s csi-disk-topology everest-csi-provisioner 17d csi-nas everest-csi-provisioner 17d csi-obs everest-csi-provisioner 17d csi-sfsturbo everest-csi-provisioner 17d
  • 存储类介绍 StorageClass可译为存储类,描述了集群中的存储类型“分类”,可以表示为一个创建PV存储卷的配置模板。在创建PVC/PV均需要指定StorageClass。 作为使用者,只需要在声明PVC时指定StorageClassName即可自动创建PV及底层存储,大大减少了创建并维护PV的工作量。 除了使用CCE提供的默认存储类外,您也可以根据需求自定义存储类。 自定义存储类应用场景 自定义StorageClass 指定默认StorageClass 指定StorageClass的企业项目
  • CCE默认存储类 目前CCE默认提供csi-disk、csi-nas、csi-obs等StorageClass,在声明PVC时使用对应StorageClassName,就可以自动创建对应类型PV,并自动创建底层的存储资源。 执行如下kubectl命令即可查询CCE提供的默认StorageClass。您可以使用CCE提供的CSI插件自定义创建StorageClass。 # kubectl get sc NAME PROVISIONER AGE csi-disk everest-csi-provisioner 17d # 云硬盘 csi-disk-topology everest-csi-provisioner 17d # 延迟创建的云硬盘 csi-nas everest-csi-provisioner 17d # 文件存储 1.0 csi-sfs everest-csi-provisioner 17d # 文件存储 3.0 csi-obs everest-csi-provisioner 17d # 对象存储 csi-sfsturbo everest-csi-provisioner 17d # 极速文件存储 csi-local everest-csi-provisioner 17d # 本地持久卷 csi-local-topology everest-csi-provisioner 17d # 延迟创建的本地持久卷 每个StorageClass都包含了动态制备PersistentVolume时会使用到的默认参数。如以下云硬盘存储类的示例: kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: csi-disk provisioner: everest-csi-provisioner parameters: 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/passthrough: 'true' reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate 表1 关键参数说明 参数 描述 provisioner 存储资源提供商,CCE均由everest插件提供,此处只能填写everest-csi-provisioner。 parameters 存储参数,不同类型的存储支持的参数不同。详情请参见表2。 reclaimPolicy 用来指定创建PV的persistentVolumeReclaimPolicy字段值,支持Delete和Retain。如果StorageClass 对象被创建时没有指定reclaimPolicy,它将默认为Delete。 Delete:表示动态创建的PV,在PVC销毁的时候PV也会自动销毁。 Retain:表示动态创建的PV,在PVC销毁的时候PV不会自动销毁。 allowVolumeExpansion 定义由此存储类创建的PV是否支持动态扩容,默认为false。是否能动态扩容是由底层存储插件来实现的,这里只是一个开关。 volumeBindingMode 表示卷绑定模式,即动态创建PV的时间,分为立即创建和延迟创建。 Immediate:创建PVC时完成PV绑定和动态创建。 WaitForFirstConsumer:延迟PV的绑定和创建,当在工作负载中使用该PVC时才执行PV创建和绑定流程。 mountOptions 该字段需要底层存储支持,如果不支持挂载选项,却指定了挂载选项,会导致创建PV操作失败。 表2 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 SSD:超高I/O GPSSD:通用型SSD ESSD:极速型SSD GPSSD2:通用性SSD v2,Everest版本为2.4.4及以上支持使用,使用时需同时指定everest.io/disk-iops和everest.io/disk-throughput注解。 ESSD2:极速型SSD v2,Everest版本为2.4.4及以上支持使用,使用时需指定everest.io/disk-iops注解。 everest.io/passthrough 是 参数取值固定为“true”,表示云硬盘的设备类型为SCSI类型。不允许设置为其他值。 文件存储 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 是 集群所在VPC ID。 everest.io/share-is-public 否 参数取值固定为“false”,表示文件共享为私人可见。 使用SFS 3.0时无需填写。 everest.io/sfs-version 否 仅使用SFS 3.0时需要填写,固定值为“sfs3.0”。 极速文件存储 csi.storage.k8s.io/csi-driver-name 是 驱动类型,使用极速文件存储类型时,参数取值固定为“sfsturbo.csi.everest.io”。 csi.storage.k8s.io/fstype 是 使用极速文件存储时,支持的参数值为“nfs”。 everest.io/share-access-to 是 集群所在VPC ID。 everest.io/share-expand-type 否 扩展类型,默认值为“bandwidth”,表示增强型的文件系统。该字段不起作用。 everest.io/share-source 是 参数取值固定为“sfs-turbo”。 everest.io/share-volume-type 否 极速文件存储类型,默认值为“STANDARD”,表示标准型和标准型增强版。该字段不起作用。 对象存储 csi.storage.k8s.io/csi-driver-name 是 驱动类型,使用对象存储类型时,参数取值固定为“obs.csi.everest.io”。 csi.storage.k8s.io/fstype 是 实例类型,支持的参数值为“s3fs”和“obsfs”。 obsfs:并行文件系统,配套使用obsfs挂载,推荐使用。 s3fs:对象桶,配套使用s3fs挂载。 everest.io/obs-volume-type 是 对象存储类型。 fsType设置为s3fs时,支持STANDARD(标准桶)、WARM(低频访问桶)。 fsType设置为obsfs时,该字段不起作用。
  • 相关操作 密钥创建完成后,您还可以执行表2中的操作。 密钥列表中包含系统密钥资源,系统密钥资源不可更新,也不能删除,只能查看。 表2 其他操作 操作 说明 编辑YAML 单击密钥名称后的“编辑YAML”,可编辑当前密钥的YAML文件。 更新密钥 选择需要更新的密钥名称,单击“更新”。 根据表1更改信息。 单击“确定”。 删除密钥 选择要删除的密钥,单击“删除”。 根据系统提示删除密钥。 批量删除密钥 勾选需要删除的密钥名称。 单击页面左上角的“批量删除”,删除选中的密钥。 根据系统提示删除密钥。
  • 操作步骤 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“配置与密钥”,选择“密钥”页签,在右上角单击“创建密钥”。 填写参数。 表1 基本信息说明 参数 参数说明 名称 新建的密钥的名称,同一个命名空间内命名必须唯一。 命名空间 新建密钥所在的命名空间,默认为default。 描述 密钥的描述信息。 密钥类型 新建的密钥类型。 Opaque:一般密钥类型。 kubernetes.io/dockerconfigjson:存放拉取私有仓库镜像所需的认证信息。 kubernetes.io/tls:Kubernetes的TLS密钥类型,用于存放7层负载均衡服务所需的证书。kubernetes.io/tls类型的密钥示例及说明请参见TLS Secret。 IngressTLS:CCE提供的TLS密钥类型,用于存放7层负载均衡服务所需的证书。 其他:若需要创建其他类型的密钥,请手动输入密钥类型。 密钥数据 工作负载密钥的数据可以在容器中使用。 当密钥为Opaque类型时,单击,在弹出的窗口中输入键值对,并且可以勾选“自动Base64转码”。 当密钥为kubernetes.io/dockerconfigjson类型时,输入私有镜像仓库的账号和密码。 当密钥为kubernetes.io/tls或IngressTLS类型时,上传证书文件和私钥文件。 说明: 证书是自签名或CA签名过的凭据,用来进行身份认证。 证书请求是对签名的请求,需要使用私钥进行签名。 密钥标签 密钥的标签。键值对形式,输入键值对后单击“确认添加”。 配置完成后,单击“确定”。 密钥列表中会出现新创建的密钥。
  • 创建ClusterIP类型Service 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“服务”,在右上角单击“创建服务”。 设置集群内访问参数。 Service名称:自定义服务名称,可与工作负载名称保持一致。 访问类型:选择“集群内访问”。 命名空间:工作负载所在命名空间。 选择器:添加标签,Service根据标签选择Pod,填写后单击“确认添加”。也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”。 IPv6:默认不开启,开启后服务的集群内IP地址(ClusterIP)变为IPv6地址,具体请参见如何通过CCE搭建IPv4/IPv6双栈集群?。该功能仅在1.15及以上版本的集群创建时开启了IPv6功能才会显示。 端口配置: 协议:请根据业务的协议类型选择。 服务端口:Service使用的端口,端口范围为1-65535。 容器端口:工作负载程序实际监听的端口,需用户确定。例如nginx默认使用80端口。 单击“确定”,创建Service。
  • 修改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/。 图2 修改CoreDNS 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级联自建DNS CoreDNS默认使用节点的/etc/resolv.conf文件进行解析,您也可以修改成外部DNS的解析地址。 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“插件中心”,在CoreDNS下单击“编辑”,进入插件详情页。 在“参数配置”下编辑高级配置,在plugins字段修改以下内容。 { "configBlock": "policy random", "name": "forward", "parameters": ". 192.168.1.1" } 图4 使用CoreDNS级联自建DNS 单击“确定”完成配置更新。 在左侧导航栏中选择“配置与密钥”,在“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 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" } 图3 添加CoreDNS Rewrite配置指向域名到集群内服务 单击“确定”完成配置更新。 在左侧导航栏中选择“配置与密钥”,在“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 }
  • 解决方案 使用CoreDNS有以下几种自定义域名解析的方案。 为CoreDNS配置存根域:可以直接在控制台添加,简单易操作。 使用 CoreDNS Hosts 插件配置任意域名解析:简单直观,可以添加任意解析记录,类似在本地/etc/hosts中添加解析记录。 使用 CoreDNS Rewrite 插件指向域名到集群内服务:相当于给Kubernetes中的Service名称取了个别名,无需提前知道解析记录的IP地址。 使用 CoreDNS Forward 插件将自建 DNS 设为上游 DNS:自建DNS中,可以管理大量的解析记录,解析记录专门管理,增删记录无需修改CoreDNS配置。
共100000条