利用ACK注册集群为云下K8s注入弹性能力

简介: 随着容器技术的普及,有越来越多的用户开始在私有环境中搭建K8s来使用,这时候就很容易遇到一个问题,私有环境资源交付周期太长,不能完全释放K8s动态扩容的能力,本文就是介绍如何利用ACK注册集群解决这个问题,让云下的K8s集群也可以享受云上一样的资源快速交付能力。


1. 方案介绍

本方案借助云企业网和容器服务ACK注册集群,为云下自建的k8s集群注入向云上扩容的能力,可以利用公有云的快速资源交付能力满足业务需求,构建混合云解决方案。

2. 目标读者

K8s集群管理员,需要熟悉K8s日常运维,以及对网络插件有比较深入的了解。

3. 适用场景

已经在云下有一定规模的K8s集群,且云下资源交付无法满足业务的发展,需要使用公有云资源的场景。

4. 相关概念

Kubernetes:生产级容器编排,简称K8s。

容器服务 ACK:阿里云容器服务Kubernetes版,提供高性能可伸缩的容器应用管理服务,支持企业级Kubernetes容器化应用的生命周期管理。

Terway:阿里云开源的基于专有网络VPC的容器网络插件,支持基于Kubernetes标准的网络策略来定义容器间的访问策略。

云企业网 CEN:可帮助您在不同地域专有网络VPC(Virtual Private Cloud)之间、VPC与本地数据中心间搭建私网通信通道,实现同地域或跨地域网络互通。

对象存储 OSS:阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务。

5. 方案架构

image.png

通过ACK Stub和ACK Register Agent组件,可以将您在ACK控制台上的请求下发到指定的外部集群API Server,其中Register Agent组件会以Deployment双实例的形式部署在指定的外部集群中,并且和ACK管控平台中的Stub代理组件连通。Agent组件通过上图中的流程将请求发送到您指定的API Server。

组件名称

组件功能

ACK Console

ACK容器服务管理控制台。

ACK Register Agent

ACK集群注册Agent,以Deployment形式部署在指定外部集群中,用于接收ACK集群注册代理组件的请求并转发给对应的K8s API Server,同时接收K8s API Server的返回并发送给ACK集群注册代理组件。

ACK Stub

ACK集群注册代理组件,部署在容器服务管控侧,每一个注册外部集群都会部署一个与之对应的Stub代理组件,用于代理转发ACK管控组件和指定外部集群中注册Agent组件之间的请求。

K8s API Server

注册集群中运行的K8s API Server组件。

6. 方案优势

私有环境资源不足的时候,利用公有云的弹性资源来承载部分业务,是一个比较成熟的方案,但是以往的方案一般只关注在云上云下的网络打通和资源交付上,交付后用户需要在云上云下分别去管理资源、部署应用,对以往的工作流程有比较大的侵入。本方案可以继续保持原有的K8s为管理入口,集群管理、应用部署的方式保持不变,工作流程不需要做调整。

7. 方案实施

7.1 前提条件

  • 云下已经有K8s集群,且版本不低于1.14

  • 云下环境和云上已经有云企业网打通

  • 开通ACK服务和弹性伸缩服务

  • 开通对象存储OSS服务

7.2 操作步骤

  1. 创建接入集群。

    1. 登录容器服务管理控制台

    2. 在控制台左侧导航栏中,单击集群

    3. 集群列表页面中,单击页面右上角的创建集群

    4. 注册集群页签,完成创建集群配置项。

配置项

描述

集群名称

填写集群的名称。

说明

集群名称应包含1~63个字符,可包含数字、汉字、英文字符或短划线(-)。

资源组

将鼠标悬浮于页面上方的账号全部资源,选择资源组。在控制台页面顶部选择的资源组可过滤出该资源组内的专有网络及对应的虚拟交换机。在创建集群时,只显示过滤的专有网络实例及专有网络对应的虚拟交换机实例。

地域

选择集群所在的地域。

