Pod在多可用区worker节点上的高可用部署

简介: 当前很多公有云客户都有通过多可用区部署应用来解决应用高可用或者容灾的相关问题,在kubernetes上也可以通过pod的亲和性和反亲和性将pod分布在不同的可用区,已达到高可用或容灾的目的,本文主要是简单介绍下这种情况下,如何实现pod的多可用区高可用部署。
+关注继续查看

 

一、      需求分析

当前kubernetes集群中的worker节点可以支持添加多可用区中的ECS,这种部署方式的目的是可以让一个应用的多个pod(至少两个)能够分布在不同的可用区,起码不能分布在同一个可用区,已达到高可用或者同城灾备的部署。

 

二、      效果图

8482bb2adea11a65a5143df914c6b5750259d3a2

三、      实现原理

为了实现上述的效果,kubernetes提供了pod的亲和性和反亲和性来保证pod在节点级别,可用区级别的高可用部署;具体的值为topologyKey:failure-domain.beta.kubernetes.io/zone。

 

四、      实现步骤

在ACK上创建完集群后,不论从哪个可用区添加节点,都会对该节点打上对应的可用区标签,比如,一个节点是属于北京可用区a的,那么在加入到kubernetes集群后,该节点上会有一个这样的标签:failure-domain.beta.kubernetes.io/zone: cn-beijing-a。

在有了上述标签后,对应用进行多可用区部署时,我们就可以使用一下yaml文件来使不同的pod分配到不同的可用区。

     Yaml文件示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-cache
spec:
  selector:
    matchLabels:
      app: store
  replicas: 3
  template:
    metadata:
      labels:
        app: store
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "failure-domain.beta.kubernetes.io/zone"
      containers:
      - name: redis-server
        image: redis:3.2-alpine

上面yaml文件中的podAntiAffinity:部分规定了node的反亲和性,并且由于使用了topologyKey: "failure-domain.beta.kubernetes.io/zone",如果failure-domain.beta.kubernetes.io/zone这个key有三种value,比如cn-beijing-a,cn-beijing-b,cn-beijing-c;那么pod会被分配在这三个不同的可用区。并且由于使用了preferredDuringSchedulingIgnoredDuringExecution,所以如果pod个数大于可用区个数的话,pod会尽可能的放在不同的可用区,最后会出现多出来的pod会与原有pod在同一个可用区。

上面的使用方式还有很多种,包括node级别的,详细请参考:https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity


五、      注意问题(云盘)

    由于云盘不能跨可用区挂载,如果有pod使用了存储卷,该pod需要被调度到与存储卷相同的可用区的机器上。

    其他存储卷比如NAS,OSS是可以采用上述部署方式的。

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
Kubernetes 应用服务中间件 开发工具
|
2月前
|
NoSQL Redis 数据中心
Redis 集群偶数节点跨地域部署之高可用测试
你搭建过偶数节点的 Redis 集群吗?有没有想过它是否具备高可用的能力?会不会脑裂呢?实践出真知!现在 docker 太方便了,搭一个集群模拟一下……
64 4
|
9月前
|
Kubernetes Ubuntu 应用服务中间件
k8s学习四-部署节点加入集群
k8s学习四-部署节点加入集群
171 0
k8s学习四-部署节点加入集群
|
9月前
|
负载均衡
本篇关于集群
本篇关于集群
|
10月前
|
Kubernetes 容器
k8s集群之测试pod-hellok8s
k8s集群之测试pod-hellok8s
143 0
|
10月前
|
Perl
EKS集群以及节点组注意事项
EKS集群以及节点组注意事项
189 0
|
11月前
|
SQL 前端开发 关系型数据库
PXC集群脑裂导致节点是无法加入无主的集群
PXC集群脑裂导致节点是无法加入无主的集群
123 0
|
Kubernetes Perl 容器
【kubernetes】修改集群节点中 Pod 数量限制
Kubernetes 默认每个节点只能启动 110 个 Pod,由于业务需要,将每个节点默认限制的 Pod 数量改为 200。
2274 0
|
弹性计算 边缘计算 运维
通过ACK 节点池高效管理Kubernetes节点——功能介绍
前言 云原生,被认为是释放云原生红利的最短路径,而以kubernetes 已成为云原生技术领域的事实标准。基于kubernetes构建的容器应用平台和过去基于虚机平台最大的不同,就是kubernetes屏蔽了底层环境的复杂和不一致,帮助研发通过应用的视角管理业务。 如何统一异构资源,高效地管理资源,利用云上弹性能力应对峰值流量与节省成本,每位kubernetes 运维人员都将面临的挑战。 AC
856 0
通过ACK 节点池高效管理Kubernetes节点——功能介绍
|
云安全 运维 Kubernetes
如何让你的k8s集群更安全
近期在阿里云容器团队与Palo Alto Networks安全团队的联合调研中发现有大量的自建Kubernetes集群存在不同程度的安全隐患,本文主要介绍了Kubernetes集群使用过程中可能遇到的安全风险,同时如何利用阿里云容器服务,容器镜像服务的安全能力和Palo Alto Networks的容器安全解决方案提升Kubernetes集群的整体安全性。
3123 0
如何让你的k8s集群更安全
相关产品
容器镜像服务
容器服务Kubernetes版
推荐文章
更多