Kubernetes 笔记 08 Deployment 副本管理
Hi,大家好,欢迎大家和我一起学习 K8S。
Deployment 是 K8S v1.2 引入的概念,与之一起引入还有 ReplicaSet。这两个概念是等同的,准确说是 Deployment 内部调用 ReplicaSet 来实现。
之前这个概念是由 Replication Controller 来实现的,但由于和 K8S 代码中的模块重名,所以就改成 Deployment + ReplicaSet 的组合。
Deployment 实现了 Pod 的副本管理,使得应用的表现形态和用户期望的状态保持一致。比如用户期望应用部署为 3 副本,如果在运行过程中有一个副本挂了,那么 Deployment 会自动拉起一个副本。
Deployment 对于应用的编排、自动扩容和缩容、升级回滚等功能都是至关重要的。
下面我们通过一个例子来看看 Deployment 是如何工作的。
定义一个 nginx.yaml
文件(对 yaml 文件不熟悉的可以查阅这篇文章):
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: web-server
spec:
containers:
- name: nginx
image: nginx:1.12.1
ports:
- containerPort: 80
这个文件定义了一个 nginx 容器应用,两个 Pod 副本。也就是每个 Pod 中会跑一个 nginx 应用。
执行kubectl create -f nginx.yaml
创建 Deployment 对象,在执行 kubectl get deploy
查看创建的 Deployment。
可以看到,其中两个参数 desired
(期待副本数)和 current
(当前副本数)都为 2,保持一致,我们再执行 kubectl get pod -o wide
查看当前 Pod 的情况:
可以看到,创建了两个 Pod 自动调度到了 Node1 和 Node2 上。这说明每个 Pod 副本是由 Deployment 统一创建并维护的。
为了一探究竟,我们继续深挖 Deployment。
执行 kubectl describe deployment nginx-deployment
查看该 Deployment 的详细信息。
图中圈住的地方告诉我们,这里创建了一个 ReplicaSet,也就是说 Deployment 内部是调用 ReplicaSet 来完成 Pod 副本的创建的。是否是这样,我们继续验证。
执行 kubeclt get replicaset
显示创建的 ReplicaSet 对象:
可以看到这里的 ReplicaSet 名称和上面 Deployment 信息里显示的是一样的,同样,执行 kubectl describe replicaset xxx
显示该 ReplicaSet 的详细信息。
图中,有两处地方值得注意。一处是 Controlled By
,表明 ReplicaSet 是由谁创建并控制的,显然这里显示是 Deployment。第二处是 Events
,Events 记录了 K8S 中每一种对象的日志信息,这里的信息有助于排错查问题。我们可以看到这里记录了两个 Pod 副本的创建,Pod 的名称和我们在上面执行 kubectl get pod
看到的结果是一样的。
继续执行 kubectl describe pod xxx
查看其中一个 Pod 的详细信息:
可以看到这个 Pod 是由 ReplicaSet 创建的。
到此,我们不难得出下面这幅图:
用户通过 kubeclt 创建 Deployment,Deployment 又创建 ReplicaSet,最终由 ReplicaSet 创建 Pod。
从命名上我们也可以看出,子对象的名字 = 父对象的名字 + 随机字符串。
总结
本文我们从实践上剖析了 Deployment 创建 Pod,实际上经过 ReplicaSet 进行创建。Deployment 最主要是对 Pod 进行副本管理,这样可以进行很多自动化管理的复杂操作,后面我们逐步从实践上去剖析 Pod 的各种操作。
- 查找算法的实现(C/C++实现)
- HDU 1495 非常可乐(数论,BFS)
- Selenium2+python自动化74-jquery定位
- 用php实现简单的自制计算器
- Selenium2+python自动化75-Chrome配置加载
- Selenium2+python自动化75-非input文件上传(SendKeys)
- python接口自动化11-post传data参数案例
- POJ 1321 棋盘问题(DFS板子题,简单搜索练习)
- python接口自动化12-案例分析(csrfToken)
- Python基础学习笔记
- POJ 3278 Catch That Cow(BFS,板子题)
- 【请您听我说】PHP语法特点的一些看法
- 喵哈哈村的魔法考试 Round #1 (Div.2) 题解&源码(A.水+暴力,B.dp+栈)
- 查找第k小的元素(O(n)递归解法)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Qt音视频开发7-ffmpeg音频播放
- 本地 Docker Registry 的安装与使用
- 安装 Docker 环境
- 为生产环境编译 Angular 2 应用
- 剑指offer 03:二维数组中的查找
- 《剑指offer》04:替换空格
- 《剑指offer》05: 从尾到头打印链表
- 《剑指offer》第六天:重建二叉树
- Android | 《看完不忘系列》之Glide
- Android | 资源冲突覆盖的一些思考
- 如何获取流式应用程序中checkpoint的最新offset
- Spark之离线统计热点城市信息
- 使用OpenCV实现图像增强
- typescript基础篇(4):函数
- 这样的奇技淫巧,劝你不用也罢