欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的? TKE高可用 

程序员文章站 2024-01-11 13:23:46
...

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

本文来源 | 云+社区专栏文章

作者 | 杨泽华,腾讯云高级解决方案架构师。8年大型互联网公司从业经验,5年云计算行业工作经验。对云计算平台基础架构、网络架构等有深入的理解。专注于互联网行业高可用方案、多活方案、迁移方案设计。

 

 

本文描述如何使用腾讯云容器服务(TKE)实现跨可用区的应用高可用部署,包含如下内容:

 

1.高可用部署架构

2.使用容器服务(TKE)进行高可用部署

3.关于亲和性和反亲和性说明

4.总结

 

 

01高可用部署架构

 

IDC在全球范围内,针对多个行业的中小型企业(员工数小于1000名)的调研显示,近80%的公司预计,云服务器每小时的停机成本至少在2万美元以上,而超过20%的企业估算其云服务器每小时的停机成本至少为10万美元。

 

由此可见,云服务器停机对于云上企业的损失不容小觑,云服务商高可用方案越来越成为企业上云最重要的选择标准之一。在“上云”已经成为共识之后,如何进行高可用部署呢?

 

传统模式下,使用云主机实现高可用部署的架构图如下:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

云主机实现高可用部署

 

将云主机分散在不同的可用区,利用负载均衡(CLB)支持跨可用区分发的特性,实现业务流量跨可用区分发。当一个可用区(AZ)出现故障时,流量切换到另一个可用区(AZ),由此实现高可用部署。

 

使用云主机搭建业务环境,需要在云主机上部署web服务器(Nginx,Tomcat等),然后再部署业务代码,随着业务规模的增大,发布、部署的时间会变长。

 

随着容器的盛行,越来越多的企业采用DevOps, 使用容器部署业务。本文描述了如何使用腾讯云容器服务(TKE)进行业务高可用部署。部署架构如下:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

两个Node节点分布位于同一个地域的两个可用区,两个业务的Pod分布部署在2个Node上,使用CLB实现流量负载均衡。

 

下面我们看看如何使用腾讯云容器快速的实现应用高可用部署。

 

 

02使用容器服务(TKE)进行高可用部署

 

在本文中我们使用一个简单的swagger应用作为示例,实现高可用部署。swagger-ui的下载地址:github.com/swagger-api/

 

在docker的镜像仓库里已经有了制作好的swaggerui镜像,可以直接使用。 也可以自己下载源码制作成镜像。 我们使用docker镜像仓库里的镜像。

 

登陆腾讯云容器控制台,

console.cloud.tencent.com 创建一个容器集群。

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

容器集群创建成功之后,创建新的节点:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

这里添加2个节点,分别分布到2个可用区:北京二区、北京三区:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

添加成功后如下图:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

 

 

集群创建成功后下面制作镜像。

 

制作镜像

 

首先我们创建一个镜像仓库,设置为公有:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

腾讯云registry使用指引方法如下:

 

登录腾讯云docker registry

sudo docker login --username=100002678805 ccr.ccs.tencentyun.com

从registry拉取镜像

sudo docker pull ccr.ccs.tencentyun.com/zehua/swaggerui:[tag]

将镜像推送到registry

sudo docker login --username=100002678805 ccr.ccs.tencentyun.com
sudo docker tag [ImageId] ccr.ccs.tencentyun.com/zehua/swaggerui:[tag]
sudo docker push ccr.ccs.tencentyun.com/zehua/swaggerui:[tag]

下面我们按照上面的方法将swagger的镜像推送到刚刚创建的镜像仓库。

 

SSH登陆到其中一台容器节点,拉取swaggerui镜像,执行命令:

docker pull swaggerapi/swagger-ui

登陆到腾讯云镜像仓库:

docker login --username=100002678805 ccr.ccs.tencentyun.com

给刚刚拉取的swaggerui镜像打标签:

