控制器 Controller资源

1、控制器作用

1
2
3
4
1.pod类型的资源,删除pod后,不会重建
2.替用户监视并保证相应的节点上始终有用户所期望的副本数量的pod在运行
3.如果所运行的pod副本数超过了用户期望的,那么控制器就会屾掉,直到和用户期望的一致
4.如果所运行的pod副本数低于用户期望的,那么控制器就会创建,直到和用户期望的一致

2、控制器的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1) Replicacontroller:Rc  "已经淘汰掉了"

#常用的
2) Replicaset Rs:按用户期望的副本创建pod,并始终保持相应数量副本

3) Deployment:
Deployment通过控制RS来保证POD始终保持相应的数量副本支持滚动更新,回滚,回滚默认保留10个版本提供声明式配置,支持动态修改管理无状态应用最理想的控制器node节点可能会运行0个或多个POD

4)Deamonset:
一个节点只运行一个,必须是始终运行的状态

#这个用的比较少
5)statefulset:
有状态应用

3、ReplicaSet Rs 控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
apiVersion: "apps/v1"        #RS控制器的接口
kind: "ReplicaSet" #RS控制器的类型
metadata: #RS控制器的元数据
#metadata里面的name是这个资源的name,这个name是给Rs控制器起的名
name: nginx-rs #RS控制器的名字
#labes不需要打,因为service资源找的是Pod资源的标签,所以控制器的标签没必要打
namespace: default #RS控制器启动在default名称空间
spec: #RS控制器关联Pod
#最小的准备时间,给控制器一个就绪时间,一般不需要写,不需要约束
#minReadySeconds: integer
#期望的副本,比如说起5个nginx副本
replicas: 5 #pod副本数量
#匹配标签的,有2种写法,一个是拿正则匹配,一个精确匹配
selector: #标签选择器
matchLabels: #匹配的标签
#标签能让控制器找到pod,所以这里写pod的标签,一会pod里面要打的标签一定要和这个一样
app: nginx #控制器匹配的Pod标签
template: #Pod资源信息
metadata: #Pod的元数据
name: nginx-rs-pod #Pod的名字
labels: #POD打标签
app: nginx #POD打标签
spec: #容器相关信息
containers: #容器信息
- name: nginx-web-containers #容器名
image: nginx:alpine #镜像
imagePullPolicy: IfNotPresent #拉取规则


其实Rs控制器就是把之前的Pod资源包含起来

image-20240923164211035

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1、编写Rs控制器的资源清单
[root@master01 kubernetes]# vim nginx-rs.yml
apiVersion: "apps/v1"
kind: "ReplicaSet"
metadata:
name: nginx-rs
namespace: default
spec:
replicas: 5
selector:
matchLabels:
#控制器匹配的pod标签
app: nginx
template:
metadata:
name: nginx-rs-pod
labels:
#Pod的标签被Rs控制器匹配
app: nginx
spec:
containers:
- name: nginx-web-containers
image: nginx:alpine
imagePullPolicy: IfNotPresent

2、运行,并查看,运行的Pod是轮询在node1、2、3的
[root@master01 kubernetes]# kubectl apply -f nginx-rs.yml
[root@master01 kubernetes]# kubectl get pod -owide| grep nginx-rs
nginx-rs-4z82q 1/1 Running 0 6m13s 10.2.2.9 node02
nginx-rs-d5mhz 1/1 Running 0 6m13s 10.2.2.10 node02
nginx-rs-qv5l6 1/1 Running 0 6m13s 10.2.3.62 node03
nginx-rs-t8hz6 1/1 Running 0 6m13s 10.2.1.16 node01
nginx-rs-tksxm 1/1 Running 0 6m13s 10.2.1.17 node01

Pod的名字在资源清单中加nginx-pod,但是不按pod名字来,是根具控制器name: nginx-rs这个加上随机字符串

1、rs资源的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1、查看
[root@master01 kubernetes]# kubectl get replicasets
# 期望数量 当前数量
NAME DESIRED CURRENT READY AGE
nginx-5f5d9d69c4 1 1 1 5d2h
nginx-65cc99f84f 0 0 0 5d8h
nginx-rs 5 5 5 11m


[root@master01 kubernetes]# kubectl get rs -owide
[root@master01 kubernetes]# kubectl get replicasets -owide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
nginx-rs 5 5 5 13m nginx-web-containers nginx:alpine app=nginx #标签选择器选择带app=nginx这个标签的

2、#查看详细信息
[root@master01 kubernetes]# kubectl describe rs nginx-rs


3、#持续输出
当前窗口A
[root@master01 kubernetes]# kubectl get rs -w
再打开一个master新窗口B,
[root@master01 ~]# kubectl get pod -w

