华为云用户手册

  • 静态创建对象存储卷时指定挂载Secret 使用访问密钥创建Secret后,在创建PV时只需要关联上Secret,就可以使用Secret中的访问密钥(AK/SK)挂载对象存储卷。 登录OBS控制台,创建对象存储桶,记录桶名称和存储类型,以并行文件系统为例。 新建一个pv的yaml文件,如pv-example.yaml。 apiVersion: v1 kind: PersistentVolume metadata: name: pv-obs-example annotations: pv.kubernetes.io/provisioned-by: everest-csi-provisioner spec: accessModes: - ReadWriteMany capacity: storage: 1Gi csi: nodePublishSecretRef: name: test-user namespace: default driver: obs.csi.everest.io fsType: obsfs volumeAttributes: everest.io/obs-volume-type: STANDARD everest.io/region: cn-north-4 storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisioner volumeHandle: obs-normal-static-pv persistentVolumeReclaimPolicy: Delete storageClassName: csi-obs 参数 描述 nodePublishSecretRef 挂载时指定的密钥,其中 name:指定secret的名字 namespace:指定secret的命令空间 fsType 文件类型,支持“obsfs”与“s3fs”,取值为s3fs时创建是obs对象桶,配套使用s3fs挂载;取值为obsfs时创建的是obs并行文件系统,配套使用obsfs挂载,推荐使用。 volumeHandle 对象存储的桶名称。 创建PV。 kubectl create -f pv-example.yaml PV创建完成后,就可以创建PVC关联PV。 新建一个PVC的yaml文件,如pvc-example.yaml。 PVC yaml文件配置示例: apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: csi.storage.k8s.io/node-publish-secret-name: test-user csi.storage.k8s.io/node-publish-secret-namespace: default volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner everest.io/obs-volume-type: STANDARD csi.storage.k8s.io/fstype: obsfs name: obs-secret namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: csi-obs volumeName: pv-obs-example 参数 描述 csi.storage.k8s.io/node-publish-secret-name 指定secret的名字 csi.storage.k8s.io/node-publish-secret-namespace 指定secret的命令空间 创建PVC。 kubectl create -f pvc-example.yaml PVC创建后,就可以创建工作负载挂载PVC使用存储。
  • 使用访问密钥创建Secret 获取访问密钥。 对访问密钥进行base64编码(假设上文获取到的ak为“xxx”,sk为“yyy”)。 echo -n xxx|base64 echo -n yyy|base64 记录编码后的AK和SK。 新建一个secret的yaml,如test-user.yaml。 apiVersion: v1 data: access.key: WE5WWVhVNU***** secret.key: Nnk4emJyZ0***** kind: Secret metadata: name: test-user namespace: default labels: secret.kubernetes.io/used-by: csi type: cfe/secure-opaque 其中: 参数 描述 access.key base64编码后的ak。 secret.key base64编码后的sk。 name secret的名称 namespace secret的命名空间 secret.kubernetes.io/used-by: csi 带上这个标签才能在控制台上创建OBS PV/PVC时可见。 type 密钥类型,该值必须为cfe/secure-opaque 使用该类型,用户输入的数据会自动加密。 创建Secret。 kubectl create -f test-user.yaml
  • 集群过载监控 方式一:CCE界面 登录CCE控制台,进入一个已有的集群(集群版本为v1.23及以上)。 在“总览”页面,查看控制节点信息,将会显示“过载等级”指标。 过载等级如下: 熔断:拒绝所有外部流量 重度过载:拒绝75%外部流量 中度过载:拒绝50%外部流量 轻度过载:拒绝25%外部流量 正常:不拒绝外部流量 方式二: AOM 2.0界面 您可登录AOM 2.0控制台,创建一个仪表盘,并在仪表盘中添加名为vein_overload_level的监控指标,详情请参见创建仪表盘。 监控指标对应的含义如下: 0:熔断,拒绝所有外部流量 1:重度过载,拒绝75%外部流量 2:中度过载,拒绝50%外部流量 3:轻度过载,拒绝25%外部流量 4:正常,不拒绝外部流量 此处以AOM 2.0的操作步骤为例,供您参考。 登录AOM 2.0控制台,在左侧导航栏中选择“仪表盘”,单击“创建仪表盘”。 图3 创建仪表盘 仪表盘创建完成后,添加指标图表。 图表标题:集群过载指标 添加方式:全量指标 指标名称:vein_overload_level 范围:可不选 图4 添加指标图表 以上参数填写完成后,单击“添加到指标列表”。 单击“添加至仪表盘”,完成指标图表创建。 单击右上角保存按钮,保存仪表盘。 图5 保存仪表盘
  • 约束与限制 集群节点规格要求:CPU必须2核及以上,内存必须4GB及以上。 为了保证节点的稳定性,CCE集群节点上会根据节点的规格预留一部分资源给Kubernetes的相关组件(kubelet、kube-proxy以及docker等)和Kubernetes系统资源,使该节点可作为您的集群的一部分。 因此,您的节点资源总量与节点在Kubernetes中的可分配资源之间会存在差异。节点的规格越大,在节点上部署的容器可能会越多,所以Kubernetes自身需预留更多的资源,详情请参见节点预留资源策略说明。 节点的网络(如虚机网络、容器网络等)均被CCE接管,请勿自行添加删除网卡、修改路由和IP地址。若自行修改可能导致服务不可用。例如,节点上名为的gw_11cbf51a@eth0网卡为容器网络网关,不可修改。 节点购买后如需对其进行升级或降低规格等操作,请将节点关机后参照变更规格通用操作进行变更,也可以重新购买节点后,将老节点删除。 创建节点过程中会使用 域名 方式从OBS下载软件包,需要能够使用云上内网DNS解析OBS域名,否则会导致创建不成功。为此,节点所在子网的DNS服务器地址需要配置为内网 DNS地址 ,从而使得节点使用内网DNS。在创建子网时DNS默认配置为内网DNS,如果您修改过子网的DNS,请务必确保子网下的DNS服务器可以解析OBS服务域名,否则需要将DNS改成内网DNS。 集群中的节点一旦创建后不可变更可用区。 集群中通过“按需计费”模式购买的节点,在CCE“节点管理”中进行删除操作后将会直接被删除;通过“包年/包月”模式购买的节点不能直接删除,请通过页面右上角“费用-我的订单”执行资源退订操作。 节点进程ID数量上限对业务有影响,您需要评估是否调整节点进程ID数量大小,如需要调整请参见修改节点进程 ID数量上限kernel.pid_max。 集群开启IPv4/IPv6双栈时,所选节点子网不允许开启DHCP无限租约。
  • 云服务器名称、节点名称与K8s节点名称说明 云服务器名称:E CS 页面的云服务器名称,创建节点时支持自定义云服务器名称。 节点名称:CCE页面的节点名称,可与ECS页面的云服务器名称同步。但在指定K8s节点名称后, ECS云服务器 名称的修改将无法被同步至节点名称。 K8s节点名称:即节点YAML文件中的“metadata.labels.kubernetes.io/hostname”标签值。仅支持在创建(纳管)时将节点云服务器名称指定为K8s节点名称。创建(纳管)完成后,K8s节点名称无法修改。 云服务器名称、节点名称与K8s节点名称之间的同步关系如图1所示。 图1 节点名称关系示意图
  • 监控 在此处,您可以方便地查看实例在近1小时、近8小时、近24小时以及自定义时间段内各维度资源的使用情况。如需查看更多监控信息,请单击“查看全部仪表盘”,跳转至“仪表盘”页面,相应指导请参见使用仪表盘。 图4 Pod监控 CPU相关指标 CPU:Pod 的所有容器在不同的时间段 CPU 使用总量占 Pod 的所有容器 CPU Limit 总量的比例。 CPU 使用量:Pod 已经使用的 CPU 核数。 CPU 申请量:Pod CPU Request 值。 CPU 限制量:Pod CPU Limit 值,使用量接近该值时容器的 CPU 资源会被限流,影响容器性能。 内存相关指标 内存使用率:Pod 的所有容器在不同的时间段内存使用总量占 Pod 的所有容器内存 Limit 总量。 内存使用量:Pod 已经使用的内存量。 内存申请量:Pod 内存 Request 值。 内存限制量:Pod 内存 Limit 值, 使用量到达该值时会导致容器 OOM。 网络相关指标 网络总流出速率:Pod 的所有容器每秒钟发送的总字节数。 网络总流入速率:Pod 的所有容器每秒钟接收的总字节数。 容器相关指标 容器CPU使用率:Pod 的每个容器在不同的时间段的 CPU 使用量占它们的 CPU Limit 量的比例。 容器内存使用率:Pod 的每个容器在不同的时间段的内存使用量占它们的内存 Limit 量的比例。 容器CPU受限:Pod 的每个容器在不同的时间段的 CPU 受限时间所占的比例。 容器网络丢包率:Pod 的每个的容器在不同的时间段接收丢失的数据包总量占接收的数据包总量的比例。 其他指标 Pod 历史状态:Pod 在不同时间段所处的状态。 容器历史状态:Pod 的每个容器在不同的时间段所处的状态。
  • Pod列表 Pod列表中包含Pod名称、状态、命名空间、Pod IP、所在节点、重启次数、CPU申请/限制、内存申请/限制、CPU使用率,以及内存使用率等信息。 图1 Pod列表 您可以利用列表上方的命名空间,以及搜索栏中的Pod名称、状态、Pod IP和所在节点进行筛选,快速定位所需的Pod。 您也可以单击“导出”按钮来导出全部Pod数据,或者选择部分Pod进行导出,此时仅导出所选中的数据。导出的文件为“.xlsx”格式,文件命名中包含时间戳。
  • 概览 单击Pod名称,您可以方便地查看资源概况,包括Pod状态、容器数量(异常/总数)以及异常事件。此外,还可以浏览Pod近一小时的监控概览,其中包括CPU使用率、内存使用率和网络流入/流出速率这些常见的监控指标。 图2 资源概况和监控概览 同时,概览页面还提供了容器使用趋势功能,您可以从中了解Pod中各容器的CPU使用率、CPU使用量、内存使用率和内存使用量(在图表右上角切换对应指标),并且支持查看降序Top5和升序Top5数据(在图表左上角进行切换)。 如需了解更多指标,请前往监控页面查看。
  • 参数说明 表1 灰度发布参数说明 参数 是否必填 参数类型 描述 kubernetes.io/elb.canary 否 string 设置Ingress灰度发布的开关。设置为true后,配合不同的注解,可以实现不同的灰度发布功能。 取值范围:true 独享型负载均衡器生效。 设置为true后,不允许删除或修改。 kubernetes.io/elb.canary-weight 否 string 权重灰度发布权重值,设置后Ingress以权重灰度形式发布。 取值为0-100的正整数,为灰度流量分配的百分比。 发布成权重灰度Ingress时,该参数必填。 不能与其他灰度发布功能同时设置。 kubernetes.io/elb.session-affinity-mode 否 string 开启权重灰度发布后,配置会话保持能力。 灰度发布仅支持设置为 "HTTP_COOKIE"。 kubernetes.io/ elb.session-affinity-option 否 string 开启权重灰度发布会话保持能力后,会话保持的超时时间。 参数值为json字符串,格式如下: {"persistence_timeout": "1440"} 参数说明: 超时时间范围为1-1440。 默认值为1440。 kubernetes.io/elb.canary-by-header 否 string header灰度发布的Key值,表示请求头参数的名称。需要与kubernetes.io/elb.canary-by-header-value成对使用。 参数说明: 长度限制1-40字符,只允许包含字母、数字、中划线(-)和下划线(_)。 kubernetes.io/elb.canary-by-header-value 否 string header灰度发布的Values值,需要与kubernetes.io/elb.canary-by-header成对使用。 参数值为json格式的数组,例如: '{"values":["a","b"]}' 参数说明: 数组长度:最小值为1,最大值为10。 数组取值:长度限制1-128字符,不支持空格,双引号,支持以下通配符:*(匹配0个或更多字符)和?(正好匹配1个字符)。 kubernetes.io/elb.canary-by-cookie 否 string cookie灰度发布的key值,表示请求cookie参数的名称。需要与kubernetes.io/elb.canary-by-cookie-value成对使用。 参数说明: 长度限制1-100字符,支持包含字母、数字、以及 !%'"()*+,./:=?@^\\-_`~ 等字符。 kubernetes.io/elb.canary-by-cookie-value 否 string cookie灰度发布的values值,需要与kubernetes.io/elb.canary-by-cookie成对使用。 参数值为json格式的数组,例如: '{"values":["a","b"]}' 参数说明: 数组长度:最小值为1,最大值为10。 数组取值:长度限制1-100字符,不支持空格,支持包含字母、数字、以及 !%'"()*+,./:=?@^\\-_`~ 等字符。 kubernetes.io/elb.canary-related-ingress-uid 否 string 灰度发布Ingress关联的原始Ingress的uid信息,用于前端展示原始Ingress和灰度发布的Ingress的关联关系。 ● 参数格式:字符串 ● 取值:原始Ingress的metadata.uid字段
  • 灰度发布服务部署 部署原服务。 部署名为origin-server的工作负载。 部署名为origin-service的service,关联刚创建的origin-server工作负载。(CCE Standard集群创建nodeport类型Service,Turbo集群创建ClusterIP类型Service) 部署名为origin-ingress的Ingress,关联刚创建的origin-service服务。 Ingress的配置如下: apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: origin-ingress namespace: default annotations: kubernetes.io/elb.port: '81' kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3 kubernetes.io/elb.class: performance spec: rules: - host: nginx1.com http: paths: - path: / backend: service: name: origin-service port: number: 81 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific ingressClassName: cce 灰度发布新版本服务。 部署新版本工作负载、服务和Ingress,使得流量能够通过权重或者头域导流到新版本服务上。 部署名为canary-server的工作负载。 部署名为canary-service的服务,关联刚创建的canary-server工作负载。(CCE Standard集群创建nodeport类型Service,Turbo集群创建ClusterIP类型Service) 部署名为canary-weight-ingress的Ingress,关联刚创建的canary-service服务,实现权重灰度发布。 Ingress的配置如下: apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: canary-weight-ingress namespace: default annotations: kubernetes.io/elb.canary: 'true' // 设置为true,表示启用canary注解功能。 kubernetes.io/elb.canary-weight: '40' // 权重值设置,表示对应请求40%的流量将被导流到新版本服务上。 kubernetes.io/elb.class: performance // 仅独享型ELB支持灰度发布 kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3 kubernetes.io/elb.port: '81' spec: ingressClassName: cce rules: - host: nginx1.com http: paths: - path: / pathType: ImplementationSpecific backend: service: name: canary-service port: number: 81 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH 部署名为canary-header-ingress的Ingress,关联刚创建的canary-service服务,实现Header灰度发布。 Ingress的配置如下: apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: canary-header-ingress namespace: default annotations: kubernetes.io/elb.canary: 'true' kubernetes.io/elb.canary-by-header: 'location' // header的key值设置为location kubernetes.io/elb.canary-by-header-value: '{"values":["hz","sz","sh"]}' // header的value值设置为hz、sz、sh kubernetes.io/elb.class: performance kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3 kubernetes.io/elb.port: '81' spec: ingressClassName: cce rules: - host: nginx1.com http: paths: - path: / pathType: ImplementationSpecific backend: service: name: canary-service port: number: 80 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH 查看灰度发布新版本服务是否成功。 查看Ingress创建: $ kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE canary-header-ingress cce nginx1.com 88.88.88.165 80 46s canary-weight-ingress cce nginx1.com 88.88.88.165 80 117s origin-ingress cce nginx1.com 88.88.88.165 80 2m25s 查看ELB生成规则: 服务请求返回结果: 使用location:hz请求头的请求访问服务: $ curl -H "Host: nginx1.com" -H "location: hz" http://88.88.88.165:81/ 预期结果: $ new 多次访问,返回结果均为new 不使用请求头的请求访问服务: $ curl -H "Host: nginx1.com" http://88.88.88.165:81/ 预期结果:返回值40%为new,60%为old。 老版本服务下线。 新版本服务运行稳定后,需要下线老版本服务。下线流程将原服务Ingress中的Service修改为新版本服务的Service,使流量都路由到新版本服务上,然后删除灰度Ingress。 将原服务Ingress关联的Service更新为新版本Service。 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: origin-ingress namespace: default annotations: kubernetes.io/elb.port: '81' kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3 kubernetes.io/elb.class: performance spec: rules: - host: nginx1.com http: paths: - path: / backend: service: name: canary-service port: number: 81 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific ingressClassName: cce 验证老版本服务是否下线完成。 使用带header和不带header的请求,多次访问。 $ curl -H "Host: nginx1.com" -H "location: hz" http://88.88.88.165:81/ $ curl -H "Host: nginx1.com" http://88.88.88.165:81/ 预期结果:输出均为new,无old返回。 确认老版本服务下线完成后,删除灰度发布Ingress。 $ kubectl delete ingress canary-weight-ingress canary-header-ingress
  • 约束与限制 该特性存在集群版本限制,仅在以下版本中生效: v1.23集群:v1.23.14-r0 及以上版本 v1.25集群:v1.25.9-r0 及以上版本 v1.27集群:v1.27.6-r0 及以上版本 v1.28集群:v1.28.4-r0 及以上版本 其他更高版本的集群 创建灰度Ingress后,不应删除原Ingress。 单个ELB下的监听器,如果关联的多个Ingress配置了多个灰度策略,头域优先级最高,cookie次之,权重优先级最低。
  • 集群信息 集群信息包括多个维度: 集群ID:集群资源唯一标识,创建成功后自动生成,可用于API接口调用等场景。 集群名称:集群创建成功后可以单击进行修改。 集群原名:修改集群名称后显示的集群原名,设置其他集群的名称时和该集群的原名同样不可以重复。 集群状态:当前集群的运行状态,详情请参见集群生命周期。 集群类别:显示当前集群为CCE Standard集群或 CCE Turbo 集群,两者差异请参见集群类型对比。 集群创建时间:显示集群创建的时间,CCE以该时间作为计费依据。
  • 使用成本洞察 开通后,进入成本洞察界面,查看已接入集群的成本状况。您可以切换页签,进行年度、季度、月度成本分析报表查看。 图11 查看成本状况 表1 界面功能说明 名称 所属报告 说明 本年至今成本(去年同期、环比去年) 年度 本年至今:本年开始到最新账单日期产生的成本 去年同期:对比去年相同日期产生的成本 环比去年:(本年至今成本 - 去年同期成本)/ 去年同期成本 年末预测成本(去年同期、环比去年) 年度 年末预测成本:到本年年末预计产生的总成本开销 去年同期:去年整年产生的成本 环比去年:(年末预测成本 - 去年同期成本)/ 去年同期成本 本季至今成本(上季度同期、环比上季度) 季度 本季至今成本:本季开始到最新账单日期产生的成本 上季度同期:对比上季度相同日期产生的成本 环比上季度:(本季至今成本 - 上季度同期成本)/ 上季度同期成本 季末预测成本(上季度同期、环比上季度) 季度 季末预测成本:到本季度末,整季预估产生的总成本开销 上季度同期:上季度整季产生的成本 环比上季度:(季末预测成本 - 上季度同期成本)/ 上季度同期成本 本月至今成本(上月同期、环比上月) 月度 本月至今成本:本月开始到最新账单日期产生的成本 上月同期:对比上月相同日期产生的成本 环比上月:(本月至今成本 - 上月同期成本)/ 上月同期成本 月末预测成本(上月同期、环比上月) 月度 月末预测成本:到本月月末,整月预估产生的总成本开销 上月同期:上月整月产生的成本 环比上月:(月末预测成本 - 上月同期成本)/ 上月同期成本 总成本趋势 年度、季度、月度 呈现本年、本季度、本月成本详情,以及分别和上年、上季、上月的成本对比趋势
  • 部门成本分析 在部门成本分析模块查看部门成本分析报告。 图12 查看部门成本分析 表2 部门成本明细报表功能说明 名称 所属报告 说明 部门名称 年度、季度、月度 部门配置名称 本年至今成本 年度 本年开始到最新账单日期产生的成本 去年同期成本 年度 对比去年相同日期产生的成本 去年总成本 年度 去年整年产生的成本 对比去年同期增长值 年度 本年至今成本 - 去年同期成本 对比去年同期增长率 年度 (本年至今成本 - 去年同期成本)/ 去年同期成本 本年CPU成本 年度 本年开始到最新账单日期产生的CPU成本 本年CPU成本占部门整体成本百分比 年度 本年CPU成本 / 本年至今成本(部门成本) 本年至今相比去年同期CPU增长成本 年度 本年CPU成本 - 去年同期CPU成本 本季至今成本 季度 本季开始到最新账单日期产生的成本 上季度同期成本 季度 对比上季度相同日期产生的成本 上季度总成本 季度 上季度整季产生的成本 对比上季度同期增长值 季度 本季至今成本 - 上季度同期成本 对比上季度同期增长率 季度 (本季至今成本 - 上季度同期成本)/ 上季度同期成本 本季度CPU成本 季度 本季开始到最新账单日期产生的CPU成本 本季度CPU成本占部门整体成本百分比 季度 本季CPU成本 / 本季至今成本(部门成本) 本季度相比上季度同期CPU增长成本 季度 本季CPU成本 - 上季度CPU成本 本月至今成本 月度 本月开始到最新账单日期产生的成本 上月同期成本 月度 对比上月相同日期产生的成本 上月总成本 月度 上月整月产生的成本 对比上月同期增长值 月度 本月至今成本 - 上月同期成本 对比上月同期增长率 月度 (本月至今成本 - 上月同期成本) / 上月同期成本 本月CPU成本 月度 本月开始到最新账单日期产生的CPU成本 本月CPU成本占部门整体成本百分比 月度 本月CPU成本 / 本月至今成本(部门成本) 本月相比上月同期CPU增长成本 月度 本月CPU成本 - 上月CPU成本
  • 部门管理 登录CCE控制台,单击左侧导航栏中的“云原生成本治理”。 图5 云原生成本治理 单击“部门管理”,进行部门配置查看。 图6 部门管理 单击“编辑部门”,修改自定义部门配置。 图7 编辑部门 单击“下一步”,修改公共成本分摊到部门的比例。 图8 修改公共成本分摊 单击“提交配置”,便可以在部门管理界面看到配置的结果。 图9 提交配置 配置完成后,关闭部门管理界面,即可在云原生成本治理查看相应部门的成本分析报告。 图10 查看成本分析报告
  • 使用密钥设置工作负载的环境变量 使用控制台方式 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏选择“工作负载”,单击右上角“创建工作负载”。 在创建工作负载时,在“容器配置”中找到“环境变量”,单击“新增变量”。 密钥导入:选择一个密钥,将密钥中所有键值都导入为环境变量。 密钥项键值导入:将密钥中某个键的值导入作为某个环境变量的值。 变量名称:工作负载中的环境变量名称,可自定义,默认为密钥中选择的键名。 变量/变量引用:选择一个密钥及需要导入的键名,将其对应的值导入为工作负载环境变量。 例如将mysecret这个密钥中“username”的值导入,作为工作负载环境变量“username”的值,导入后容器中将会有一个名为“username”的环境变量。 配置其他工作负载参数后,单击“创建工作负载”。 等待工作负载正常运行后,您可登录容器执行以下语句,查看该密钥是否已被设置为工作负载的环境变量。 printenv username 如输出与Secret中的内容一致,则说明该密钥已被设置为工作负载的环境变量。 使用kubectl方式 请参见通过kubectl连接集群配置kubectl命令。 创建并编辑nginx-secret.yaml文件。 vi nginx-secret.yaml YAML文件内容如下: 密钥导入:如果要将一个密钥中所有数据都添加到环境变量中,可以使用envFrom参数,密钥中的Key会成为工作负载中的环境变量名称。 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-secret spec: replicas: 1 selector: matchLabels: app: nginx-secret template: metadata: labels: app: nginx-secret spec: containers: - name: container-1 image: nginx:latest envFrom: # 使用envFrom来指定环境变量引用的密钥 - secretRef: name: mysecret # 引用的密钥名称 imagePullSecrets: - name: default-secret 密钥键值导入:您可以在创建工作负载时将密钥设置为环境变量,使用valueFrom参数单独引用Secret中的Key/Value。 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-secret spec: replicas: 1 selector: matchLabels: app: nginx-secret template: metadata: labels: app: nginx-secret spec: containers: - name: container-1 image: nginx:latest env: # 设置工作负载中的环境变量 - name: SECRET_USERNAME # 工作负载中的环境变量名称 valueFrom: # 使用valueFrom来指定环境变量引用的密钥 secretKeyRef: name: mysecret # 引用的密钥名称 key: username # 引用的密钥中的key - name: SECRET_PASSWORD # 添加多个环境变量参数,可同时导入多个环境变量 valueFrom: secretKeyRef: name: mysecret key: password imagePullSecrets: - name: default-secret 创建工作负载。 kubectl apply -f nginx-secret.yaml 创建完成后,查看Pod中的环境变量。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep nginx-secret 预期输出如下: nginx-secret-*** 1/1 Running 0 2m18s 执行以下命令,查看该Pod中的环境变量。 kubectl exec nginx-secret-*** -- printenv SPECIAL_USERNAME SPECIAL_PASSWORD 如输出与Secret中的内容一致,则说明该密钥已被设置为工作负载的环境变量。
  • 操作步骤 集群升级步骤包括:升级前检查、备份、配置与升级、升级后处理。 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏选择“集群升级”。 根据当前集群版本,系统将为您生成最佳升级路径,您可以在该路径中选择需要升级的版本,确认集群版本差异、插件版本等信息,然后单击“前往升级”。 进行升级前检查,单击“开始检查”并确认。如集群中存在异常项或风险项,请根据页面提示的检查结果进行处理,处理完成后需重新进行升级前检查。 异常项:请查看页面提示的解决方案并处理异常后,重新进行升级前检查。 风险项:表示该结果可能会影响集群升级结果,请您查看风险说明并确认您是否处于风险影响范围。如确认无风险,可单击该风险项后的“确认”按钮,手动跳过该风险项,然后重新进行升级前检查。 待升级前检查通过后,单击“下一步”。 进行集群备份。集群升级过程中将自动进行etcd数据备份,您可手动进行Master节点备份,以加快Master节点升级失败时的回滚速度,如无需手动备份可直接单击“下一步”。 备份方式 备份对象 备份方式 备份时间 回滚时间 说明 etcd数据备份 etcd数据 升级流程中自动备份 1-5min 2h 必选备份,升级过程中自动进行,用户无需关注 EVS快照备份 Master节点磁盘,包括组件镜像、配置、日志以及etcd数据 通过页面一键备份(手动触发) 1-5min 20min - 配置升级参数。 插件升级配置:此处列出了您的集群中已安装的插件。在集群升级过程中系统会自动升级已选择的插件,以兼容升级后的集群版本,您可以单击插件右侧的“配置”重新定义插件参数。 插件右侧如有标记,表示当前插件不能同时兼容集群升级起始和目标版本,在集群版本升级完成后将为您升级该插件 ,该插件在集群升级过程中可能无法正常使用。 配置完成后,单击“立即升级”按钮,并确认升级操作后集群开始升级。您可以在页面下方查看版本升级的进程。 若在集群升级过程中出现升级失败的提示,请参照提示信息修复问题后重试。 升级完成后,单击“下一步”,请根据页面提示的检查项进行升级后验证。确认所有检查项均正常后,可单击“完成”按钮,并确认完成升级后检查,详情请参见升级后验证。 您可以在集群列表页面查看集群当前的Kubernetes版本,确认升级成功。
  • 通过kubectl命令行动态挂载本地持久卷 使用kubectl连接集群。 创建statefulset-local.yaml文件,本示例中将本地持久卷挂载至/data路径。 apiVersion: apps/v1 kind: StatefulSet metadata: name: statefulset-local namespace: default spec: selector: matchLabels: app: statefulset-local template: metadata: labels: app: statefulset-local spec: containers: - name: container-1 image: nginx:latest volumeMounts: - name: pvc-local # 需与volumeClaimTemplates字段中的名称对应 mountPath: /data # 存储卷挂载的位置 imagePullSecrets: - name: default-secret serviceName: statefulset-local # Headless Service名称 replicas: 2 volumeClaimTemplates: - apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-local namespace: default annotations: everest.io/csi.volume-name-prefix: test # 可选字段,定义自动创建的底层存储名称前缀 spec: accessModes: - ReadWriteOnce # 本地持久卷必须为ReadWriteOnce resources: requests: storage: 10Gi # 存储卷容量大小 storageClassName: csi-local-topology # StorageClass类型为本地持久卷 --- apiVersion: v1 kind: Service metadata: name: statefulset-local # Headless Service名称 namespace: default labels: app: statefulset-local spec: selector: app: statefulset-local clusterIP: None ports: - name: statefulset-local targetPort: 80 nodePort: 0 port: 80 protocol: TCP type: ClusterIP 表2 关键参数说明 参数 是否必选 描述 everest.io/csi.volume-name-prefix 否 可选字段,集群版本为v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上时支持,且集群中需安装2.4.15及以上版本的Everest插件。 定义自动创建的底层存储名称,实际创建的底层存储名称为“存储卷名称前缀”与“PVC UID”的拼接组合,如果不填写该参数,默认前缀为“pvc”。 取值范围:参数值长度为1~26,且必须是小写字母、数字、中划线,不能以中划线开头或结尾。 例如,存储卷名称前缀设置为“test”,则实际创建的底层存储名称test-{uid}。 storage 是 PVC申请容量,单位为Gi。 storageClassName 是 本地持久卷对应的存储类名称为csi-local-topology。 执行以下命令,创建一个挂载本地持久卷存储的应用。 kubectl apply -f statefulset-local.yaml 工作负载创建成功后,您可以尝试验证数据持久化。
  • 验证数据持久化 查看部署的应用及文件。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep statefulset-local 预期输出如下: statefulset-local-0 1/1 Running 0 45s statefulset-local-1 1/1 Running 0 28s 执行以下命令,查看本地持久卷是否挂载至/data路径。 kubectl exec statefulset-local-0 -- df | grep data 预期输出如下: /dev/mapper/vg--everest--localvolume--persistent-pvc-local 10255636 36888 10202364 0% /data 执行以下命令,查看/data路径下的文件。 kubectl exec statefulset-local-0 -- ls /data 预期输出如下: lost+found 执行以下命令,在/data路径下创建static文件。 kubectl exec statefulset-local-0 -- touch /data/static 执行以下命令,查看/data路径下的文件。 kubectl exec statefulset-local-0 -- ls /data 预期输出如下: lost+found static 执行以下命令,删除名称为web-local-auto-0的Pod。 kubectl delete pod statefulset-local-0 预期输出如下: pod "statefulset-local-0" deleted 删除后,StatefulSet控制器会自动重新创建一个同名副本。执行以下命令,验证/data路径下的文件是否更改。 kubectl exec statefulset-local-0 -- ls /data 预期输出如下: lost+found static static文件仍然存在,则说明本地持久卷中的数据可持久化保存。
  • 相关操作 您还可以执行表3中的操作。 表3 其他操作 操作 说明 操作步骤 事件 查看PVC或PV的事件名称、事件类型、发生次数、Kubernetes事件、首次和最近发生的时间,便于定位问题。 在左侧导航栏选择“存储”,在右侧选择“存储卷声明”或“存储卷”页签。 单击目标实例操作列的“事件”,即可查看1小时内的事件(事件保存时间为1小时)。 查看YAML 可对PVC或PV的YAML文件进行查看、复制和下载。 在左侧导航栏选择“存储”,在右侧选择“存储卷声明”或“存储卷”页签。 单击目标实例操作列的“查看YAML”,即可查看或下载YAML。
  • 使用场景 动态挂载仅可在创建有状态负载时使用,通过卷声明模板(volumeClaimTemplates字段)实现,并依赖于StorageClass的动态创建PV能力。在多实例的有状态负载中,动态挂载可以为每一个Pod关联一个独有的PVC及PV,当Pod被重新调度后,仍然能够根据该PVC名称挂载原有的数据。而在无状态工作负载的普通挂载方式中,当存储支持多点挂载(ReadWriteMany)时,工作负载下的多个Pod会被挂载到同一个底层存储中。
  • 公平调度介绍 在实际业务中,经常会遇到将集群稀缺资源分配给多个用户的情况,每个用户获得资源的权利都相同,但是需求数却可能不同,如何公平的将资源分配给每个用户是一项非常有意义的事情。调度层面有一种常用的方法为最大最小化公平分配算法(max-min fairness share),尽量满足用户中的最小的需求,然后将剩余的资源公平分配给剩下的用户。形式化定义如下: 资源分配以需求递增的方式进行分配 每个用户获得的资源不超过其需求 未得到满足的用户等价平分剩下的资源
  • 创建LoadBalancer类型Service 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“服务”,在右上角单击“创建服务”。 设置参数。 Service名称:自定义服务名称,可与工作负载名称保持一致。 访问类型:选择“负载均衡 LoadBalancer”。 命名空间:工作负载所在命名空间。 服务亲和: 集群级别:集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。 选择器:添加标签,Service根据标签选择Pod,填写后单击“确认添加”。也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”。 负载均衡器:选择弹性负载均衡的类型、创建方式。 ELB类型可选择“独享型”,独享型ELB可以根据支持的协议类型选择“网络型(TCP/UDP)”、“应用型(HTTP/HTTPS)”或“网络型(TCP/UDP)&应用型(HTTP/HTTPS)”。 创建方式可选择“选择已有”或“自动创建”。不同创建方式的配置详情请参见表1。 表1 ELB配置 创建方式 配置 选择已有 仅支持选择与集群在同一个VPC下的ELB实例。如果没有可选的ELB实例,请单击“创建负载均衡器”跳转到ELB控制台创建。 自动创建 实例名称:请填写ELB名称。 企业项目:该参数仅对开通企业项目的企业客户账号显示。企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。 可用区:可以选择在多个可用区创建负载均衡实例,提高服务的可用性。如果业务需要考虑容灾能力,建议选择多个可用区。 前端子网:用于分配ELB实例对外服务的IP地址。 后端子网:用于与后端服务建立连接的IP地址。 网络型规格/应用型规格/规格: 弹性规格:适用于业务用量波动较大的场景,按实际使用量收取每小时使用的容量费用。 固定规格:适用于业务用量较为稳定的场景,按固定规格折算收取每小时使用的容量费用。 弹性公网IP:选择“自动创建”时,可配置公网带宽的计费方式及带宽大小。 资源标签:通过为资源添加标签,可以对资源进行自定义标记,实现资源的分类。您可以在TMS中创建“预定义标签”,预定义标签对所有支持标签功能的服务资源可见,通过使用预定义标签可以提升标签创建和迁移效率。v1.27.5-r0、v1.28.3-r0及以上版本集群支持。 负载均衡配置:您可以单击负载均衡配置的“编辑”图标配置ELB实例的参数,在弹出窗口中配置ELB实例的参数。 分配策略:可选择加权轮询算法、加权最少连接或源IP算法。 加权轮询算法:根据后端服务器的权重,按顺序依次将请求分发给不同的服务器。它用相应的权重表示服务器的处理性能,按照权重的高低以及轮询方式将请求分配给各服务器,相同权重的服务器处理相同数目的连接数。常用于短连接服务,例如HTTP等服务。 加权最少连接:最少连接是通过当前活跃的连接数来估计服务器负载情况的一种动态调度算法。加权最少连接就是在最少连接数的基础上,根据服务器的不同处理能力,给每个服务器分配不同的权重,使其能够接受相应权值数的服务请求。常用于长连接服务,例如数据库连接等服务。 源IP算法:将请求的源IP地址进行Hash运算,得到一个具体的数值,同时对后端服务器进行编号,按照运算结果将请求分发到对应编号的服务器上。这可以使得对不同源IP的访问进行负载分发,同时使得同一个客户端IP的请求始终被派发至某特定的服务器。该方式适合负载均衡无cookie功能的TCP协议。 会话保持类型:默认不启用,可选择“源IP地址”。基于源IP地址的简单会话保持,即来自同一IP地址的访问请求转发到同一台后端服务器上。 当分配策略使用源IP算法时,不支持设置会话保持。 健康检查:设置负载均衡的健康检查配置。 全局检查:全局检查仅支持使用相同协议的端口,无法对多个使用不同协议的端口生效,建议使用“自定义检查”。 自定义检查:在端口配置中对多种不同协议的端口设置健康检查。 表2 健康检查参数 参数 说明 协议 当端口配置协议为TCP时,支持TCP和HTTP协议;当端口配置协议为UDP时,支持UDP协议。 检查路径(仅HTTP健康检查协议支持):指定健康检查的URL地址。检查路径只能以/开头,长度范围为1-80。 端口 健康检查默认使用业务端口作为健康检查的端口;您也可以重新指定端口用于健康检查,重新指定端口会为服务增加一个名为cce-healthz的服务端口配置。 容器端口:使用独享型负载均衡关联ENI实例时,容器端口作为健康检查的检查端口。取值范围为1-65535。 检查周期(秒) 每次健康检查响应的最大间隔时间,取值范围为1-50。 超时时间(秒) 每次健康检查响应的最大超时时间,取值范围为1-50。 最大重试次数 健康检查最大的重试次数,取值范围为1-10。 端口配置: 协议:请根据业务的协议类型选择。 服务端口:Service使用的端口,端口范围为1-65535。 容器端口:工作负载程序实际监听的端口,需用户确定。例如nginx默认使用80端口。 监听器前端协议:ELB监听器的前端协议,是客户端与负载均衡监听器建立流量分发连接所使用的协议。当选择独享型负载均衡器类型时,包含“应用型(HTTP/HTTPS)”方可支持配置HTTP/HTTPS。 健康检查:健康检查选项设置为“自定义检查”时,可以为不同协议的端口配置健康检查,参数说明请参见表2。 在创建LoadBalancer类型Service时,会自动生成一个随机节点端口号(NodePort)。 注解:LoadBalancer类型Service有一些CCE定制的高级功能,通过注解annotations实现,具体注解的内容请参见使用Annotation配置负载均衡。 单击“确定”,创建Service。
  • 操作场景 负载均衡(LoadBalancer)类型的服务可以通过弹性负载均衡(ELB)从公网访问到工作负载,与弹性IP方式相比提供了高可靠的保障。负载均衡访问方式由公网弹性负载均衡服务地址以及设置的访问端口组成,例如“10.117.117.117:80”。 在使用CCE Autopilot集群 + 独享型ELB实例时,支持ELB直通Pod,使部署在容器中的业务时延降低、性能无损耗。 从集群外部访问时,从ELB直接转发到Pod;集群内部访问可通过Service转发到Pod。 图1 ELB直通容器
  • 通过kubectl命令行创建 Service使用HTTP/HTTPS协议时,需要添加如下annotation: kubernetes.io/elb.protocol-port: "https:443,http:80" protocol-port的取值需要和service的spec.ports字段中的端口对应,格式为protocol:port,port中的端口会匹配service.spec.ports中端口,并将该端口发布成对应的protocol协议。 kubernetes.io/elb.cert-id: "17e3b4f4bc40471c86741dc3aa211379" cert-id内容为ELB证书管理的证书ID,当protocol-port指定了https协议,ELB监听器的证书会设置为服务器证书,当发布多个HTTPS的服务,会使用同一份证书。 以自动创建独享型ELB为例,配置示例如下,其中关键配置通过红色字体标出: 不同的ELB类型以及集群版本对flavor存在不同的要求,详情请参见表1。 spec.ports中两个端口需要与kubernetes.io/elb.protocol-port中对应,本例中将443端口、80端口分别发布成HTTPS、HTTP协议。 apiVersion: v1 kind: Service metadata: annotations: # 在自动创建ELB参数中指定4层和7层的flavor kubernetes.io/elb.autocreate: ' { "type": "public", "bandwidth_name": "cce-bandwidth-1634816602057", "bandwidth_chargemode": "bandwidth", "bandwidth_size": 5, "bandwidth_sharetype": "PER", "eip_type": "5_bgp", "available_zone": [ "cn-north-4b" ], "l7_flavor_name": "L7_flavor.elb.s2.small", "l4_flavor_name": "L4_flavor.elb.s1.medium" }' kubernetes.io/elb.class: performance # 独享型ELB kubernetes.io/elb.protocol-port: "https:443,http:80" # HTTP/HTTPS协议及端口号,需要与spec.ports中的端口号对应 kubernetes.io/elb.cert-id: "17e3b4f4bc40471c86741dc3aa211379" # ELB服务中的证书ID labels: app: nginx name: test name: test namespace: default spec: ports: - name: cce-service-0 port: 443 protocol: TCP targetPort: 80 - name: cce-service-1 port: 80 protocol: TCP targetPort: 80 selector: app: nginx version: v1 sessionAffinity: None type: LoadBalancer 使用上面的示例创建Service,在新建的ELB实例中可以看到创建了443端口和80端口的监听器。
  • 通过控制台创建 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“服务”,在右上角单击“创建服务”。 设置Service参数。本示例中仅列举使用HTTP/HTTPS协议必选参数,其余参数可根据需求参考创建LoadBalancer类型Service进行设置。 Service名称:自定义服务名称,可与工作负载名称保持一致。 访问类型:选择“负载均衡”。 选择器:添加标签,Service根据标签选择Pod,填写后单击“确认添加”。也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”。 负载均衡器:选择弹性负载均衡的类型、创建方式。 类型:“独享型”或“共享型”,其中独享型ELB需选择“应用型(HTTP/HTTPS)”或“网络型(TCP/UDP/TLS)&应用型(HTTP/HTTPS)”,否则监听器端口将无法启用HTTP/HTTPS。 创建方式:本文中以选择已有ELB为例进行说明,关于自动创建的配置参数请参见表1。 端口配置: 协议:请选择TCP协议,选择UDP协议将无法使用HTTP/HTTPS。 服务端口:Service使用的端口,端口范围为1-65535。 容器端口:工作负载程序实际监听的端口,需用户确定。例如nginx默认使用80端口。 监听器前端协议:设置监听器端口是否开启HTTP/HTTPS。当选择独享型负载均衡器类型时,需包含“应用型(HTTP/HTTPS)”方可支持配置HTTP/HTTPS。 监听器配置: SSL解析方式:当监听器端口启用HTTPS时可选择SSL解析方式。 单向认证:仅进行服务器端认证。如需认证客户端身份,请选择双向认证。 双向认证:双向认证需要负载均衡实例与访问用户互相提供身份认证,从而允许通过认证的用户访问负载均衡实例,后端服务器无需额外配置双向认证。 CA证书:SSL解析方式选择“双向认证”时需要添加CA证书,用于认证客户端身份。CA证书又称客户端CA公钥证书,用于验证客户端证书的签发者;在开启HTTPS双向认证功能时,只有当客户端能够出具指定CA签发的证书时,HTTPS连接才能成功。 服务器证书:当监听器端口启用HTTPS时,必须选择一个服务器证书。如果当前无可选证书,需前往弹性负载均衡控制台进行创建,详情请参见创建证书。 SNI:当监听器端口启用HTTPS时,可以选择是否添加SNI证书。如果需要添加SNI证书,证书中必须包含域名。如果当前无可选证书,需前往弹性负载均衡控制台进行创建,详情请参见创建证书。 当发布多个HTTPS的服务,所有监听器会使用相同的证书配置。 图1 配置HTTP/HTTPS协议 单击“确定”,创建Service。
  • 约束与限制 Service使用HTTP/HTTPS协议仅v1.19.16及以上版本集群支持。 表1 ELB支持HTTP/HTTPS协议的场景 ELB类型 使用场景 是否支持HTTP/HTTPS协议 说明 共享型ELB 对接已有ELB 支持 - 自动创建ELB 支持 - 独享型ELB 对接已有ELB 支持(需使用YAML创建) v1.19.16-r50、v1.21.11-r10、v1.23.9-r10、v1.25.4-r10、v1.27.1-r10以下版本:需要同时支持4层和7层的flavor v1.19.16-r50、v1.21.11-r10、v1.23.9-r10、v1.25.4-r10、v1.27.1-r10及以上版本:需要支持7层的flavor 自动创建ELB 支持(需使用YAML创建) v1.19.16-r50、v1.21.11-r10、v1.23.9-r10、v1.25.4-r10、v1.27.1-r10以下版本:需要同时支持4层和7层的flavor v1.19.16-r50、v1.21.11-r10、v1.23.9-r10、v1.25.4-r10、v1.27.1-r10及以上版本:需要支持7层的flavor 请勿将Ingress与使用HTTP/HTTPS的Service对接同一个ELB下的同一个监听器,否则将产生端口冲突。
  • 命名空间类别 命名空间按创建类型分为两大类:集群默认创建的、用户创建的。 集群默认创建的:集群在启动时会默认创建default、kube-public、kube-system、kube-node-lease命名空间。 default:所有未指定Namespace的对象都会被分配在default命名空间。 kube-public:此命名空间下的资源可以被所有人访问(包括未认证用户),使集群中的某些资源可以在整个集群范围内可见可读。 该命名空间为Kubernetes预留的命名空间,其公共属性只是一种约定而并非要求。 kube-system:所有由Kubernetes系统创建的资源都处于这个命名空间。 kube-node-lease:每个节点在该命名空间中都有一个关联的“Lease”对象,该对象由节点定期更新。NodeStatus和NodeLease都被视为来自节点的心跳,在v1.13之前的版本中,节点的心跳只有NodeStatus,NodeLease特性从v1.13开始引入。NodeLease比NodeStatus更轻量级,该特性在集群规模扩展性和性能上有明显提升。 用户创建的:用户可以按照需要创建命名空间,例如开发环境、联调环境和测试环境分别创建对应的命名空间。或者按照不同的业务创建对应的命名空间,例如系统若分为登录和游戏服务,可以分别创建对应命名空间。
  • 创建命名空间 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“命名空间”,在右上角单击“创建命名空间”。 参照表1设置命名空间参数。 表1 命名空间基本信息 参数 参数说明 名称 新建命名空间的名称,命名必须唯一。 描述 输入对命名空间的描述信息。 配额管理 资源配额可以限制命名空间下的资源使用,进而支持以命名空间为粒度的资源划分。 须知: 建议根据需要在命名空间中设置资源配额,避免因资源过载导致集群或节点异常。 例如:在集群中每个节点可以创建的实例(Pod)数默认为110个,如果您创建的是50节点规格的集群,则最多可以创建5500个实例。因此,您可以在命名空间中自行设置资源配额以确保所有命名空间内的实例总数不超过5500个,以避免资源过载。 请输入整型数值,不输入表示不限制该资源的使用。 若您需要限制CPU或内存的配额,则创建工作负载时必须指定CPU或内存请求值。 配置完成后,单击“确定”。
  • 使用kubectl创建Namespace 使用如下方式定义Namespace。 apiVersion: v1 kind: Namespace metadata: name: custom-namespace 使用kubectl命令创建。 $ kubectl create -f custom-namespace.yaml namespace/custom-namespace created 您还可以使用kubectl create namespace命令创建。 $ kubectl create namespace custom-namespace namespace/custom-namespace created
共100000条