华为云用户手册

  • 添加/删除节点标签 登录CCE控制台,单击集群名称进入集群。 在集群控制台左侧导航栏中选择“节点管理”,切换至“节点”页签,勾选目标节点,并单击左上方“标签与污点管理”。 在弹出的窗口中,在“批量操作”下方单击“新增批量操作”,然后选择“添加/更新”或“删除”。 填写需要增加/删除标签的“键”和“值”,单击“确定”。 例如,填写的键为“deploy_qa”,值为“true”,就可以从逻辑概念表示该节点是用来部署QA(测试)环境使用。 图1 添加节点标签 标签添加成功后,再次进入该界面,在节点数据下可查看到已经添加的标签。
  • 简介 为帮助您更好地管理Kubernetes集群内的节点,云容器引擎CCE引入节点池概念。节点池是集群中具有相同配置的一组节点,一个节点池包含一个节点或多个节点。 您可以在CCE控制台创建新的自定义节点池,借助节点池基本功能方便快捷地创建、管理和销毁节点,而不会影响整个集群。新节点池中所有节点的参数和类型都彼此相同,您无法在节点池中配置单个节点,任何配置更改都会影响节点池中的所有节点。 通过节点池功能您还可以实现节点的动态扩缩容(仅按需计费的节点池支持): 当集群中出现因资源不足而无法调度的实例(Pod)时,自动触发扩容,为您减少人力成本。 当满足节点空闲等缩容条件时,自动触发缩容,为您节约资源成本。 本章节介绍节点池在云容器引擎(CCE)中的工作原理,以及如何创建和管理节点池。
  • 将工作负载部署到特定节点池 在定义工作负载时,您可以间接的控制将其部署在哪个节点池上。 例如,您可以通过CCE控制台工作负载页面的“调度策略”设置工作负载与节点的亲和性,强制将该工作负载部署到特定节点池上,从而实现该工作负载仅在该节点池中的节点上运行的目的。如果您需要更好地控制工作负载实例的调度位置,您可以使用调度策略(亲和与反亲和)章节中关于工作负载与节点的亲和或反亲和策略相关说明。 您也可以为容器指定资源请求,工作负载将仅在满足资源请求的节点上运行。 例如,如果工作负载定义了需要包含四个CPU的容器,则工作负载将不会选择在具有两个CPU的节点上运行。
  • 功能点及注意事项 功能点 功能说明 注意事项 创建节点池 新增节点池。 单个集群不建议超过100个节点池。 删除节点池 删除节点池时会先删除节点池中的节点,删除包周期节点池会先将节点迁移到默认节点池中,原有节点上的工作负载实例会自动迁移至其他节点池的可用节点。 如果工作负载实例具有特定的节点选择器,且如果集群中的其他节点均不符合标准,则工作负载实例可能仍处于无法安排的状态。 节点池开启弹性伸缩 开启弹性伸缩后,节点池将根据集群负载情况自动创建或删除节点池内的节点。 节点池中的节点建议不要放置重要数据,以防止节点被弹性缩容,数据无法恢复。 节点池关闭弹性伸缩 关闭弹性伸缩后,节点池内节点数量不随集群负载情况自动调整。 / 调整节点池大小 支持直接调整节点池内节点个数。若减小节点数量,将从现有节点池内随机缩容节点。 开启弹性伸缩后,不建议手动调整节点池大小。 调整节点池配置 可修改节点池名称、节点个数,删除或新增K8s标签、污点及资源标签。 删除或新增K8s标签和污点会对节点池内节点全部生效,可能会引起Pod重新调度,请谨慎变更。 移出节点池内节点 可以将同一个集群下某个节点池中的节点迁移到默认节点池(DefaultPool)中 暂不支持将默认节点池(DefaultPool)中的节点迁移到其他节点池中,也不支持将自定义节点池中的节点迁移到其他自定义节点池。 复制节点池 可以方便的复制现有节点池的配置,从而创建新的节点池。 / 配置Kubernetes参数 通过该功能您可以对核心组件进行深度配置。 本功能仅支持在v1.15及以上版本的集群中对节点池进行配置,v1.15以下版本不显示该功能。 默认节点池DefaultPool不支持修改该类配置。
  • 直接访问Pod的问题 Pod创建完成后,如何访问Pod呢?直接访问Pod会有如下几个问题: Pod会随时被Deployment这样的控制器删除重建,那访问Pod的结果就会变得不可预知。 Pod的IP地址是在Pod启动后才被分配,在启动前并不知道Pod的IP地址。 应用往往都是由多个运行相同镜像的一组Pod组成,逐个访问Pod也变得不现实。 举个例子,假设有这样一个应用程序,使用Deployment创建了前台和后台,前台会调用后台做一些计算处理,如图1所示。后台运行了3个Pod,这些Pod是相互独立且可被替换的,当Pod出现状况被重建时,新建的Pod的IP地址是新IP,前台的Pod无法直接感知。 图1 Pod间访问
  • 服务亲和(externalTrafficPolicy) NodePort类型及LoadBalancer类型的Service接收请求时,会先访问到节点,然后转到Service,再由Service选择一个Pod转发到该Pod,但Service选择的Pod不一定在接收请求的节点上。默认情况下,从任意节点IP+服务端口都能访问到后端工作负载,当Pod不在接收请求的节点上时,请求会再跳转到Pod所在的节点,带来一定性能损失。 Service有一个配置参数(externalTrafficPolicy),用于设置Service是否希望将外部流量路由到节点本地或集群范围的端点,示例如下: apiVersion: v1 kind: Service metadata: name: nginx-nodeport spec: externalTrafficPolicy: Local ports: - name: service nodePort: 30000 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: NodePort 当externalTrafficPolicy取值为Local时,通过节点IP:服务端口的请求只会转发给本节点上的Pod,如果节点没有Pod的话请求会挂起。 当externalTrafficPolicy取值为Cluster时,请求会在集群内转发,从任意节点IP+服务端口都能访问到后端工作负载。 如不设置externalTrafficPolicy,默认取值为Cluster。 在CCE 控制台创建NodePort类型Service时,也可以通过“服务亲和”选项配置该参数。 总结服务亲和(externalTrafficPolicy)的两个选项对比如下: 表1 服务亲和特性对比 对比维度 服务亲和(externalTrafficPolicy) 集群级别(Cluster) 节点级别(Local) 使用场景 适用于对性能要求不高,无需保留客户端源IP场景,此方式能为集群各节点带来更均衡的负载。 适用于客户端源IP需要保留且对性能要求较高的业务,但是流量仅会转发至容器所在的节点,不会做源地址转换。 访问方式 集群下所有节点的IP+访问端口均可以访问到此服务关联的负载。 只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载。 获取客户端源IP 无法获取到客户端源IP。 可以获取到客户端源IP。 访问性能 服务访问会因路由跳转导致一定性能损失,可能导致第二跳到另一个节点。 服务访问没有因路由跳转导致的性能损失。 负载均衡性 流量传播具有良好的整体负载均衡性。 存在潜在的不均衡流量传播风险。 其他特殊情况 - 在不同容器网络模型和服务转发模式下,可能出现集群内无法访问Service的情况,详情请参见集群内无法访问Service的说明。
  • 集群内无法访问Service的说明 当Service设置了服务亲和为节点级别,即externalTrafficPolicy取值为Local时,在使用中可能会碰到从集群内部(节点上或容器中)访问不通的情况,回显类似如下内容: upstream connect error or disconnect/reset before headers. reset reason: connection failure 或: curl: (7) Failed to connect to 192.168.10.36 port 900: Connection refused 在集群中访问ELB地址时出现无法访问的场景较为常见,这是由于Kubernetes在创建Service时,kube-proxy会把ELB的访问地址作为外部IP(即External-IP,如下方回显所示)添加到iptables或IPVS中。如果客户端从集群内部发起访问ELB地址的请求,该地址会被认为是服务的外部IP,被kube-proxy直接转发,而不再经过集群外部的ELB。 # kubectl get svc nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.247.76.156 123.**.**.**,192.168.0.133 80:32146/TCP 37s 当externalTrafficPolicy的取值为Local时,在不同容器网络模型和服务转发模式下访问不通的场景如下: 多实例的工作负载需要保证所有实例均可正常访问,否则可能出现概率性访问不通的情况。 CCE Turbo 集群(云原生2.0网络模型)中,仅当Service的后端对接使用主机网络(HostNetwork)的Pod时,亲和级别支持配置为节点级别。 表格中仅列举了可能存在访问不通的场景,其他不在表格中的场景即表示可以正常访问。 服务端发布服务类型 访问类型 客户端请求发起位置 容器隧道集群(IPVS) VPC集群(IPVS) 容器隧道集群(IPTABLES) VPC集群(IPTABLES) 节点访问类型Service 公网/私网 与服务Pod同节点 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 与服务Pod不同节点 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 正常访问 正常访问 与服务Pod同节点的其他容器 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 无法访问 与服务Pod不同节点的其他容器 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 独享型负载均衡类型Service 私网 与服务Pod同节点 无法访问 无法访问 无法访问 无法访问 与服务Pod同节点的其他容器 无法访问 无法访问 无法访问 无法访问 DNAT网关类型Service 公网 与服务Pod同节点 无法访问 无法访问 无法访问 无法访问 与服务Pod不同节点 无法访问 无法访问 无法访问 无法访问 与服务Pod同节点的其他容器 无法访问 无法访问 无法访问 无法访问 与服务Pod不同节点的其他容器 无法访问 无法访问 无法访问 无法访问 nginx-ingress插件对接独享型ELB(Local) 私网 与cceaddon-nginx-ingress-controller Pod同节点 无法访问 无法访问 无法访问 无法访问 与cceaddon-nginx-ingress-controller Pod同节点的其他容器 无法访问 无法访问 无法访问 无法访问 解决这个问题通常有如下办法: (推荐)在集群内部访问使用Service的ClusterIP或服务 域名 访问。 将Service的externalTrafficPolicy设置为Cluster,即集群级别服务亲和。不过需要注意这会影响源地址保持。 apiVersion: v1 kind: Service metadata: annotations: kubernetes.io/elb.class: union kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}' labels: app: nginx name: nginx spec: externalTrafficPolicy: Cluster ports: - name: service0 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer 使用Service的pass-through特性,使用ELB地址访问时绕过kube-proxy,先访问ELB,经过ELB再访问到负载。具体请参见LoadBalancer类型Service使用pass-through能力。 独享型负载均衡配置pass-through后,CCE Standard集群在工作负载同节点和同节点容器内无法通过Service访问。 1.15及以下老版本集群暂不支持该能力。 IPVS网络模式下,对接同一个ELB的Service需保持pass-through设置情况一致。 使用节点级别(Local)的服务亲和的场景下,会自动设置kubernetes.io/elb.pass-through为onlyLocal,开启pass-through能力。 apiVersion: v1 kind: Service metadata: annotations: kubernetes.io/elb.pass-through: "true" kubernetes.io/elb.class: union kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}' labels: app: nginx name: nginx spec: externalTrafficPolicy: Local ports: - name: service0 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer
  • 使用Service解决Pod的访问问题 Kubernetes中的Service对象就是用来解决上述Pod访问问题的。Service有一个固定IP地址(在创建CCE集群时有一个服务网段的设置,这个网段专门用于给Service分配IP地址),Service将访问它的流量转发给Pod,具体转发给哪些Pod通过Label来选择,而且Service可以给这些Pod做负载均衡。 那么对于上面的例子,为后台添加一个Service,通过Service来访问Pod,这样前台Pod就无需感知后台Pod的变化,如图2所示。 图2 通过Service访问Pod
  • 创建LoadBalancer类型Service 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“服务”,在右上角单击“创建服务”。 设置参数。 Service名称:自定义服务名称,可与工作负载名称保持一致。 访问类型:选择“负载均衡”。 命名空间:工作负载所在命名空间。 服务亲和:详情请参见服务亲和(externalTrafficPolicy)。 集群级别:集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。 节点级别:只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。 选择器:添加标签,Service根据标签选择Pod,填写后单击“确认添加”。也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”。 IPv6:默认不开启,开启后服务的集群内IP地址(ClusterIP)变为IPv6地址,具体请参见如何通过CCE搭建IPv4/IPv6双栈集群?。该功能仅在1.15及以上版本的集群创建时开启了IPv6功能才会显示。 负载均衡器:选择弹性负载均衡的类型、创建方式。 ELB类型可选择“独享型”或“共享型”,独享型ELB还可以根据支持的协议类型选择“网络型(TCP/UDP/TLS)”、“应用型(HTTP/HTTPS)”或“网络型(TCP/UDP/TLS)&应用型(HTTP/HTTPS)”。 创建方式可选择“选择已有”或“自动创建”。不同创建方式的配置详情请参见表1。 当集群使用共享VPC时,不支持自动创建共享型ELB。 表1 ELB配置 创建方式 配置 选择已有 仅支持选择与集群在同一个VPC下的ELB实例。如果没有可选的ELB实例,请单击“创建负载均衡器”跳转到ELB控制台创建。 自动创建 实例名称:请填写ELB名称。 企业项目:该参数仅对开通企业项目的企业客户账号显示。企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。 可用区(仅独享型ELB支持):可以选择在多个可用区创建负载均衡实例,提高服务的可用性。如果业务需要考虑容灾能力,建议选择多个可用区。 前端子网(仅独享型ELB支持):用于分配ELB实例对外服务的IP地址。 后端子网(仅独享型ELB支持):用于与后端服务建立连接的IP地址。 网络型规格/应用型规格/规格(仅独享型ELB支持): 弹性规格:适用于业务用量波动较大的场景,按实际使用量收取每小时使用的容量费用。v1.21.10-r10、v1.23.8-r10、v1.25.3-r10及以上版本集群支持使用弹性规格。 固定规格:适用于业务用量较为稳定的场景,按固定规格折算收取每小时使用的容量费用。 弹性公网IP:选择“自动创建”时,可配置公网带宽的计费方式及带宽大小。 资源标签:通过为资源添加标签,可以对资源进行自定义标记,实现资源的分类。您可以在TMS中创建“预定义标签”,预定义标签对所有支持标签功能的服务资源可见,通过使用预定义标签可以提升标签创建和迁移效率。 全域弹性公网(仅独享型ELB支持):选择绑定全域弹性公网IP实例,实现公网带宽资源在实例间分配与使用,控制全域弹性公网IP与公网间通信的速率。关于全域弹性公网更多信息,请参见全域公网带宽概述。 负载均衡配置:您可以单击负载均衡配置的图标配置ELB实例的参数,在弹出窗口中配置ELB实例的参数。 分配策略:可选择加权轮询算法、加权最少连接或源IP算法。 加权轮询算法:根据后端服务器的权重,按顺序依次将请求分发给不同的服务器。它用相应的权重表示服务器的处理性能,按照权重的高低以及轮询方式将请求分配给各服务器,相同权重的服务器处理相同数目的连接数。常用于短连接服务,例如HTTP等服务。 加权最少连接:最少连接是通过当前活跃的连接数来估计服务器负载情况的一种动态调度算法。加权最少连接就是在最少连接数的基础上,根据服务器的不同处理能力,给每个服务器分配不同的权重,使其能够接受相应权值数的服务请求。常用于长连接服务,例如数据库连接等服务。 源IP算法:将请求的源IP地址进行Hash运算,得到一个具体的数值,同时对后端服务器进行编号,按照运算结果将请求分发到对应编号的服务器上。这可以使得对不同源IP的访问进行负载分发,同时使得同一个客户端IP的请求始终被派发至某特定的服务器。该方式适合负载均衡无cookie功能的TCP协议。 会话保持类型:默认不启用,可选择“源IP地址”。基于源IP地址的简单会话保持,即来自同一IP地址的访问请求转发到同一台后端服务器上。 当分配策略使用源IP算法时,不支持设置会话保持。 健康检查:设置负载均衡的健康检查配置。 全局检查:全局检查仅支持使用相同协议的端口,无法对多个使用不同协议的端口生效,建议使用“自定义检查”。 自定义检查:在端口配置中对多种不同协议的端口设置健康检查。关于自定义检查的YAML定义,请参见Service指定多个端口配置健康检查。 表2 健康检查参数 参数 说明 协议 当端口配置协议为TCP时,支持TCP和HTTP协议;当端口配置协议为UDP时,支持UDP协议。 检查路径(仅HTTP健康检查协议支持):指定健康检查的URL地址。检查路径只能以/开头,长度范围为1-80。 端口 健康检查默认使用业务端口(Service的NodePort和容器端口)作为健康检查的端口;您也可以重新指定端口用于健康检查,重新指定端口会为服务增加一个名为cce-healthz的服务端口配置。 节点端口:使用共享型负载均衡或不关联ENI实例时,节点端口作为健康检查的检查端口;如不指定将随机一个端口。取值范围为30000-32767。 容器端口:使用独享型负载均衡关联ENI实例时,容器端口作为健康检查的检查端口。取值范围为1-65535。 检查周期(秒) 每次健康检查响应的最大间隔时间,取值范围为1-50。 超时时间(秒) 每次健康检查响应的最大超时时间,取值范围为1-50。 最大重试次数 健康检查最大的重试次数,取值范围为1-10。 端口配置: 协议:请根据业务的协议类型选择。Service在使用ELB提供的TLS或HTTP协议时,根据Kubernetes中定义的实现方案,需要将该参数设置为TCP并选择对应的监听器前端协议。详细说明请参见Service所用的协议。 服务端口:Service使用的端口,端口范围为1-65535。 容器端口:工作负载程序实际监听的端口,需用户确定。例如nginx默认使用80端口。 监听器前端协议:ELB监听器的前端协议,是客户端与负载均衡监听器建立流量分发连接所使用的协议。当选择独享型负载均衡器类型时,包含“应用型(HTTP/HTTPS)”方可支持配置HTTP/HTTPS;包含“网络型(TCP/UDP/TLS)”方可支持配置TLS。 健康检查:健康检查选项设置为“自定义检查”时,可以为不同协议的端口配置健康检查,参数说明请参见表2。 在创建LoadBalancer类型Service时,会自动生成一个随机节点端口号(NodePort)。 监听器配置: SSL解析方式:当监听器端口启用HTTPS/TLS时可选择SSL解析方式。 单向认证:仅进行服务器端认证。如需认证客户端身份,请选择双向认证。 双向认证:双向认证需要负载均衡实例与访问用户互相提供身份认证,从而允许通过认证的用户访问负载均衡实例,后端服务器无需额外配置双向认证。 CA证书:SSL解析方式选择“双向认证”时需要添加CA证书,用于认证客户端身份。CA证书又称客户端CA公钥证书,用于验证客户端证书的签发者;在开启HTTPS双向认证功能时,只有当客户端能够出具指定CA签发的证书时,HTTPS连接才能成功。 服务器证书:当监听器端口启用HTTPS/TLS时,必须选择一个服务器证书。如果当前无可选证书,需前往弹性负载均衡控制台进行创建,详情请参见创建证书。 SNI:当监听器端口启用HTTPS/TLS时,可以选择是否添加SNI证书。如果需要添加SNI证书,则证书中必须包含域名。如果当前无可选证书,需前往弹性负载均衡控制台进行创建,详情请参见创建证书。 如果无法根据客户端请求的域名查找到域名对应的SNI证书,则默认返回服务器证书。 安全策略:当监听器端口启用HTTPS/TLS时,支持选择可用的安全策略,更多信息请参见安全策略。 后端协议:当监听器端口启用HTTPS时,支持使用HTTP或HTTPS协议对接后端服务,默认为HTTP。当监听器端口启用TLS时,支持使用TCP或TLS协议对接后端服务,默认为TCP。 访问控制: 允许所有IP访问:不设置访问控制。 白名单:仅所选IP地址组可以访问ELB地址。 黑名单:所选IP地址组无法访问ELB地址。 高级配置: 配置 说明 使用限制 获取监听器端口号 开启后可以将ELB实例的监听端口从报文的HTTP头中带到后端云服务器。 独享型ELB实例的端口启用HTTP/HTTPS时支持配置。 获取客户端请求端口号 开启后可以将客户端的源端口从报文的HTTP头中带到后端云服务器。 独享型ELB实例的端口启用HTTP/HTTPS时支持配置。 重写X-Forwarded-Host 开启后将以客户端请求头的Host重写X-Forwarded-Host传递到后端云服务器。 独享型ELB实例的端口启用HTTP/HTTPS时支持配置。 数据压缩 开启将对特定文件类型进行压缩;关闭则不会对任何文件类型进行压缩。 Brotli支持压缩所有类型。 Gzip支持压缩的类型如下: text/xml text/plain text/css application/javascript application/x-javascript application/rss+xml application/atom+xml application/xml application/json。 独享型ELB实例的端口启用HTTP/HTTPS时支持配置。 空闲超时时间(秒) 客户端连接空闲超时时间。在超过空闲超时时间一直没有请求, 负载均衡会暂时中断当前连接,直到下一次请求时重新建立新的连接。 共享型ELB实例的端口使用UDP协议时不支持此配置。 请求超时时间(秒) 等待客户端请求超时时间。包括两种情况: 读取整个客户端请求头的超时时长,如果客户端未在超时时长内发送完整个请求头,则请求将被中断。 两个连续body体的数据包到达LB的时间间隔,超出请求超时时间将会断开连接。 仅端口启用HTTP/HTTPS时支持配置。 响应超时时间(秒) 等待后端服务器响应超时时间。请求转发后端服务器后,在等待超过响应超时时间没有响应,负载均衡将终止等待,并返回 HTTP504错误码。 仅端口启用HTTP/HTTPS时支持配置。 开启HTTP2 客户端与LB之间的HTTPS请求的HTTP2功能的开启状态。 开启后,可提升客户端与LB间的访问性能,但LB与后端服务器间仍采用HTTP1.X协议。 仅端口启用HTTPS时支持配置。 注解:LoadBalancer类型Service有一些CCE定制的高级功能,通过注解annotations实现,具体注解的内容请参见使用Annotation配置负载均衡。 单击“确定”,创建Service。
  • 操作场景 负载均衡(LoadBalancer)类型的服务可以通过弹性负载均衡(ELB)从公网访问到工作负载,与弹性IP方式相比提供了高可靠的保障。负载均衡访问方式由公网弹性负载均衡服务地址以及设置的访问端口组成,例如“10.117.117.117:80”。 在访问负载均衡类型的服务时,从ELB过来的流量会先访问到节点,然后通过Service转发到Pod。 图1 负载均衡(LoadBalancer) 在使用CCE Turbo集群 + 独享型ELB实例时,支持ELB直通Pod,使部署在容器中的业务时延降低、性能无损耗。 从集群外部访问时,从ELB直接转发到Pod;集群内部访问可通过Service转发到Pod。 图2 ELB直通容器
  • 约束与限制 CCE中的负载均衡(LoadBalancer)访问类型使用弹性负载均衡 ELB提供网络访问,存在如下产品约束: 自动创建的ELB实例建议不要被其他资源使用,否则会在删除时被占用,导致资源残留。 v1.15及之前版本集群使用的ELB实例请不要修改监听器名称,否则可能导致无法正常访问。 创建Service后,如果服务亲和从集群级别切换为节点级别,连接跟踪表将不会被清理,建议用户创建Service后不要修改服务亲和属性,如需修改请重新创建Service。 当服务亲和设置为节点级别(即externalTrafficPolicy为local)时,集群内部可能使用ELB地址访问不通,具体情况请参见集群内无法访问Service的说明。 CCE Turbo集群(云原生2.0网络模型)中,仅当Service的后端对接使用主机网络(HostNetwork)的Pod时,亲和级别支持配置为节点级别。 独享型ELB仅支持1.17及以上集群。 独享型ELB规格必须支持网络型(TCP/UDP),且网络类型必须支持私网(有私有IP地址)。如果需要Service支持HTTP,则独享型ELB规格需要为网络型(TCP/UDP)和应用型(HTTP/HTTPS)。 使用CCE集群时,如果LoadBalancer类型Service的服务亲和类型为集群级别(Cluster),当请求进入到集群时,会使用SNAT分发到各个节点的节点端口(nodeport),不能超过节点可用的nodeport数量,而服务亲和为节点级别(Local)则无此约束。使用CCE Turbo集群时,如果是使用共享型ELB依然有此约束,而独享型ELB无此约束,建议使用CCE Turbo时配合使用独享型ELB。 集群服务转发模式为IPVS时,不支持配置节点的IP作为Service的externalIP,会导致节点不可用。 IPVS模式集群下,Ingress和Service使用相同ELB实例时,无法在集群内的节点和容器中访问Ingress,因为kube-proxy会在ipvs-0的网桥上挂载LB类型的Service地址,Ingress对接的ELB的流量会被ipvs-0网桥劫持。建议Ingress和Service使用不同ELB实例。
  • 步骤三:验证驱动升级是否成功 节点完成重启后,请稍等几分钟,等待驱动安装。 登录节点,查看节点上的驱动是否更新。 # 插件版本为2.0.0以下时,执行以下命令: cd /opt/cloud/cce/nvidia/bin && ./nvidia-smi # 插件版本为2.0.0及以上时,驱动安装路径更改,需执行以下命令: cd /usr/local/nvidia/bin && ./nvidia-smi 查看节点上实际的驱动,驱动版本为535.54.03,驱动版本已更新。 确认节点及业务运行正常,依次重启节点池下的其他节点。
  • 步骤一:指定节点池驱动版本 登录节点查看节点上实际的驱动,驱动版本为510.47.03。 # 插件版本为2.0.0以下时,执行以下命令: cd /opt/cloud/cce/nvidia/bin && ./nvidia-smi # 插件版本为2.0.0及以上时,驱动安装路径更改,需执行以下命令: cd /usr/local/nvidia/bin && ./nvidia-smi 登录CCE控制台,单击集群名称进入集群控制台。 在集群的插件中心,找到 CCE AI套件(NVIDIA GPU),单击“编辑”。 通过节点池更新节点上的显卡驱动,在“驱动选择”下方选择需要更新驱动的节点池,填写驱动链接,单击“安装”。 本文档中更新后的驱动为535.54.03,链接为NVIDIA官网链接。如果节点无法访问公网,请先下载驱动然后上传到OBS桶中,然后将驱动的OBS链接填在此处,详情请参见获取驱动链接-OBS地址。 等待插件状态变为“运行中”。
  • 插件卸载 登录CCE控制台。 选择CCE集群,单击进入CCE集群总览页面。 在导航栏左侧单击“插件中心”,进入插件中心首页。 选择“CCE 突发弹性引擎 (对接 CCI)”插件,单击“卸载”。 表2 特殊场景说明 特殊场景描述 场景现象 场景说明 CCE集群无节点,卸载插件。 插件卸载失败。 bursting插件卸载时会在集群中启动Job用于清理资源,卸载插件时请保证集群中至少有一个可以调度的节点。 用户直接删除集群,未卸载插件。 用户在CCI侧的命名空间中有资源残留,如果命名空间有计费资源,会造成额外计费。 由于直接删除集群,没有执行插件的资源清理Job,造成资源残留。用户可以手动清除残留命名空间及其下的计费资源来避免额外计费。 关于CCE突发弹性引擎(对接CCI)更多内容详情请参见:CCE突发弹性引擎(对接CCI)。
  • 安装插件 登录CCE控制台。 选择CCE集群,单击进入CCE集群总览页面。 在导航栏左侧单击“插件中心”,进入插件中心首页。 选择“CCE 突发弹性引擎 (对接 CCI)”插件,单击“安装”。 配置插件参数。 表1 插件参数说明 插件参数 说明 选择版本 插件的版本。插件版本和CCE集群存在配套关系,更条信息可以参考CCE突发弹性引擎(对接CCI)插件版本记录。 规格配置 用于配置插件负载的实例数。 网络互通 勾选后将开启CCE集群和CCI两侧pod互访的功能,用户可以根据自身业务选择是否打开。详细功能介绍请参考网络。
  • 工作负载下发 登录CCE控制台。 选择CCE集群,单击进入CCE集群总览页面。 在导航栏左侧单击“工作负载”,进入工作负载首页。 单击“创建工作负载”,具体操作步骤详情请参见创建工作负载。 填写基本信息。“CCI弹性承载”选择“强制调度策略”。关于调度策略更多信息,请参考调度负载到CCI。 进行容器配置。 配置完成后,单击“创建工作负载”。 在工作负载页面,选择工作负载名称,单击进入工作负载管理界面。 工作负载所在节点为CCI集群,说明负载成功已调度到CCI。
  • 使用NodeLocal DNSCache 默认情况下,应用的请求会通过CoreDNS代理,如果需要使用node-local-dns进行DNS缓存代理,您有以下几种方式可以选择: 自动注入:创建Pod时自动配置Pod的dnsConfig字段。(kube-system等系统命名空间下的Pod不支持自动注入) 手动配置:手动配置Pod的dnsConfig字段,从而使用NodeLocal DNSCache。 自动注入 自动注入需要满足如下条件: 在安装插件时,开启DNSConfig自动注入。 命名空间添加node-local-dns-injection=enabled标签。例如,为default命名空间添加该标签的命令如下: kubectl label namespace default node-local-dns-injection=enabled 新建Pod不位于kube-system和kube-public等系统命名空间。 新建Pod没有被打上禁用DNS注入的标签node-local-dns-injection=disabled。 新建Pod的DNSPolicy为ClusterFirstWithHostNet,或Pod为非hostNetwork且DNSPolicy为ClusterFirst。 开启自动注入后,创建的Pod会自动添加如下dnsConfig字段,nameservers中除了NodeLocal DNSCache的地址(169.254.20.10)外,还添加了CoreDNS的地址(10.247.3.10),保障了业务DNS请求高可用。 ... dnsConfig: nameservers: - 169.254.20.10 - 10.247.3.10 searches: - default.svc.cluster.local - svc.cluster.local - cluster.local options: - name: timeout value: '' - name: ndots value: '5' - name: single-request-reopen ... 手动配置 手动配置即自行给Pod加上dnsConfig配置。 创建一个Pod,并在dnsConfig中的nameservers配置中添加NodeLocal DNSCache的地址(169.254.20.10)。 不同集群类型的NodeLocal DNSCache地址如下: CCE Standard集群:169.254.20.10 CCE Turbo集群:169.254.1.1 apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: nginx:alpine name: container-0 dnsConfig: nameservers: - 169.254.20.10 - 10.247.3.10 searches: - default.svc.cluster.local - svc.cluster.local - cluster.local options: - name: ndots value: '2' imagePullSecrets: - name: default-secret
  • 卸载插件 卸载插件后将影响已经使用node-local-dns地址进行域名解析的Pod,请谨慎操作。如需卸载,请先清除命名空间上的node-local-dns-injection=enabled标签,然后删除重建带有上述标签的Pod,待Pod完成重建以后再卸载插件。 卸载前检查。 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“插件中心”,在右侧找到node-local-dns,单击“编辑”。 在“参数配置”中查看是否启用DNS Config自动注入。 如果已启用DNSConfig自动注入: 在左侧导航栏中选择“命名空间”。 检查哪些命名空间存在node-local-dns-injection=enabled的标签,并删除标签,操作步骤请参见管理命名空间标签。 删除上述命名空间中的Pod并重建。 如果未启用DNSConfig自动注入: 使用kubectl连接集群。 检查哪些业务Pod被手动注入DNSConfig。如果在多个命名空间下创建Pod,所有命名空间下的Pod均需要进行检查。 例如,检查default命名空间下的Pod,您可以执行以下命令: kubectl get pod -n default -o yaml 手动清除DNSConfig,并重建Pod。 卸载node-local-dns插件。 在左侧导航栏中选择“插件中心”,在右侧找到node-local-dns,单击“卸载”。 在弹出对话框中单击“确定”。
  • 版本记录 表4 节点本地域名解析加速插件版本记录 插件版本 支持的集群版本 更新特性 社区版本 1.6.2 v1.21 v1.23 v1.25 v1.27 v1.28 v1.29 适配CCE v1.29集群 1.22.20 1.5.2 v1.21 v1.23 v1.25 v1.27 v1.28 修复部分问题 1.22.20 1.5.1 v1.21 v1.23 v1.25 v1.27 v1.28 修复部分问题 1.22.20 1.5.0 v1.21 v1.23 v1.25 v1.27 v1.28 适配CCE v1.28集群 插件多可用区部署模式支持选择均匀分布 插件容器基础镜像切HCE20 1.22.20 1.4.6 v1.19 v1.21 v1.23 v1.25 v1.27 修复golang bug导致的admission-controller实例出现高CPU问题 修复插件升级admission-controller实例不会自动重启问题 1.22.20 1.4.0 v1.19 v1.21 v1.23 v1.25 v1.27 修复插件在CCI场景下pod请求耗时长问题 1.22.20 1.3.7 v1.19 v1.21 v1.23 v1.25 v1.27 - 1.22.20 1.3.5 v1.19 v1.21 v1.23 v1.25 v1.27 适配CCE v1.27集群 1.22.20 1.3.1 v1.19 v1.21 v1.23 v1.25 支持为命名空间自动开启DNS Config自动注入 插件与节点时区一致 1.22.20 1.2.7 v1.19 v1.21 v1.23 v1.25 支持插件实例AZ反亲和配置 1.21.1 1.2.4 v1.19 v1.21 v1.23 v1.25 适配CCE v1.25集群 1.21.1 1.2.2 v1.19 v1.21 v1.23 支持自定义NodeLocal DNSCache规格 1.21.1
  • 插件简介 节点本地域名解析加速(node-local-dns)是基于社区NodeLocal DNSCache提供的插件,通过在集群节点上作为守护程序集运行DNS缓存代理,提高集群DNS性能。 开源社区地址:https://github.com/kubernetes/dns 启用NodeLocal DNSCache之后,DNS查询所遵循的路径如下图所示。 图1 NodeLocal DNSCache查询路径 其中解析线路说明如下: ①:已注入DNS本地缓存的Pod,默认会通过NodeLocal DNSCache解析请求域名。 ②:NodeLocal DNSCache本地缓存如果无法解析请求,则会请求集群CoreDNS进行解析。 ③:对于非集群内的域名,CoreDNS会通过VPC的DNS服务器进行解析。 ④:已注入DNS本地缓存的Pod,如果无法连通NodeLocal DNSCache,则会直接通过CoreDNS解析域名。 ⑤:未注入DNS本地缓存的Pod,默认会通过CoreDNS解析域名。
  • 安装插件 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“插件中心”,在右侧找到节点本地域名解析加速插件,单击“安装”。 在安装插件页面,设置“规格配置”。 表1 插件规格配置 参数 参数说明 插件规格 该插件可配置“单实例”、“高可用”或“自定义”规格。 实例数 选择上方插件规格后,显示插件中的实例数。 选择“自定义”规格时,您可根据需求调整插件实例数。 实例数为1时插件不具备高可用能力,当插件实例所在节点异常时可能导致插件功能无法正常使用,请谨慎选择。 容器 选择插件规格后,显示插件容器的CPU和内存配额。 选择“自定义”规格时,您可根据需求调整插件实例的容器规格。 设置插件支持的“参数配置”。 DNSConfig自动注入:启用后,会创建DNSConfig动态注入控制器,该控制器基于Admission Webhook机制拦截目标命名空间(即命名空间包含标签node-localdns-injection=enabled)下Pod的创建请求,自动为Pod配置DNSConfig。未开启DNSConfig自动注入或Pod属于非目标命名空间,则需要手动给Pod配置DNSConfig。 目标命名空间:启用DNSConfig自动注入时支持设置。仅1.3.0及以上版本的插件支持。 全部开启:CCE会为已创建的命名空间添加标签(node-local-dns-injection=enabled),同时会识别命名空间的创建请求并自动添加标签,这些操作的目标不包含系统内置的命名空间(如kube-system)。 手动配置:手动为需要注入DNSConfig的命名空间添加标签(node-local-dns-injection=enabled),操作步骤请参见管理命名空间标签。 设置插件实例的“调度策略”。 调度策略对于DaemonSet类型的插件实例不会生效。 设置多可用区部署或节点亲和策略时,需保证集群中存在满足调度策略的节点且拥有足够的资源,否则插件实例将无法运行。 表2 插件调度配置 参数 参数说明 多可用区部署 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区。 均分模式:插件Deployment实例均匀调度到当前集群下各可用区,增加新的可用区后建议扩容插件实例以实现跨可用区高可用部署;均分模式限制不同可用区间插件实例数相差不超过1,单个可用区资源不足会导致后续其他实例无法调度。 强制模式:插件Deployment实例强制调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将无法全部运行。 节点亲和 不配置:插件实例不指定节点亲和调度。 指定节点调度:指定插件实例部署的节点。若不指定,将根据集群默认调度策略进行随机调度。 指定节点池调度:指定插件实例部署的节点池。若不指定,将根据集群默认调度策略进行随机调度。 自定义亲和策略:填写期望插件部署的节点标签实现更灵活的调度策略,若不填写将根据集群默认调度策略进行随机调度。 同时设置多条自定义亲和策略时,需要保证集群中存在同时满足所有亲和策略的节点,否则插件实例将无法运行。 容忍策略 容忍策略与节点的污点能力配合使用,允许(不强制)插件的 Deployment 实例调度到带有与之匹配的污点的节点上,也可用于控制插件的 Deployment 实例所在的节点被标记污点后插件的 Deployment 实例的驱逐策略。 插件会对实例添加针对node.kubernetes.io/not-ready和node.kubernetes.io/unreachable污点的默认容忍策略,容忍时间窗为60s。 详情请参见容忍策略。 完成以上配置后,单击“安装”。
  • 通过kubectl命令行设置 您可以通过对Deployment添加annotations指定Pod的IPv6双栈网卡将要加入的共享带宽,如下所示。 ... spec: selector: matchLabels: app: demo version: v1 template: metadata: annotations: yangtse.io/ipv6-bandwidth-id: "xxx" yangtse.io/ipv6-bandwidth-id:共享带宽的ID,Pod对应的IPv6双栈网卡将加入此共享带宽。该ID可前往弹性公网IP控制台中的“共享带宽”页面查询。
  • 约束限制 仅支持CCE Turbo集群,且需要满足以下条件: 集群已开启IPv6双栈。 集群版本为v1.23.8-r0、v1.25.3-r0及以上。 共享带宽可加入的IPv6网卡数受限于租户配额,目前默认为20;配额约束请参见使用限制。 不支持HostNetwork的Pod。 支持所有类型的工作负载,特别地,为Deployment,Statefulset等有副本数属性的工作负载配置IPv6共享带宽时,需确保副本数以及升级过程中最大的Pod数小于共享带宽当前剩余可加入的IPv6网卡数。 配置了共享带宽的IPv6双栈Pod:Pod创建时,CNI会等待IPv6双栈网卡插入共享带宽完成后才会返回成功;Pod删除时,会等待Pod完全删除或最长30秒删除状态后进行IPv6双栈网卡移出共享带宽。 如果Pod对应的IPv6双栈网卡加入共享带宽失败,Pod上会有Event告警事件FailedIPv6InsertBandwidth(如超过配额,触发流控等),请根据告警事件进行相应的处理。 弹性公网IP控制台中的“共享带宽”页面,单击共享带宽详情下的“IPv6网卡”页签,可以看到所属实例为“云容器引擎”的IPv6双栈网卡,请勿在页面上直接移除或调用VPC的API移除,以免影响您的业务。
  • 解决方案 问题场景一:ntpd运行异常 请登录该节点,执行systemctl status ntpd命令查询ntpd服务运行状态。若回显状态异常,请执行systemctl restart ntpd命令后重新查询状态。 以下为正常回显: 图1 ntpd运行状态 若重启ntpd服务无法解决该问题,请联系技术支持人员。 问题场景二:chronyd运行异常 请登录该节点,执行systemctl status chronyd命令查询chronyd服务运行状态。若回显状态异常,请执行systemctl restart chronyd命令后重新查询状态。 以下为正常回显: 图2 chronyd运行状态 若重启chronyd服务无法解决该问题,请联系技术支持人员。
  • 节点可分配容器IP数 在创建CCE集群时,如果网络模型选择“VPC网络”,会让您选择每个节点可供分配的容器IP数量(alpha.cce/fixPoolMask)。Pod直接使用宿主机的网络(配置hostNetwork: true)时,不占用可分配容器IP,详情请参见容器网络 vs 主机网络。 该参数会影响节点上可以创建最大Pod的数量,因为每个Pod会占用一个IP(使用容器网络的情况),如果可用IP数量不够的话,就无法创建Pod。Pod直接使用宿主机的网络(配置hostNetwork: true)时,不占用可分配容器IP。 图1 VPC网络模型节点可分配容器IP数配置 节点默认会占用掉3个容器IP地址(网络地址、网关地址、广播地址),因此节点上 可分配给容器使用的IP数量 = 您选择的容器IP数量 - 3,例如上面图中可分配给容器使用的IP数量为 128-3=125。
  • 节点最大实例数 在创建节点时,可以配置节点可以创建的最大实例数(maxPods)。该参数是kubelet的配置参数,决定kubelet最多可创建多少个Pod。 对于默认节点池(DefaultPool)中的节点,节点创建完成后,最大实例数不支持修改。 对于自定义节点池中的节点,创建完成后可通过修改节点池配置中的max-pods参数,修改节点最大实例数。详情请参见节点池配置管理。 默认场景下,节点最大实例数最多可调整至256。如果您期望提升节点上的部署密度,您可以提交工单申请调整节点最大实例数,最大支持修改至512个实例。 图2 节点最大实例数配置 根据节点规格不同,节点默认最大实例数如表1所示。 表1 节点默认最大实例数 内存 节点默认最大实例数 4G 20 8G 40 16G 60 32G 80 64G及以上 110
  • 容器网络 vs 主机网络 创建Pod时,可以选择Pod使用容器网络或是宿主机网络。 容器网络:默认使用容器网络,Pod的网络由集群网络插件负责分配,每个Pod分配一个IP地址,会占用容器网络的IP。 主机网络:Pod直接使用宿主机的网络(Pod需要配置hostNetwork: true),会占用宿主机的端口,Pod的IP就是宿主机的IP,不会占用容器网络的IP。使用时需要考虑是否与宿主机上的端口冲突,因此一般情况下除非您知道需要某个特定应用占用宿主机上的特定端口时,不建议使用主机网络。
  • 节点最大Pod数量计算方式 根据集群类型不同,节点可创建的最大Pod数量计算方式如下: 对于“容器隧道网络”的集群,仅取决于节点最大实例数。 对于“VPC网络”的集群,取决于节点最大实例数和节点可分配容器IP数中的最小值,建议节点最大实例数不要超过节点可分配容器IP数,否则当容器IP数不足时Pod实例可能无法调度。 对于“云原生2.0网络”的集群(CCE Turbo集群),取决于节点最大实例数和CCE Turbo集群节点网卡数量中的最小值。建议节点最大实例数不要超过节点网卡数,否则当节点规格可分配网卡不足时Pod实例可能无法正常调度。
  • 解决方案 由于当前GPU插件的驱动配置由您自行配置,需要您验证两者的兼容性。建议您在测试环境验证安装升级目标版本的GPU插件,并配置当前GPU驱动后,测试创建节点是否正常使用。 您可以执行以下步骤确认GPU插件的升级目标版本与当前驱动配置。 登录CCE控制台,前往“插件中心”处查看GPU插件。 gpu-beta插件与gpu-device-plugin插件为同一插件。gpu-beta插件在2.0.0版本后,正式更名为gpu-device-plugin。 单击该插件的“升级”按钮,查看插件目标版本及驱动配置。 在测试环境验证安装升级目标版本的GPU插件,并配置当前GPU驱动后,测试创建节点是否正常使用。 如果两者不兼容,您可以尝试替换高版本驱动。如有需要,请联系技术支持人员。
  • 为API Server绑定EIP 登录CCE控制台,单击集群名称进入集群。 查看集群概览页,在右边“连接信息”下公网地址一栏,单击“绑定”。 选择一个已有的弹性公网IP。如果无可用IP,可单击“创建弹性IP”前往EIP控制台进行创建。 通过绑定EIP实现公网访问,集群存在风险,建议绑定的EIP配置 DDoS高防服务 或配置API Server访问策略。 绑定EIP将会短暂重启集群API Server并更新kubeconfig证书,请避免在此期间操作集群。 单击“确定”。
共100000条