再打开一个master新窗口C,删除一个pod,旧窗口有输出信息
[root@master01 ~]# kubectl delete pod nginx-rs-4z82q

窗口A、B会有输出信息,窗口B会标记删除Terminating(此时只是标记,并没有真删除),然后为了保证你的期望,会赶紧创建一个新的Pending,然后初始化容器ContainerCreating,之后在删除Terminating,新容器运行之后,才彻底被删除掉

4、#删除POD(只能删除rs控制器,否则会自动拉起)
当我们不需要这个pod,delete pod是删不掉的,删了就会重新起来,所以删rs控制器才彻底删除
kubectl delete 控制器 控制器名
[root@master01 kubernetes]# kubectl delete rs nginx-rs

2、Rs资源手动扩缩容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#方法一:
1、编辑资源清单,根据自己的需求修改副本数量
[root@master01 kubernetes]# vim nginx-rs.yml
replicas: 8

2、运行,查看
[root@master01 kubernetes]# kubectl apply -f nginx-rs.yml
[root@master01 kubernetes]# kubectl get pod
[root@master01 kubernetes]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-rs 8 8 8 10s


#方法二: 使用内置的edit命令去修改资源清单
1、编辑控制器的资源清单,根据自己的需求修改副本数量 如果是放到其他名称空间,后面要加 -n 指定名称空间
[root@master01 kubernetes]# kubectl edit rs nginx-rs
replicas: 4
修改之后直接查看,不需要apply,直接生效
[root@master01 kubernetes]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-rs 4 4 4 5m56s

#方法三: 使用专门的命令修改配置,扩缩容,升级
[root@master01 kubernetes]# kubectl scale rs nginx-rs --replicas=7

scale:手动扩缩容

[root@master01 kubernetes]# kubectl get pod
[root@master01 kubernetes]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-rs 7 7 7 13m


#专业一点是根据物理机的资源占用情况来做一个计算,如果抗不住了就自动缩容

4、Deployment 控制器

1、Deployment控制器的功能和关系

1
Deployment通过控制RS来保证Pod始终保持相对于的数量副本

image-20240923200104784

1
2
3
4
5
6
7
RS控制器他会达到你的期望副本,缺陷不能做版本升级
Deployment之所以要控制RS控制器是因为要保留RS控制器的功能,保证用户期望的副本数量一直存在

支持滚动更新,回滚,回滚默认保留10个版本(也就默认保留10个RS控制器)
提供声明式配置,支持动态修改
管理无状态应用最理想的控制器
node节点可能运行0个或多个pod

2、Deployment控制器的资源清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1、编写资源清单
[root@master01 kubernetes]# cp nginx-rs.yml nginx-dp.yml
[root@master01 kubernetes]# vim nginx-dp.yml
apiVersion: "apps/v1"
#就修改这里控制器的名字,然后再修改一下下面的标签
kind: "Deployment"
metadata:
name: nginx-dp
namespace: default
spec:
replicas: 8
selector:
matchLabels:
app: nginx-dp
template:
metadata:
name: nginx-dp-pod
labels:
app: nginx-dp
spec:
containers:
- name: nginx-web-containers
image: nginx:alpine
imagePullPolicy: IfNotPresent

2、运行并查看
[root@master01 kubernetes]# kubectl apply -f nginx-dp.yml
[root@master01 kubernetes]# kubectl get pod
[root@master01 kubernetes]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-dp 8/8 8 8 39s

3、查看控制器的详细信息
[root@master01 kubernetes]# kubectl describe deployments.apps nginx-dp

image-20240923202757305

3、Deployment的扩缩容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#方法一:
1、编辑资源清单,根据自己的需求修改副本数量
[root@master01 kubernetes]# vim nginx-dp.yml
replicas: 6

2、运行,查看
[root@master01 kubernetes]# kubectl apply -f nginx-dp.yml
[root@master01 kubernetes]# kubectl get pod
[root@master01 kubernetes]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-dp 6/6 6 6 69m


#方法二: 使用内置的edit命令去修改资源清单
1、编辑控制器的资源清单,根据自己的需求修改副本数量 如果是放到其他名称空间,后面要加 -n 指定名称空间
[root@master01 kubernetes]# kubectl edit deployments.apps nginx-dp
replicas: 10
修改之后直接查看,不需要apply,直接生效
[root@master01 kubernetes]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-dp 10/10 10 10 71m

#方法三: 使用专门的命令修改配置,扩缩容
[root@master01 kubernetes]# kubectl scale deployment nginx-dp --replicas=4
scale:手动扩缩容

[root@master01 kubernetes]# kubectl get pod
[root@master01 kubernetes]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-dp 4/4 4 4 73m

4、Deployment更新版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#方法一:
1、编辑资源清单,根据自己的需求修改版本
[root@master01 kubernetes]# vim nginx-dp.yml
image: nginx:alpine 改成 image: nginx:1.20.1

