使用场景
IDC 的资源有限,当需要应对业务突发流量,IDC 内的算力资源不足以应对时,可以选择使用公有云资源应对临时流量。TKE Resilience Chart 利用 TKE Serverless 容器服务,基于自定义的调度策略,通过添加超级节点的方式,将用户集群中的工作负载弹性上云,使用户 IDC 集群获得极大的弹性拓展能力,优势如下:
1. 用户 IDC / 私有云的硬件和维护成本保持不变。
2. 实现了用户 IDC / 私有云和公有云级别的应用高可用。
3. 用户按需使用公有云的资源,按需付费。
使用须知
1. 已开通 TKE Serverless 集群。
2. 用户 IDC 与腾讯云 VPC 通过专线内网互联。
3. IDC 集群的 API Server 地址,腾讯云 VPC 网络可达。
4. 用户自有 IDC 集群可以访问公网,需要通过公网调用云 API。
TKE Resilience Chart 特性说明
组件说明
TKE Resilience Chart 主要是由超级节点管理器,调度器,容忍控制器3部分组成,如表格所示:
简称 | 组件名称 | 描述 |
eklet | 超级节点管理器 | 负责 Podsandbox 生命周期的管理,并对外提供原生 kubelet 与节点相关的接口。 |
tke-scheduler | 调度器 | 负责根据调度策略将 workload 弹性上云,仅会安装在非 TKE 发行版的 K8S 集群上,TKE 发行版集群不会安装此组件。其中 TKE 发行版(TKE Kubernetes Distro)是由腾讯云 TKE 发布的 K8S 发行版本,用于帮助用户创建与云上 TKE 完全一致的 K8S 集群,目前 TKE 发行版集群已经在 GitHub 开源,详情见 TKE Kubernetes Distro。 |
admission-controller | 容忍控制器 | 负责为处于 pending 状态的 Pod 添加容忍,使其可以调度到超级节点上。 |
主要特性
1. 如需要 TKE Serverless Pod 和本地集群的 Pod 互通,则要求本地集群是 Underlay 的网络模型(使用 Calico 之类的基于 BGP 路由,而不是 SDN 封装的 CNI 插件),并且需要在腾讯云 VPC 中添加本地 Pod CIDR 的路由信息,详情见 路由配置。
2. Workload resilience 特性控制开关
AUTO_SCALE_EKS=true|false
分为全局开关和局部开关,用来控制 workload 在 pending
的情况下是否弹性调度到腾讯云 TKE Serverless,如表格所示:全局开关:
kubectl get cm -n kube-system eks-config
中 AUTO_SCALE_EKS
,默认开启。 局部开关:
spec.template.metadata.annotations ['AUTO_SCALE_EKS']
全局开关 | 局部开关 | 行为 |
AUTO_SCALE_EKS=true | AUTO_SCALE_EKS=false | 调度成功 |
AUTO_SCALE_EKS=true | 未定义 | 调度成功 |
AUTO_SCALE_EKS=true | AUTO_SCALE_EKS=true | 调度成功 |
AUTO_SCALE_EKS=false | AUTO_SCALE_EKS=false | 调度失败 |
AUTO_SCALE_EKS=false | 未定义 | 调度失败 |
AUTO_SCALE_EKS=false | AUTO_SCALE_EKS=true | 调度成功 |
未定义 | AUTO_SCALE_EKS=false | 调度成功 |
未定义 | 未定义 | 调度成功 |
未定义 | AUTO_SCALE_EKS=true | 调度成功 |
3. 当使用社区版 K8S 的时候,需要在 workload 中指定调度器为
tke-scheduler
,TKE 发行版 K8S 则不需要指定调度器。 4. Workload 设定本地集群保留副本数量
LOCAL_REPLICAS: N
。 5. Workload 扩容:
当本地集群资源不足,并满足全局和局部开关中调度成功的行为设定,
pending
的 workload 将扩容到腾讯云 EKS。 当实际创建 workload 副本数量达到 N 后,并满足全局和局部开关中调度成功的行为设定,
pending
的 workload 将扩容到 TKE Serverless 集群。6. Workload 缩容:
TKE 发行版 K8S 会优先缩容 TKE Serverless 集群上的实例。
社区版 K8S 会随机缩容。
7. 调度规则的限制条件:
无法调度 DaemonSet Pod 到超级节点,此特性只在 TKE 发行版 K8S 有效,社区版 K8S DaemonSet Pod 会调度到超级节点,但会显示
DaemonsetForbidden
。 无法调度 kube-system,tke-eni-ip-webhook 命名空间下的 Pod 到超级节点。
无法调度 securityContext.sysctls ["net.ipv4.ip_local_port_range"] 的值包含61000 - 65534的端口。
无法调度 Pod.Annotations [tke.cloud.tencent.com/vpc-ip-claim-delete-policy] 的 Pod。
无法调度 container (initContainer).ports [].containerPort (hostPort) 包含61000 - 65534的端口。
无法调度 container (initContainer) 中探针指定61000 - 65534的端口。
无法调度除了 nfs,Cephfs,hostPath,qcloudcbs 以外的 PV。
无法调度启用固定 IP 特性的 Pod 到超级节点。
8. 超级节点支持自定义默认 DNS 配置:用户在超级节点上新增
eks.tke.cloud.tencent.com/resolv-conf
的 annotation 后,生成的 cxm 子机里的 /etc/resolv.conf 就会被更新成用户定义的内容。注意:
会覆盖原来超级节点的 DNS 配置,最终以用户的配置为准。
eks.tke.cloud.tencent.com/resolv-conf: |nameserver 4.4.4.4nameserver 8.8.8.8
操作步骤
获取 tke-resilience helm chart
git clone https://github.com/tkestack/charts.git
配置相关信息
编辑 charts/incubator/tke-resilience/values.yaml,配置以下信息:
cloud:uniqueID:"{IDC集群的唯一标识符,用于区分账号下不同集群,不超过16个字节,提交后不可修改,当账号下有多个集群时必填}"appID: "{腾讯云账号 APPID}"ownerUIN: "{腾讯云用户账号 ID}"secretID: "{腾讯云账号 secretID}"secretKey: "{腾讯云账号 secretKey}"vpcID: "{EKS Pod 放置的 VPC ID}"regionShort: "{EKS Pod 放置的 region 简称}"regionLong: "{EKS Pod 放置的 region 全称}"subnets:- id: "{EKS Pod 放置的子网 ID}"zone: "{EKS Pod 放置的可用区}"eklet:PodUsedApiserver: "{当前集群的 API Server 地址}"
说明:
安装 TKE Resilience Chart
执行以下命令,在第三方集群中通过 Helm Chart 安装 TKE Resilience Chart。
helm install tke-resilience --namespace kube-system ./tke-resilience --debug
执行以下命令,确认 Helm 应用中组件是否安装完成。本文以 TKE 发行版的集群为例,未安装 tke-scheduler。
# kubectl get Pod -n kube-system | grep resilienceeklet-tke-resilience-5f9dcd99df-rgsmc 1/1 Running 0 43heks-admission-tke-resilience-5bb588dc44-9hvhs 1/1 Running 0 44h
查看集群中已经部署了1个超级节点。
# kubectl get nodeNAME STATUS ROLES AGE VERSION10.0.1.xx Ready <none> 2d4h v1.20.4-tke.110.0.1.xx Ready master 2d4h v1.20.4-tke.1eklet-subnet-xxxxxxxx Ready <none> 43h v2.4.6
创建测试用例
创建 demo 应用
nginx-deployment
,该应用有4个副本,其中3个在 TKE Serverless 集群,1个在本地集群,Yaml 示例如下:apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentlabels:app: nginxspec:replicas: 4strategy:type: RollingUpdateselector:matchLabels:app: nginxtemplate:metadata:annotations:AUTO_SCALE_EKS: "true"LOCAL_REPLICAS: "1" #设置本地集群运行的副本数为 1labels:app: nginxspec:#schedulerName: tke-scheduler 如果是第三方集群则需要执行调度器为 tke-schedulercontainers:- name: nginximage: nginximagePullPolicy: IfNotPresent
验证副本的状态以及分布,符合预期。
# kubectl get Pod -owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-deployment-77b9b9bc97-cq9ds 1/1 Running 0 27s 10.232.1.88 10.0.1.xxx <none> <none>nginx-deployment-77b9b9bc97-s9vzc 1/1 Running 0 27s 10.0.1.118 eklet-subnet-xxxxxxxx <none> <none>nginx-deployment-77b9b9bc97-sd4z5 1/1 Running 0 27s 10.0.1.7 eklet-subnet-xxxxxxxx <none> <none>nginx-deployment-77b9b9bc97-z86tx 1/1 Running 0 27s 10.0.1.133 eklet-subnet-xxxxxxxx <none> <none>
并验证缩容的特性,由于使用的是 TKE 发行版的集群,会优先缩容 TKE Serverless 集群的实例。这里应用的副本数从4调整为3。
# kubectl scale deployment nginx-deployment --replicas=3
由以下结果可以看出,优先缩容了云上的副本,符合预期。
# kubectl get Pod -owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-deployment-77b9b9bc97-cq9ds 1/1 Running 0 7m38s 10.232.1.88 10.0.1.xxx <none> <none>nginx-deployment-77b9b9bc97-s9vzc 1/1 Running 0 7m38s 10.0.1.118 eklet-subnet-xxxxxxxx <none> <none>nginx-deployment-77b9b9bc97-sd4z5 1/1 Running 0 7m38s 10.0.1.7 eklet-subnet-xxxxxxxx <none> <none>