华为云用户手册

  • 跨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污点。该操作会驱逐节点上的负载,可能导致业务不连续,请谨慎选择。
  • 约束与限制 该特性存在集群版本限制,仅在以下版本中生效: 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字符
  • 通过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控制台中查看工作负载状态处于“运行中”。
  • 通过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配置存根域:可以直接在控制台添加,简单易操作。 使用 CoreDNS Hosts 插件配置任意域名解析:简单直观,可以添加任意解析记录,类似在本地/etc/hosts中添加解析记录。 使用 CoreDNS Rewrite 插件指向域名到集群内服务:相当于给Kubernetes中的Service名称取了个别名,无需提前知道解析记录的IP地址。 使用 CoreDNS Forward 插件将自建 DNS 设为上游 DNS:自建DNS中,可以管理大量的解析记录,解析记录专门管理,增删记录无需修改CoreDNS配置。
  • 添加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}
  • 修改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配置存根域 集群管理员可以修改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}
  • 转包周期 如果您在购买按需计费集群后,想更换为包周期计费,可按如下步骤进行操作: 登录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 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个匹配。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。
  • 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
  • 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负载挂载使用。
  • 创建快照 使用控制台创建 登录CCE控制台。 单击集群名称进入集群,在左侧选择“容器存储”,在右侧选择“快照与备份”页签。 单击右上角“创建快照”,在弹出的窗口中设置相关参数。 快照名称:填写快照的名称。 选择存储:选择要创建快照的PVC,仅能创建云硬盘类型PVC。 单击“创建”。 使用YAML创建 kind: VolumeSnapshotapiVersion: snapshot.storage.k8s.io/v1beta1metadata: finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection name: cce-disksnap-test namespace: defaultspec: source: persistentVolumeClaimName: pvc-evs-test # PVC的名称,仅能创建云硬盘类型PVC volumeSnapshotClassName: csi-disk-snapclass
  • 使用快照创建PVC 通过快照创建云硬盘PVC时,磁盘类型、磁盘模式、加密属性需和快照源云硬盘保持一致。 使用控制台创建 登录CCE控制台。 单击集群名称进入集群,在左侧选择“容器存储”,在右侧选择“快照与备份”页签。 找到需要创建PVC的快照,单击“创建存储卷声明”,并在弹出窗口中指定PVC的名称。 单击“创建”。 使用YAML创建 apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-test namespace: default 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 dataSource: name: cce-disksnap-test # 快照的名称 kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io
  • 扩展网段规划说明 在添加扩展网段前,需做好网段规划,避免造成网段冲突。注意以下几点: 集群所在VPC下所有子网(包括扩展网段子网)不能和容器网段、服务网段冲突。 扩展网段选择10.0.0.0/8、172.16.0.0/12、192.168.0.0/16可能与集群Master分配的IP冲突,尽量避免选择这三个网段作为扩展网段。 同VPC的非集群内ECS,如果需要和集群互访,访问会做SNAT, Pod源地址是节点IP而非Pod IP。 如果扩展网段没添加过集群节点,那扩展网段的ECS不能访问集群内Pod;扩展网段添加集群节点后,扩展网段的ECS可以访问集群内Pod。
  • 使用须知 快照功能仅支持v1.15及以上版本的集群,且需要安装基于CSI的Everest插件才可以使用。 基于快照创建的云硬盘,其子类型(普通IO/高IO/超高IO)、是否加密、磁盘模式(VBD/SCSI)、共享性(非共享/共享)、容量等都要与快照关联母盘保持一致,这些属性查询和设置出来后不能够修改。 只有可用或正在使用状态的磁盘能创建快照。快照免费试用期间,单个磁盘最大支持创建7个快照。 创建快照功能仅支持使用everest插件提供的存储类(StorageClass名称以csi开头)创建的PVC。使用Flexvolume存储类(StorageClass名为ssd、sas、sata)创建的PVC,无法创建快照。 加密磁盘的快照数据以加密方式存放,非加密磁盘的快照数据以非加密方式存放。
  • 使用场景 快照功能可以帮助您实现以下需求: 日常备份数据 通过对云硬盘定期创建快照,实现数据的日常备份,可以应对由于误操作、病毒以及黑客攻击等导致数据丢失或不一致的情况。 快速恢复数据 更换操作系统、应用软件升级或业务数据迁移等重大操作前,您可以创建一份或多份快照,一旦升级或迁移过程中出现问题,可以通过快照及时将业务恢复到快照创建点的数据状态。 例如,当由于云服务器 A的系统盘 A发生故障而无法正常开机时,由于系统盘 A已经故障,因此也无法将快照数据回滚至系统盘A。此时您可以使用系统盘 A已有的快照新创建一块云硬盘 B并挂载至正常运行的云服务器 B上,从而云服务器 B能够通过云硬盘 B读取原系统盘 A的数据。 当前CCE提供的快照能力与K8s社区CSI快照功能一致:只支持基于快照创建新云硬盘,不支持将快照回滚到源云硬盘。 快速部署多个业务 通过同一个快照可以快速创建出多个具有相同数据的云硬盘,从而可以同时为多种业务提供数据资源。例如数据挖掘、报表查询和开发测试等业务。这种方式既保护了原始数据,又能通过快照创建的新云硬盘快速部署其他业务,满足企业对业务数据的多元化需求。
  • default-secret default-secret的类型为kubernetes.io/dockerconfigjson,其data内容是登录SWR镜像仓库的凭据,用于从SWR拉取镜像。在CCE中创建工作负载时如果需要从SWR拉取镜像,需要配置imagePullSecrets的取值为default-secret,如下所示。 apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: nginx:alpine name: container-0 resources: limits: cpu: 100m memory: 200Mi requests: cpu: 100m memory: 200Mi imagePullSecrets: - name: default-secret default-secret的data数据会定期更新,且当前的data内容会在一定时间后会过期失效。您可以使用describe命令在default-secret的中查看到具体的过期时间,如下所示。 在使用时请直接使用default-secret,而不要拷贝secret内容重新创建,因为secret里面的凭据会过期,从而导致无法拉取镜像。 $ kubectl describe secret default-secretName: default-secretNamespace: defaultLabels: secret-generated-by=cceAnnotations: temporary-ak-sk-expires-at: 2021-11-26 20:55:31.380909 +0000 UTCType: kubernetes.io/dockerconfigjsonData====.dockerconfigjson: 347 bytes
  • 导入存储池 创建节点时导入 在创建节点时,在存储配置中可以为节点添加数据盘,选择“作为持久存储卷”导入存储池,详情请参见创建节点。 手动导入 如果创建节点时没有导入持久存储卷,或当前存储卷容量不够,可以进行手动导入。 前往ECS控制台为节点添加SCSI类型的磁盘。操作步骤详情请参见新增磁盘。 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“容器存储”,并切换至“存储池”页签。 查看已添加磁盘的节点,选择“导入持久卷”,导入时可以选择写入模式。 线性:线性逻辑卷是将一个或多个物理卷整合为一个逻辑卷,实际写入数据时会先往一个基本物理卷上写入,当存储空间占满时再往另一个基本物理卷写入。 条带化:创建逻辑卷时指定条带化,当实际写入数据时会将连续数据分成大小相同的块,然后依次存储在多个物理卷上,实现数据的并发读写从而提高读写性能。多块卷才能选择条带化。
共100000条