2、运行,查看
[root@master01 kubernetes]# kubectl apply -f nginx-dp.yml
[root@master01 kubernetes]# kubectl get pod
[root@master01 kubernetes]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-dp 6/6 6 6 69m


#方法二: 使用内置的edit命令去修改资源清单
1、编辑控制器的资源清单,根据自己的需求修改版本 如果是放到其他名称空间,后面要加 -n 指定名称空间
[root@master01 kubernetes]# kubectl edit deployments.apps nginx-dp
- image: nginx:alpine 改成 - image: nginx:1.20.1

修改之后直接查看,不需要apply,直接生效
[root@master01 kubernetes]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-dp-6447db69d8 0 0 0 79m
nginx-dp-7b88fc7dff 6 6 6 2m8s

这个版本是没有直接显示,可以查看
[root@master01 kubernetes]# kubectl describe rs nginx-dp-7b88fc7dff| grep -n '.*'
17行 Image: nginx:1.20.1


#方法三: 使用专门的命令升级
kubectl set image -f 资源清单 容器名=镜像:版本

[root@master01 kubernetes]# kubectl set image -f nginx-dp.yml nginx-web-containers=nginx:1.16.0

查看保留的几个版本
[root@master01 kubernetes]# kubectl get rs

滚动更新示意图:

image-20240923115022973

1
2
3
#查看版本滚动的状态是否成功
[root@master01 kubernetes]# kubectl rollout status deployment nginx-dp
deployment "nginx-dp" successfully rolled out

5、Deployment回滚到上一个版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#回滚其实和上面的更新方法一样的,改版本号
#方法一:
1、编辑资源清单,根据自己的需求修改版本
[root@master01 kubernetes]# vim nginx-dp.yml
image: nginx:alpine 改成 image: nginx:1.20.1

2、运行,查看
[root@master01 kubernetes]# kubectl apply -f nginx-dp.yml
[root@master01 kubernetes]# kubectl get pod
[root@master01 kubernetes]# kubectl get deployments.apps



#方法二: 使用内置的edit命令去修改资源清单
1、编辑控制器的资源清单,根据自己的需求修改版本 如果是放到其他名称空间,后面要加 -n 指定名称空间
[root@master01 kubernetes]# kubectl edit deployments.apps nginx-dp
- image: nginx:alpine 改成 - image: nginx:1.20.1

修改之后直接查看,不需要apply,直接生效
[root@master01 kubernetes]# kubectl get rs

这个版本是没有直接显示,可以查看
[root@master01 kubernetes]# kubectl describe rs nginx-dp-7b88fc7dff| grep -n '.*'
17行 Image: nginx:1.20.1


#方法三: 使用专门的命令升级
kubectl set image -f 资源清单 容器名=镜像:版本

[root@master01 kubernetes]# kubectl set image -f nginx-dp.yml nginx-web-containers=nginx:1.16.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#查看历史版本
[root@master01 kubernetes]# kubectl rollout history deployment nginx-dp
deployment.apps/nginx-dp
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>
保留10个,现在只要3个

#查看指定历史版本的信息
[root@master01 kubernetes]# kubectl rollout history deployment nginx-dp --revision=1
第7行可以看到版本信息
Image: nginx:alpine

#看完版本后,就可以回滚到指定版本
[root@master01 kubernetes]# kubectl rollout undo deployment nginx-dp --to-revision=1
[root@master01 kubernetes]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-dp-57fb845d6d 0 0 0 3m45s
nginx-dp-6447db69d8 6 6 6 109m
nginx-dp-6c696f4449 0 0 0 22m
nginx-dp-7b88fc7dff 0 0 0 31m
[root@master01 kubernetes]# kubectl describe rs nginx-dp-6447db69d8
查看已经回到alpine版本
Image: nginx:alpine

小技巧 使用–record在历史版本中记录命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#查看历史版本
[root@master01 kubernetes]# kubectl rollout history deployment nginx-dp
deployment.apps/nginx-dp
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>

当前版本信息为<none>,当使用命令去更改的使用,可以在最后面加上选项--record,可以记录这条执行的命令,如果资源清单加上版本号,也是可以显示,用法如下
#方法一:
1、修改资源清单,改一下里面的版本
[root@master01 kubernetes]# vim nginx-dp.yml
image: nginx:1.17.4

2、运行资源清单
[root@master01 kubernetes]# kubectl apply -f nginx-dp.yml --record
[root@master01 kubernetes]# kubectl rollout history deployment nginx-dp
deployment.apps/nginx-dp
REVISION CHANGE-CAUSE
2 <none>
3 <none>
4 <none>
5 <none>
6 kubectl apply --filename=nginx-dp.yml --record=true