专有网络

您可以在已有VPC列表中选择所需的VPC和交换机。

虚拟交换机

您可以在选定的VPC下选择所需的节点虚拟交换机。

网络插件

选择不开启时,表示不使用节点池扩容云上计算资源则无需配置网络插件。

选择Terway并选中IPvlan时,表示采用IPvlan+ebpf作为网卡共享模式虚拟化技术,只能使用Alibaba Cloud Linux2系统。

Pod虚拟交换机

您可以在选定的VPC下选择所需的Pod虚拟交换机。

Service CIDR

如无特殊需求,使用默认的172.21.0.0/20即可。

API Server访问

ACK默认为API Server创建一个内网SLB实例,您可修改SLB实例规格。更多信息,请参见实例规格

注意

删除默认创建的SLB实例将会导致无法访问API Server。

绑定EIP

设置是否启用绑定EIP。选中此选项,会在集群中自动绑定EIP,用于建立集群链接。

安全组

支持选择自动创建普通安全组自动创建企业级安全组选择已有安全组。有关安全组的详细内容,请参见安全组概述

说明

  •           只有白名单用户可以使用选择已有安全组功能。请提交工单申请。          

  •           指定已有安全组时,系统默认不会为安全组配置额外的访问规则,可能会导致访问异常,请自行管理安全组规则。关于如何管理安全组规则,请参见最小化集群访问规则。          

日志服务

设置是否启用日志服务,您可使用已有Project或新建一个Project。

勾选使用日志服务,会在集群中自动配置日志服务插件。创建应用时,您可通过简单配置,快速使用日志服务。更多详情,请参见通过日志服务采集Kubernetes容器日志

集群删除保护

设置是否启用集群删除保护。为防止通过控制台或API误释放集群。

标签

为集群绑定标签。输入键和对应的值,单击添加

说明

  •           键是必需的,而值是可选的,可以不填写。          

  •           键不能是aliyun、acs:、http://或https://开头的字符串,不区分大小写,最多64个字符。          

  •           值不能是aliyun、acs:、http://或https://开头的字符串,可以为空,不区分大小写,最多128个字符。          

  •           同一个资源,标签键不能重复,相同标签键(Key)的标签会被覆盖。          

  •           如果一个资源已经绑定了20个标签,已有标签和新建标签会失效,您需要解绑部分标签后才能再绑定新的标签。          

服务协议

创建集群前,需阅读并同意《服务条款》《免责申明》

在页面右侧,单击创建集群,完成集群创建。您可以在集群列表,看到您创建的集群。

image.png

  1. 将目标集群接入注册集群中。

    1. 在新集群(本例中为test-external-cluster1)右侧单击操作列下的详情

    2. 集群信息页面单击连接信息页签。

    3. 集群导入代理配置区域根据需要选择公网或者私网,然后单击右侧的复制,将公网或私网页签的内容复制到一个文件中,并执行kubectl命令,将目标集群注册至新集群中。例如,您可以新建agent.yaml文件,将以下内容复制到agent.yaml文件中,并在目标集群中执行kubectl apply -f agent.yaml命令。

image.png

在目标集群中执行以下命令,查看代理运行状况。

kubectl -n kube-system get pod | grep ack-cluster-agent

预期输出

ack-cluster-agent-5f7d568f6-6fc4k              1/1     Running   0          9s
ack-cluster-agent-5f7d568f6-tf6fp              1/1     Running   0          9s
  1. 编写自定义节点添加脚本

kubelet配置的示例代码如下所示。

cat >/usr/lib/systemd/system/kubelet.service <

 

在编写自定义节点添加脚本时需要注意必须接收阿里云注册集群下发的系统环境变量,如下所示。

系统环境变量

说明

示例

ALIBABA_CLOUD_PROVIDE_ID

自定义节点添加脚本中必须接收并进行配置,否则会影响注册集群管理异常。

