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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 当前很多公有云客户都有通过多可用区部署应用来解决应用高可用或者容灾的相关问题,在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服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
Kubernetes 负载均衡 网络协议
Kubernetes 跨集群流量调度实战
Kubernetes 问世于 2015 年,从一开始秉持着松耦合和可扩展的设计理念,也因此带来了 Kubernetes 生态的蓬勃发展。但这些大部分先限制在单一集群内,然后由于种种原因和目的企业内部创建的集群越来越多,比如单集群故障、监管要求、异地多机房可用区容灾、出于敏捷、降本考虑的混合云、多云部署、单一集群的承载能力受限、多版本 Kubernetes 集群共存等。多集群之后除了提升管理的难度外,首当其冲的就是多集群间的流量调度,这也是多集群部署的基础。没有跨集群的通信,多集群的收益也会大打折扣。
549 1
Kubernetes 跨集群流量调度实战
|
Kubernetes Perl 容器
【kubernetes】修改集群节点中 Pod 数量限制
Kubernetes 默认每个节点只能启动 110 个 Pod,由于业务需要,将每个节点默认限制的 Pod 数量改为 200。
2745 0
|
6月前
|
缓存 Kubernetes 数据安全/隐私保护
安装kubernetes1.17.3多master节点的高可用集群(上)
安装kubernetes1.17.3多master节点的高可用集群
|
Kubernetes 应用服务中间件 Linux
极简的配置单节点Kubernetes(k8s)集群
在传统的概念当中,Docker是简单易用的,Kubernetes是复杂强大的。 深入了解之后会发现Docker的简单是因为用户可以从基本功能开始用起, 只需要一台Linux主机,运行一下apt-get install docker-engine 或者yum install docker-engine,立马就可以用docker run启动一个新的容器, 整个过程与用户之前积累的Linux软件使用体验高度一致。
5393 0
|
6月前
|
Kubernetes 监控 前端开发
安装kubernetes1.17.3多master节点的高可用集群(下)
安装kubernetes1.17.3多master节点的高可用集群
|
8月前
|
Kubernetes 调度 Perl
k8s集群调度
k8s集群调度
91 0
|
8月前
|
Kubernetes 应用服务中间件 开发工具
|
Kubernetes Ubuntu 应用服务中间件
k8s学习四-部署节点加入集群
k8s学习四-部署节点加入集群
261 0
k8s学习四-部署节点加入集群
|
负载均衡
本篇关于集群
本篇关于集群
|
Kubernetes 容器
k8s集群之测试pod-hellok8s
k8s集群之测试pod-hellok8s
220 0