一、使用场景
1. 用户 IDC / 私有云的硬件和维护成本保持不变。
2. 实现了用户 IDC / 私有云和公有云级别的应用高可用。
3. 用户按需使用公有云的资源,按需付费。
二、使用须知
1. 已开通 TKE Serverless 集群。
2. 用户 IDC 与腾讯云 VPC 通过专线内网互联。
3. IDC 集群的 API Server 地址,腾讯云 VPC 网络可达。
4. 用户自有 IDC 集群可以访问公网,需要通过公网调用云 API。
三、组件说明
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 Serverless 容器服务支持售卖的地域和可用区请参见 地域和可用区。
七、安装 TKE Resilience Chart
你可通过 本地 Helm 客户端连接集群。
执行以下命令,在第三方集群中通过 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-deployment labels: app: nginxspec: replicas: 4 strategy: type: RollingUpdate selector: matchLabels: app: nginx template: metadata: annotations: AUTO_SCALE_EKS: "true" LOCAL_REPLICAS: "1" #设置本地集群运行的副本数为 1 labels: app: nginx spec: #schedulerName: tke-scheduler 如果是第三方集群则需要执行调度器为 tke-scheduler containers: – name: nginx image: nginx imagePullPolicy: 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>