ALIBABA_CLOUD_PROVIDE_ID=cn-shenzhen.i-wz92ewt14n9wx9mol2cd

ALIBABA_CLOUD_NODE_NAME

自定义节点添加脚本中必须接收并进行配置,否则会导致注册集群节点池中节点状态异常。

ALIBABA_CLOUD_NODE_NAME=cn-shenzhen.192.168.1.113

ALIBABA_CLOUD_LABELS

自定义节点添加脚本中必须接收并进行配置,否则会影响节点池管理状态异常以及后续工作负载在云上云下的调度。

ALIBABA_CLOUD_LABELS=alibabacloud.com/nodepool-id=np0e2031e952c4492bab32f512ce1422f6,ack.aliyun.com=cc3df6d939b0d4463b493b82d0d670c66,alibabacloud.com/instance-id=i-wz960ockeekr3dok06kr,alibabacloiud.com/external=true,workload=cpu

其中workload=cpu是用户在节点池中配置的用户自定义节点标签,其他都为系统下发的节点标签。

ALIBABA_CLOUD_TAINTS

自定义节点添加脚本中必须接收并进行配置,否则节点池中的污点配置将不会生效。

ALIBABA_CLOUD_TAINTS=workload=ack:NoSchedule

  1. 保存自定义脚本

将自定义脚本保存OSS Bucket上。示例地址为https://kubelet-****.oss-ap-southeast-3-internal.aliyuncs.com/attachnode.sh

  1. 使用自定义脚本

    1. 注册集群的Agent组件会自动在kube-system下创建名为ack-agent-config的ConfigMap,初始化配置如下所示。

apiVersion: v1
data:
  addNodeScriptPath: ""
  enableNodepool: "true"
  isInit: "true"
kind: ConfigMap
metadata:
  name: ack-agent-config
  namespace: kube-system

将自定义节点添加脚本的路径https://kubelet-****.oss-ap-southeast-3-internal.aliyuncs.com/attachnode.sh配置到addNodeScriptPath字段区域并保存。

apiVersion: v1
data:
  addNodeScriptPath: https://kubelet-****.oss-ap-southeast-3-internal.aliyuncs.com/attachnode.sh 
  enableNodepool: "true"
  isInit: "true"
kind: ConfigMap
metadata:
  name: ack-agent-config
  namespace: kube-system
  1. 创建节点池

    1. 登录容器服务管理控制台

    2. 在控制台左侧导航栏中,单击集群

    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情

    4. 在集群管理页左侧导航栏中,选择节点管理 > 节点池

    5. 节点池页面右上角,单击创建节点池

    6. 创建节点池对话框,设置创建节点池的配置项。

关于部分配置项说明如下所示。

参数

说明

数量

设置节点池初始节点数量。如不需要创建节点,可以填写为0。

操作系统

选择节点的操作系统,仅支持CentOS及Alibaba Cloud Linux 2.1903。

节点标签

您可以为集群节点添加标签。

ECS标签

您可以为ECS实例添加标签。

污点

您可以为集群节点添加污点。

安全组

选择节点所在安全组。

单击确认配置。在节点池页面,如果节点池状态显示为初始化中,则说明节点池正在创建中。创建完成后,节点池状态显示为已激活

  1. 扩容云上节点池

    1. 登录容器服务管理控制台

    2. 在控制台左侧导航栏中,单击集群

    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情

    4. 在集群管理页左侧导航栏中,选择节点管理 > 节点池

    5. 在目标节点池右侧的操作列中,单击扩容

    6. 在节点池对话框的扩容数量调整框中,输入要增加的节点数,然后单击提交。在节点池页面,节点池状态刚开始显示为伸缩中。扩容完成后,状态会显示为已激活

8. 方案验证

方案实施到这里已经完成了云下K8s向云上扩容节点的步骤,此时,我们可以继续使用原来的集群入口去下发应用,而且,应用可以直接调度到云上的节点,在操作流程上和方案实施前并无二致。

作者介绍
目录