作者简介

胡家靖

百度基础架构部研发工程师

负责函数计算与云原生产品的研发

本文基于百度云原生团队『云原生基础知识概述及实践』系列视频课程——『Kubernetes入门—Kubernetes实现应用高可用』梳理.

视频课程可点击:https://cloud.baidu.com/video-center/video.html?id=609进行学习。

导读
在前两节课,我们学习了Docker(Kubernetes入门——深入浅出讲Docker)和Kubernetes(Kubernetes入门——Kubernetes工作原理及使用)(Kubernetes入门——Kubernetes应用部署)相关基础知识。
Pod 代表了 Kubernetes 中的基本部署单元,但是,在一般情况下我们不会直接使用 Pod,因为每一次重启它的IP都会发生变化;如果你希望自己的应用能自动保持健康运行而且无需手动干预,则需要通过创建 ReplicaSet 或者 Deployment 这样的资源来管理实际的 Pod。

另外很多时候我们需要判断Pod是否需要重启,请求是否可被调度到Pod,探针的出现使得这些问题迎刃而解。

本节课将带领大家学习探针与Deployment的使用。通过实践与学习,了解Kubernetes如何实现应用的高可用。
课程主要分为以下四个部分:
**第一部分:**探针
**第二部分:**Deployment的使用
**第三部分:**Demo
**第四部分:**总结

01
Kubernets探针

当你使用kubernetes的时候,有没有遇到过Pod在启动后一会就挂掉然后又重新启动这样的恶性循环?Kubernetes如何检测pod是否还存活?虽然容器已经启动,Kubernetes如何知道容器的进程是否准备好对外提供服务了呢?答案是:探针

探针种类
LivenessProbe

介绍:LivenessProbe 又称存活探针,其作用主要用于检测容器是否还在运行。kubelet 使用存活探测器来知道什么时候要重启容器。例如,存活探测器可以捕捉到死锁(应用程序在运行,但是无法继续执行后面的步骤)。这样的情况下重启容器有助于让应用程序在有问题的情况下更可用。

用途:Kubernetes 可以通过存活探针来检查容器是否还在运行。如果探测失败,则 Kubernetes 将会认为容器已经不在运行,将会重新启动容器。

探测方式

  1. HTTP:kubelet 对容器的 IP 地址指定路径执行 HTTP GET 请求。根据返回码判断是否探测成功
  2. TCP套接字:尝试与容器指定端口建立TCP连接,如果建立成功则表示探测成功。
  3. Exec:在容器内执行任意命令,检查退出状态码。如返回值为0,则探测成功。

存活探针yaml文件

绿色为 http 探针,这里请求容器的8080端口,如果返回是 2xx,或者 3xx,那么表示探测成功。

红色为 exec 探针,这里执行了一个 cat 命令。

蓝色的为 tcp 探针。作用为和8080端口尝试建立 TCP 连接。

ReadnessProbe

介绍:就绪探针。用于探测 Pod 是否已经就绪。由于部分 Pod 启动时将会有较长的初始化时间,就绪探针可以用于探测 Pod 是否已经初始化完毕。kubelet 使用就绪探测器可以知道容器什么时候准备好了并可以开始接受请求流 量, 当一个 Pod 内的所有容器都准备好了,才能把这个 Pod 看作就绪了。这种信号的一个用途就是控制哪个 Pod 作为 Service 的后端。在 Pod 还没有准备好的时候,会从 Service 的负载均衡器中被剔除的。

用途:就绪探针在容器生命周期中会被定期调用。确定 Pod 是否接受客户端请求,当容器的准备就绪探测返回成功时,表示容器已经准备好接受请求。

探测方式

1.HTTP:对容器的 IP 地址指定路径执行 HTTP GET 请求。根据返回码判断是否探测成功
2.TCP套接字:尝试与容器指定端口建立TCP连接,如果建立成功则表示探测成功。
3.Exec:在容器内执行任意命令,检查退出状态码。如状态码为0,则探测成功。

就绪探针的yaml文件

就绪探针与存活探针配置几乎一致。

只是字段为 readinessProbe。

02
Deployment的使用

ReplicaSet
简介:Pod不可靠,可能会宕掉,可以配置重启,但是如果是Pod所在的节点宕掉,Pod就会完全丢失,如果在生产环境就会出现问题。另外我们一般不会使用单个Pod,而是许多组相同的Pod来提供服务,如果手动维护的话会特别困难,特别是在集群数量比较大的时候,所以这里对ReplicaSet 进行介绍。ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。