docker tag swaggerapi/swagger-ui ccr.ccs.tencentyun.com/zehua/swaggerui:1.2

将swaggerui镜像推送到腾讯云镜像仓库:

docker push ccr.ccs.tencentyun.com/zehua/swaggerui:1.2

 

高可用部署

 

下面进行高可用部署。首先创建deployment,创建deployment时,选择合适的namespace,如下图:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

本示例将swagger部署到zehua-ns这个namespace下:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

选择刚刚创建的swaggerui镜像:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

注意这里的端口号是8080。

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

这里为了演示,Pod数量创建2个,将这2个pod分发到不同的可用区中。你可以根据实际情况选择合适的pod数量。

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

节点调度策略这里有2个选择: 按节点调度,自定义调度规则。可以选择任意一种方式进行调度。

 

按节点调度,可以选择当前容器集群的节点, TKE会将Pod均匀调度到这些节点上。 本示例中创建2个Pod,TKE会将2个Pod分别调度到这2个节点上。

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

如果选择按自定义规则调度,需要指定节点的标签。

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

我们给2个节点打了AZ的标签,分别是bj2,bj3. 打标签方式如下:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

分别给2个节点新增标签:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

也可以使用命令行的方式打标签。 使用kubectl进行添加。传统模式下,使用云主机实现高可用部署的架构图如下:

 

kubectl get nodes --show-labels

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

kubectl label nodes 10.0.2.12 az=bj2
kubectl label nodes 10.0.5.17 az=bj3

设置完高可用部署后,进行访问设置。开启公网访问, 注意端口映射的设置:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

完成后点击创建workload。

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

创建完成后,可以在service里面看到创建的服务:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

 

在Pod管理里可以看到2个Pod被调度到了2个节点上:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

访问Service里的负载均衡IP,可以看到部署成功:

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

至此我们完成了业务高可用部署。

 

 

03关于亲和性和反亲和性

 

通过腾讯云控制台查看swagger应用的YAML文件,可以看到,通过控制台实现Pod调度是通过节点亲和性(nodeAffinity:)来实现的。

使用腾讯云容器服务(TKE)是如何实现应用跨可用区高可用部署的?
            
    
    
        TKE高可用 

spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
  - key: kubernetes.io/hostname
operator: In
values:
- 10.0.2.12
- 10.0.5.17

节点亲和性通过指定 preferredDuringSchedulingIgnoredDuringExecution和

requiredDuringSchedulingIgnoredDuringExecution 来实现亲和性的软限制和硬限制。节点亲和性的语法支持:In, NotIn, Exists, DoesNotExist, Gt, Lt。 通过这些语法,可以灵活的控制台节点亲和性。本例中使用了kubernetes.io/hostname这个默认标签作为调度,调度到hostname为 10.0.2.12和10.0.5.17的两个节点上。

 

如果在节点调度策略里选择了“自定义调度规则”, 亲和性的实现大概如下:

spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
  matchExpressions:
  - key: failure-domain.beta.kubernetes.io/zone
operator: In
values:
- "800002"
- "800003"
weight: 1
  requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
  - key: az
operator: In
values:
- bj2
- bj3

这里的调度策略使用了节点的AZ标签,2个pod会被调度到标签值为bj2,bj3的节点上。 如果有3个pod,某一个节点上会部署2个pod,另一个节点上部署一个pod。

 

如果希望使用pod affinity的特性,可以通过自己编写YAML的方式实现。 下一篇文章中将会给出Pod Affinity的示例。

 

 

04总结

 

至此,我们完成了通过腾讯云容器平台实现业务跨可用区的高可用部署。通过腾讯云TKE控制台,使用K8S节点亲和性的功能,可以快速实现业务跨可用区的高可用部署。通过节点亲和性的语法规则,可以实现复杂的部署逻辑。腾讯云TKE控制台大大简化了跨可用区部署的复杂性,帮助用户快速实现业务的高可用。

相关标签: TKE 高可用