此文为学习《Kubernetes权威指南》的相关笔记
学习笔记:
Pod是可以创建和管理Kubernetes计算的最小可部署单元,在初步学习Pod的组成和创建后,紧接着将要探寻的就是,如何对Pod进行批量的生成和调度,生成Pod的上层抽象,在K8s中,这项任务交由各类副本控制器进行。
在实际部署中,很少直接去定义一个Pod,而是使用诸如Repliction Controller、ReplicaSet、Deployment、Job等副本控制器去创建,这些控制器根据目标功能的不同担任不同的作用,但都具有对一组Pod副本的创建、调度及生命周期的自动控制功能。后续对于Pod的学习,将集中在这几类副本控制器上,包括他们的功能、使用场景和创建方法。
最早的K8s中只有Replication Controller(CA)一种副本控制器,他通过标签选择器(Label Selector)这个松耦合关联关系控制目标Pod实例的创建和销毁,而随后出现的ReplicaSet(RS)在RC的基本功能之上增加了集合式的标签选择器,使得RS对于Pod副本的管理具有更强的灵活性,而Deployment的出现可以说是对上述两种副本控制器的一种升级,他在内部使用RS来实现,也就是说创建一个Deployment会自动生成一个他下属的RS,相比RC,Deployment最大提升在于可以随时知道当前Pod的部署进度。
阿里云大学云原生公开课上,对Deployment给出的介绍如下:
这套课程暂时并没有对RS和RC做任何介绍,可以猜测当前工业应用中基本以Deployment作为主要控制器方案。
接下来新建一个Deployment实例
1、创建配置文件nginx-deployment.yaml
在nginx-deployment的创建中,与其他资源对象一样,首先定义apiversion、kind、metadata
在资源对象特征spec中,指明Pod副本个数replicas,随后定义标签选择器
这里需要注意,在第四版书中,没有对这个Deployment定义标签选择器,运行因缺失selector对象而失败
推测在后续的版本更新中,已经强制在Deployment的定义中必须加入标签选择器
与RC不用,RS和Deployment的selector域下不可以直接写出Label键值对,而是必须通过matchLabes和matchExpressions来配置标签选择器
最后,在template域下定义本副本控制器属下的Pod信息,这里与单独定义Pod的写法基本相同,不过不需要apiVersion和Kind
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template: #模板域定义
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
2、创建并查看nginx-deployment相关信息
创建deployment,通过yaml文件创建K8s资源对象的方式基本都相同。
# kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
分别查看当前的deployment列表、RS列表、Pod列表,可以看到建立的Deployment和其属下的RS以及他建立的三个Pod副本
注意观察Deployment到RS到Pod的命名方式
Deployment列表中给出了目前Pod副本的版本更新情况(UP-TO-DATE)
# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 6m16s
# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-85ff79dd56 3 3 3 6m23s # RS名称以所属RC为前缀
# kubectl get pods
NAME READY STATUS RESTARTS AGE #Pod名称以所属RS为前缀
nginx-deployment-85ff79dd56-6qs5f 1/1 Running 0 6m29s
nginx-deployment-85ff79dd56-j6ptn 1/1 Running 0 6m29s
nginx-deployment-85ff79dd56-qh82q 1/1 Running 0 6m29s
3、RC、RS、Deployment都支持使用kubectl scale命令进行动态缩放Pod副本数量
# kubectl scale deployment nginx-deployment --replicas=4
deployment.apps/nginx-deployment scaled
[root@MiWiFi-R4CM-srv learn-pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-85ff79dd56-4sf4x 1/1 Running 0 36s
nginx-deployment-85ff79dd56-8d2p9 1/1 Running 0 36s
nginx-deployment-85ff79dd56-knbm4 0/1 ContainerCreating 0 3s
nginx-deployment-85ff79dd56-t7jzz 1/1 Running 0 36s# kubectl scale deployment nginx-deployment --replicas=2
deployment.apps/nginx-deployment scaled
[root@MiWiFi-R4CM-srv learn-pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-85ff79dd56-8d2p9 1/1 Running 0 100s
nginx-deployment-85ff79dd56-t7jzz 1/1 Running 0 100s
删除nginx-deployment ,其下属的RS和Pod副本都将一起被删除
就Deployment的使用仍有很多特性和命令等待学习
以上