工作原理:RepicaSet 是通过一组字段来定义的,包括一个用来识别可获得的 Pod 的集合的选择算符,一个用来标明应该维护的副本个数的数值,一个用来指定应该创建新 Pod 以满足副本个数条件时要使用的 Pod 模板等等。每个 ReplicaSet 都通过根据需要创建和 删除 Pod 以使得副本个数达到期望值,进而实现其存在价值。当 ReplicaSet 需要创建新的 Pod 时,会使用所提供的 Pod 模板。

工作过程:ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。

每次 ReplicaSet 会监控当前 Pod 的数量,如果 Pod 数量多于要求的数量,则会自动删除一 部分。否则会自动创建,创建过程中会使用模板创建。

ReplicaSet 为故障节点上运行的 Pod 创建了新的替代副本,轻松地实现了 pod 的水平伸缩。

如果你更改了一个 pod 的标签,就有可能让它脱离它所属的 ReplicaSet

同理,如果你想将一个 Pod 归到 Replicas Set 中,也可以使用修改标签的方式将其增加到 ReplicaSet 中。

ReplicaSet yaml 示例

1.Label Selector: 标签选择器,用于确定作用域
2.Replicas:副本个数,也就是作用域
3.Pod template: pod模板

Deployment
一个 Deployment 控制器为 Pod 和 ReplicasSet 提供声明式的更新能力。

你负责描述 Deployment 中的 目标状态,而 Deployment 控制器以受控速率更改实际状态, 使其变为期望状态。你可以定义 Deployment 以创建新的 ReplicaSet,或删除现有 Deployment, 并通过新的 Deployment 收养其资源。

Deployment yaml示例

Deployment yaml 文件与 ReplicaSet 十分相似, 只是多了 strategy 字段。该字段主要用于描述升级方式。

Deployment 并不直接管理 Pod

当创建 Deployment 时,ReplicaSet 也会随之创建。在实际使用 Deployment 的时候,实际的 Pod 由 ReplicaSet 创建和管理,而不是由 Deployment 直接管理。

使用 Deployment 可以更容易地更新应用程序,因为可以直接定义单个Deployment 资源所需要达到的状态,并让 Kubernetes 处理中间状态。

升级 Deployment

Deployment 支持声明式更新,即只需要修改 Deployment 资源中的 Pod 模板,Kubernetes 会自动将实际的系统状态收敛为资源中定义的状态。

Deployment 支持不同的升级策略,主要分为 RollingUpdate 以及 Recreate 模式,本策略在 deployment.spec.strategy 字段中定义。详情可以使用 kubectl explain 命令获取。

Deployment Recreate 升级

Deployment Recreate 升级策略将会直接停止老版本 Pod, 并创建新的 ReplicaSet 和 Pod。并且进行流量切换。具体步骤如下所示:

缺陷是,升级过程中有一段时间没有Pod运行,此时如果有外部请求,服务就处于不可用状态,会损失一定流量。

Deployment RollingUpdate 升级

滚动升级方式如上图所示:

Kubernetes 会先额外创建 v2 版本的 pod 以及 replicaSet。并且逐渐销毁 v1 版本的 pod,从而实现滚动升级

同时,在生产环境中我们十分建议 Deployment 配合就绪探针使用。因为默认情况下, Pod running 时就会接受请求。但是实际上内部服务可能并未就绪。

所以可以配合 minReadySeconds 字段,以及就绪探针等相关功能进一步使用。

03
课程总结

1、探针的使用,就绪探针与存活探针。三种探测方式

2、ReplicaSet 的工作原理,通过 label 将 pod 维持在一定数量

3、Deployment 的工作原理,升级方式以及如何回滚。

以上是本期课程的所有内容,希望对大家有帮助。

更多精彩课程欢迎关注百度开发者中心公众号。