#方法二:
[root@master01 kubernetes]# kubectl set image -f nginx-dp.yml nginx-web-containers=nginx:1.18.4 --record
deployment.apps/nginx-dp image updated

[root@master01 kubernetes]# kubectl rollout history deployment nginx-dp
deployment.apps/nginx-dp
REVISION CHANGE-CAUSE
2 <none>
3 <none>
4 <none>
5 <none>
6 kubectl apply --filename=nginx-dp.yml --record=true
7 kubectl set image nginx-web-containers=nginx:1.18.4 --filename=nginx-dp.yml --record=true

5、DaemonSet 控制器

1、DaemonSet类型介绍 应用场景:每一个节点有且只起一个pod,像zabbix-agent,flannel

image-20240923120503080

1
2
3
4
简单来说就是每个节点部署一个POD副本
常见的应用场景:
监控容器
日志收集容器

2、DaemonSet的资源清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1、编写资源清单
[root@master01 kubernetes]# cp nginx-dp.yml nginx-ds.yml
[root@master01 kubernetes]# vim nginx-ds.yml
apiVersion: "apps/v1"
#修改一下控制器类型
kind: "DaemonSet"
metadata:
name: nginx-ds
namespace: default
spec:
#replicas: 6 这行不要
selector:
matchLabels:
app: nginx-ds
template:
metadata:
name: nginx-ds-pod
labels:
app: nginx-ds
spec:
containers:
- name: nginx-web-containers
image: nginx:alpine
imagePullPolicy: IfNotPresent

2、运行资源清单,并查看
[root@master01 kubernetes]# kubectl get pod -owide| grep nginx-ds
nginx-ds-7gpkh 1/1 Running 0 3m21s 10.2.1.38 node01
nginx-ds-9r2hz 1/1 Running 0 3m21s 10.2.2.34 node02
nginx-ds-vmjsj 1/1 Running 0 3m21s 10.2.3.81 node03
[root@master01 kubernetes]# kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE
nginx-ds 3 3 3 3 3



#不需要扩缩容,一台机器只能起一个,除非加node
1
2
3
4
5
这几个控制器,以后看你起什么样的服务,去决定你用什么类型的控制器,除了客户端类型的,大部分都是Deplament

StatefulSet控制器
mysql主从复制 ,kepalived
这个用的少,如果需要可以从网上搜索K8smysql主从复制

小练习:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1、## 使用控制器起wordpress
一:wordpress镜像
在一个POD里启动两个容器
- wordpress
- mysql5.7
1.就绪性探针
2.存活性探针
3.启动钩子
4.停止钩子
5.初始化容器
二:尝试 wordpress 启动一个POD
MySQL单独启动在一个POD里


2、## 了解HPA 自动扩缩容
3、## 写一个MySQL主从复制的资源清单

一、使用控制器起wordpress

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
#给Deployment资源起的名字
name: wp-dp
namespace: default
spec:
#起2个,数据也是2个,除非把数据分开,所以现在只能起1个
replicas: 1
selector:
matchLabels:
app: wp
template:
metadata:
name: wp-pod
namespace: default
labels:
app: wp
spec:
volumes:
- name: mysql-data
hostPath:
path: /data/mysql
- name: wp-data
hostPath:
path: /data/wp
containers:
- name: wp-container
image: wordpress
imagePullPolicy: IfNotPresent
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 10
periodSeconds: 3
timeoutSeconds: 3
failureThreshold: 3
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 3
timeoutSeconds: 1
periodSeconds: 2
successThreshold: 3
failureThreshold: 3
env:
- name: WORDPRESS_DB_HOST
value: '127.0.0.1'
- name: WORDPRESS_DB_USER
value: 'wp_user'
- name: WORDPRESS_DB_PASSWORD
value: '123'
- name: WORDPRESS_DB_NAME
value: 'wp_db'

volumeMounts:
- name: wp-data
mountPath: /var/www/html/

- name: mysql-container
image: mysql:5.7
imagePullPolicy: IfNotPresent
args:
- --character-set-server=utf8
- --collation-server=utf8_general_ci
livenessProbe:
exec:
command: ["/bin/sh","-c","mysqladmin -uroot -p123 ping"]
initialDelaySeconds: 10
periodSeconds: 3
timeoutSeconds: 3
failureThreshold: 3
env:
- name: MYSQL_ROOT_PASSWORD
value: '123'
- name: MYSQL_DATABASE
value: 'wp_db'
- name: MYSQL_USER
value: 'wp_user'
- name: MYSQL_PASSWORD
value: '123'
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql

目前的资源清单还是有缺陷
1、对外提供服务的问题
2、数据容器和wordpress容器在同一个pod里,正常应该分开起在不同pod
3、自动扩缩容