Kubernetes入门——Kubernetes实现应用的高可用相关推荐

  1. Kubernetes入门——Kubernetes日志采集与监控告警

    作者简介: 郭川磊 百度基础架构部研发工程师 负责云原生产品的研发 本文基于百度云原生团队『云原生基础知识概述及实践』系列视频课程--『Kubernetes入门-Kubernetes实现应用高可用』梳 ...

  2. Kubernetes入门——Kubernetes工作原理及使用

    作者简介: 星龙 百度基础架构部研发工程师 负责混部调度系统研发 本文基于百度云原生团队『云原生基础知识概述及实践』系列视频课程--『Kubernetes入门-Kubernetes工作原理』梳理. 视 ...

  3. Kubernetes入门——Kubernetes应用部署

    郭良帅 百度基础架构部资深工程师 负责云原生产品研发 本文基于百度云原生团队『云原生基础知识概述及实践』系列视频课程--『Kubernetes入门-Kubernetes应用部署』梳理. 视频课程可点击 ...

  4. kubeadm安装kubernetes 1.13.2多master高可用集群

    1. 简介 Kubernetes v1.13版本发布后,kubeadm才正式进入GA,可以生产使用,用kubeadm部署kubernetes集群也是以后的发展趋势.目前Kubernetes的对应镜像仓 ...

  5. 最新版Kubernetes(k8s)-v1.22.3版本高可用集群

    目录 一.环境准备 二.安装Docker 三.配置环境变量 四.所有master节点安装keepalived和haproxy服务 五.部署集群 六.部署k8s的dashboard 本文采用的是etcd ...

  6. 内网环境下手动部署kubernetes(v1.26.3)高可用集群

    这篇博客主要是记录了手动部署一个高可用的Kubernetes集群的过程.旨在帮助自己及初学者学习kubernetes,并记录下具体的操作过程和总结的知识点.文中可能存在一些问题或不足之处,仅供参考. ...

  7. Kubernetes容器集群 - harbor仓库高可用集群部署说明

    之前介绍Harbor私有仓库的安装和使用,这里重点说下Harbor高可用集群方案的部署,目前主要有两种主流的Harbor高可用集群方案:1)双主复制:2)多harbor实例共享后端存储. 一.Harb ...

  8. Kubernetes 1.15.0 ubuntu16.04 高可用安装步骤

    1. 服务器说明 使用的是3台ubuntu16.04的虚拟机,具体信息如下: 172.16.100.238 master 172.16.100.239 master1 172.16.100.240 m ...

  9. 【Linux】【Services】【SaaS】Docker+kubernetes(11. 构建复杂的高可用网络)

    1. 简介 flannel在实战阶段貌似不能胜任在灾难恢复时候异地的网络,打算用openvswith试试 转载于:https://www.cnblogs.com/demonzk/p/8404103.h ...

最新文章

  1. python爬虫知识点总结(二十三)Scrapy中Download Middleware的用法
  2. STM32 KEIL里的MAP文件分析
  3. C++ vector 使用详解
  4. python threading.local
  5. Java开发中遇到最难的问题!java定义list集合
  6. 《初级会计电算化实用教程(金蝶KIS专业版)》一1.4 会计核算软件
  7. 2017双十一珠峰算法框架Hierarchical中控算法
  8. 计算机主机组装图,自己如何组装电脑主机?diy电脑组装教程图解详细步骤+装机心得(5)...
  9. 基于本地代理的边下边播技术分析
  10. 电脑突然上不了网,而且ping网关可以通
  11. python操作sqlite数据库
  12. 皮肤样本微生物的检测介绍
  13. 胃溃疡 ---- 四药同治(丽珠得乐、奥美拉唑、阿莫西林 + 克林霉素)
  14. cocos2d-x 如何制作一个类马里奥的横版平台动作游戏 1 献给所有对动作游戏有爱的朋友
  15. matlab局部放大曲线功能
  16. (一)arcpy开发利用arcpy在arcgis中批量裁剪影像
  17. CPU上的导热硅脂和散热片大比拼
  18. java基于springboot+vue的校园跑腿系统 nodejs前后端分离
  19. 算法手撕代码1~10
  20. Centos7 deploy mongoDB Replica set

热门文章

  1. SharePoint 2010 新体验7 - Managed Metadata (托管元数据)
  2. DFANet: Deep Feature Aggregation for Real-Time Semantic Segmentation(笔记)
  3. Python3字符串复制
  4. Jenkins安装与启动
  5. Hadoop MapReduce入门程序wordcount代码示例及打包部署运行结果演示
  6. MySQL数据库优化实战
  7. 【软考-软件设计师】编译程序基本原理
  8. Java方法案例--比较两个值是否相等
  9. Play! Framework 系列(一):初探 play 框架
  10. IntelliJ IDEA创建spring boot项目的方法