一、pod控制器controller作用及分类
controller作用:
用于控制pod
参考:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/
控制器主要分为:
Deployments
部署无状态应用,控制pod升,回退ReplicaSet
副本集,控制pod扩容,裁减ReplicationController
(相当于ReplicaSet的老版本,现在建议使用Deployments加ReplicaSet替代RC)StatefulSets
部署有状态应用,结合Service、存储等实现对有状态应用部署DaemonSet
守护进程集,运行在所有集群节点(包括master),比如使用filebeat,node_exporterJobs
一次性Cronjob
周期性
二、Deployment介绍及应用
1、Deployments介绍
1.1、Replicaset控制器的功能
- 支持新的基于集合的selector(以前的rc里没有这种功能)
- 通过改变Pod副本数量实现Pod的扩容和缩容
1.2、Deployment控制器的功能
- Deployment集成了上线部署、滚动升级、创建副本、回滚等功能
- Deployment里包含并使用了ReplicaSet
1.3、Deployment用于部署无状态应用
无状态应用的特点:
- 所有pod无差别
- 所有pod中容器运行同一个image
- 所有pod可以运行在集群中任意node上
- 所有pod无启动顺序先后之分
- 随意pod数量扩容或缩容
- 例如简单运行一个静态web程序
2、创建Deployments应用
2.1、创建Deployments应用
2.1.1、准备yaml文件
[root@k8s-master01 yaml]# cat deployment-nginx.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx # deployment名
namespace: test
spec:
replicas: 1 # 副本集,deployment使用了replicas
selector:
matchLabels:
app: nginx # 匹配pod标签,表示deployment和rs控制器嗲有此标签的pod
template: # 代表pod的配置模板
metadata:
labels:
app: nginx # pod标签
spec:
containers: # 以下为pod里面的容器定义
- name: nginx
image: nginx:1.25.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
2.1.2、检查语法错误并应用
[root@k8s-master01 yaml]# kubectl apply -f deployment-nginx.yaml --dry-run=client
namespace/test created (dry run)
deployment.apps/deploy-nginx created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f deployment-nginx.yaml
namespace/test created
deployment.apps/deploy-nginx created
2.1.3、验证
[root@k8s-master01 yaml]# kubectl get pod -n test deploy-nginx-75b69bd684-k69tz -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-75b69bd684-k69tz 1/1 Running 0 4m45s 10.244.203.213 k8s-worker04 <none> <none>
[root@k8s-master01 yaml]# kubectl get deployments.apps -n test
NAME READY UP-TO-DATE AVAILABLE AGE
deploy-nginx 1/1 1 1 6m30s
[root@k8s-master01 yaml]# kubectl get replicasets.apps -n test
NAME DESIRED CURRENT READY AGE
deploy-nginx-75b69bd684 1 1 1 10m
2.2、访问Deployments应用
2.2.1、查看podip地址
[root@k8s-master01 yaml]# kubectl get pod -n test deploy-nginx-75b69bd684-k69tz -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-75b69bd684-k69tz 1/1 Running 0 11m 10.244.203.213 k8s-worker04 <none> <none>
可以在集群中任意节点访问ip:10.244.203.213
[root@k8s-master01 yaml]# curl http://10.244.203.213
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
使用kuboard查看
2.3、删除Deployments中的pod应用
2.3.1、删除pod(是删除deployment中的pod)
[root@k8s-master01 yaml]# kubectl delete pod -n test deploy-nginx-75b69bd684-k69tz
2.3.2、再次查看发现,又重新启动了一个pod,而且pod所在节点及ip发生了变化
[root@k8s-master01 yaml]# kubectl get pod -n test deploy-nginx-75b69bd684-wkh5j -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-75b69bd684-wkh5j 1/1 Running 0 17s 10.244.39.208 k8s-worker03 <none> <none>
也就是说pod的ip不是固定的,比如把整个集群关闭在启动,pod也会自动启动,但是IP地址也会发生变化。既然IP地址不是固定的,所以需要一个固定的访问endpoint给用户,那么这种方式就是service。
2.4、pod版本升级
2.4.1、查看帮助
[root@k8s-master01 yaml]# kubectl set image -h
2.4.2、升级前验证nginx版本
[root@k8s-master01 yaml]# kubectl describe pods -n test deploy-nginx-5db9bd9c5c-pxsnr | grep Image:
Image: nginx:1.25.2
[root@k8s-master01 yaml]# kubectl exec -it -n test deploy-nginx-5db9bd9c5c-pxsnr -- nginx -v
nginx version: nginx/1.25.2
2.4.3、升级为1.25.4
[root@k8s-master01 yaml]# kubectl set image deployment/deploy-nginx nginx=nginx:1.25.4 -n test --record
deployment.apps/deploy-nginx image updated
2.4.4、验证
[root@k8s-master01 yaml]# kubectl exec -it -n test deploy-nginx-5fd67d7b9f-fdzs2 -- nginx -v
nginx version: nginx/1.25.4
使用kuboard查看
如果升级的pod太多需要一定的时间,可通过下面命令查看是否升级成功
[root@k8s-master01 yaml]# kubectl rollout status deployment/deploy-nginx -n test
deployment "deploy-nginx" successfully rolled out
2.5、pod版本回退
2.5.1、查看历史版本信息
[root@k8s-master01 yaml]# kubectl rollout history deployment/deploy-nginx -n test
deployment.apps/deploy-nginx
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deployment/deploy-nginx nginx=nginx:1.25.4 --namespace=test --record=true
2.5.2、定义要退回的版本(需要执行后才是真的回退版本)
[root@k8s-master01 yaml]# kubectl rollout history deployment/deploy-nginx -n test --revision=1
deployment.apps/deploy-nginx with revision #1
Pod Template:
Labels: app=nginx
pod-template-hash=5db9bd9c5c
Containers:
nginx:
Image: nginx:1.25.2 # 可以看到要回退的版本:1.25.2版本
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
2.5.3、执行回退
[root@k8s-master01 yaml]# kubectl rollout undo deployment/deploy-nginx -n test --to-revision=1
deployment.apps/deploy-nginx rolled back
2.5.4、验证
[root@k8s-master01 yaml]# kubectl exec -it -n test deploy-nginx-5db9bd9c5c-75fjg -- nginx -v
nginx version: nginx/1.25.2
使用kuboard查看
查看版本历史
[root@k8s-master01 yaml]# kubectl rollout history deployment/deploy-nginx -n test
deployment.apps/deploy-nginx
REVISION CHANGE-CAUSE
2 kubectl set image deployment/deploy-nginx nginx=nginx:1.25.4 --namespace=test --record=true
3 <none>
2.6、副本扩容
2.6.1、查看帮助
[root@k8s-master01 yaml]# kubectl scale -h
2.6.2、扩容为2个副本
[root@k8s-master01 yaml]# kubectl scale deployment/deploy-nginx -n test --replicas=2
deployment.apps/deploy-nginx scaled
2.6.3、查看扩容后的副本信息
[root@k8s-master01 yaml]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-5db9bd9c5c-75fjg 1/1 Running 0 14m 10.244.203.216 k8s-worker04 <none> <none>
deploy-nginx-5db9bd9c5c-7ncgp 1/1 Running 0 2m44s 10.244.39.210 k8s-worker03 <none> <none>
使用kuboard查看
2.6.4、继续扩容,扩容为4个副本(扩容的数量跟node的节点数无关)
[root@k8s-master01 yaml]# kubectl scale deployment/deploy-nginx -n test --replicas=4
deployment.apps/deploy-nginx scaled
[root@k8s-master01 yaml]#
2.6.5、再次查看扩容后的副本信息
[root@k8s-master01 yaml]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-5db9bd9c5c-75fjg 1/1 Running 0 16m 10.244.203.216 k8s-worker04 <none> <none>
deploy-nginx-5db9bd9c5c-7ncgp 1/1 Running 0 5m11s 10.244.39.210 k8s-worker03 <none> <none>
deploy-nginx-5db9bd9c5c-cwncv 1/1 Running 0 32s 10.244.203.217 k8s-worker04 <none> <none>
deploy-nginx-5db9bd9c5c-lscst 1/1 Running 0 32s 10.244.39.211 k8s-worker03 <none> <none>
[root@k8s-master01 yaml]# kubectl get deployments.apps -n test
NAME READY UP-TO-DATE AVAILABLE AGE
deploy-nginx 4/4 4 4 54m
使用kuboard查看
2.7、副本裁剪
2.7.1、指定副本数为1进行裁剪
[root@k8s-master01 yaml]# kubectl scale deployment/deploy-nginx -n test --replicas=1
deployment.apps/deploy-nginx scaled
2.7.2、验证
[root@k8s-master01 yaml]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-5db9bd9c5c-75fjg 1/1 Running 0 27m 10.244.203.216 k8s-worker04 <none> <none>
使用kuboard查看
2.8、多副本滚动更新
2.8.1、先扩容多点副本,扩容10个
[root@k8s-master01 yaml]# kubectl scale deployment/deploy-nginx -n test --replicas=10
deployment.apps/deploy-nginx scaled
2.8.2、验证
[root@k8s-master01 yaml]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-5db9bd9c5c-56zrv 1/1 Running 0 113s 10.244.203.219 k8s-worker04 <none> <none>
deploy-nginx-5db9bd9c5c-6gf24 1/1 Running 0 113s 10.244.39.215 k8s-worker03 <none> <none>
deploy-nginx-5db9bd9c5c-75fjg 1/1 Running 0 31m 10.244.203.216 k8s-worker04 <none> <none>
deploy-nginx-5db9bd9c5c-8h5c7 1/1 Running 0 113s 10.244.39.212 k8s-worker03 <none> <none>
deploy-nginx-5db9bd9c5c-pbcmp 1/1 Running 0 113s 10.244.69.204 k8s-worker02 <none> <none>
deploy-nginx-5db9bd9c5c-rdxkl 1/1 Running 0 113s 10.244.39.213 k8s-worker03 <none> <none>
deploy-nginx-5db9bd9c5c-sskk4 1/1 Running 0 113s 10.244.79.77 k8s-worker01 <none> <none>
deploy-nginx-5db9bd9c5c-svqsp 1/1 Running 0 113s 10.244.203.220 k8s-worker04 <none> <none>
deploy-nginx-5db9bd9c5c-t8v8g 1/1 Running 0 113s 10.244.203.218 k8s-worker04 <none> <none>
deploy-nginx-5db9bd9c5c-vgzfj 1/1 Running 0 113s 10.244.39.214 k8s-worker03 <none> <none>
[root@k8s-master01 yaml]# kubectl get deployments.apps -n test
NAME READY UP-TO-DATE AVAILABLE AGE
deploy-nginx 10/10 10 10 73m
使用kuboard查看
2.8.3、滚动更新
[root@k8s-master01 yaml]# kubectl set image deployment/deploy-nginx -n test nginx=nginx:1.25.4 --record
deployment.apps/deploy-nginx image updated
2.8.4、验证
[root@k8s-master01 yaml]# kubectl rollout status deployment/deploy-nginx -n test
deployment "deploy-nginx" successfully rolled out
[root@k8s-master01 yaml]# kubectl describe pod -n test deploy-nginx-5fd67d7b9f-
deploy-nginx-5fd67d7b9f-5bbsg deploy-nginx-5fd67d7b9f-jn4kn deploy-nginx-5fd67d7b9f-x2j2p deploy-nginx-5fd67d7b9f-zmwp6
deploy-nginx-5fd67d7b9f-dxbxx deploy-nginx-5fd67d7b9f-pnjpx deploy-nginx-5fd67d7b9f-x7ffb
deploy-nginx-5fd67d7b9f-hsf4p deploy-nginx-5fd67d7b9f-vm7hw deploy-nginx-5fd67d7b9f-x955g
[root@k8s-master01 yaml]# kubectl describe pod -n test deploy-nginx-5fd67d7b9f-5bbsg | grep Image:
Image: nginx:1.25.4
使用kuboard查看
2.9、删除Deployments
若果使用kubectl delete deployment/deploy-nginx命令删除deployment,那么里面的pod也会自动删除
[root@k8s-master01 yaml]# kubectl delete deployments/deploy-nginx -n test
deployment.apps "deploy-nginx" deleted
[root@k8s-master01 yaml]# kubectl get deployments.apps
No resources found in default namespace.
三、Replicaset类型应用及扩容演示
1、编写yaml文件
[root@k8s-master01 yaml]# cat replicaset-nginx.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx
namespace: test
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
2、检查语法错误及应用
[root@k8s-master01 yaml]# kubectl apply -f replicaset-nginx.yaml --dry-run=client
namespace/test configured (dry run)
replicaset.apps/rs-nginx configured (dry run)
[root@k8s-master01 yaml]# kubectl apply -f replicaset-nginx.yaml
namespace/test unchanged
replicaset.apps/rs-nginx created
3、验证
[root@k8s-master01 yaml]# kubectl get replicasets.apps -n test
NAME DESIRED CURRENT READY AGE
rs-nginx 1 1 0 89s
[root@k8s-master01 yaml]# kubectl get pod -n test rs-nginx-46z8k -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
rs-nginx-46z8k 0/1 ContainerCreating 0 109s <none> k8s-worker03 <none> <none>
[root@k8s-master01 yaml]# kubectl describe pod -n test rs-nginx-46z8k | tail -8
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m8s default-scheduler Successfully assigned test/rs-nginx-46z8k to k8s-worker03
Normal Pulling 2m8s kubelet Pulling image "nginx:1.24.0"
Normal Pulled 11s kubelet Successfully pulled image "nginx:1.24.0" in 1m57.106137973s
Normal Created 11s kubelet Created container nginx
Normal Started 10s kubelet Started container nginx
4、副本扩容
[root@k8s-master01 yaml]# kubectl scale replicaset/rs-nginx -n test --replicas=4
replicaset.apps/rs-nginx scaled
5、验证
[root@k8s-master01 yaml]# kubectl get replicasets.apps -n test
NAME DESIRED CURRENT READY AGE
rs-nginx 4 4 4 9m21s
[root@k8s-master01 yaml]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
rs-nginx-46z8k 1/1 Running 0 9m22s
rs-nginx-56wqf 1/1 Running 0 109s
rs-nginx-8t5xx 1/1 Running 0 110s
rs-nginx-lfxpj 1/1 Running 0 109s
6、pod版本升级
[root@k8s-master01 yaml]# kubectl set image replicaset/rs-nginx -n test nginx=nginx:1.25.2 --record
replicaset.apps/rs-nginx image updated
replicaset/rs-nginx
表示控制器replicaset包含了pod应用rs-nginx
nginx=nginx:1.25.0
前面的nginx表示为容器名,后面为升级的版本
--record
表示会记录
7、验证
[root@k8s-master01 yaml]# kubectl describe pod -n test rs-nginx-46z8k | grep Image:
Image: nginx:1.24.0
发现:并没有升级
,因此如果需要升级需要借助Deployment控制器来完成
,因此没有单独使用replicaset控制器的
四、DaemonSet介绍及应用
1、DaemonSet介绍
- DaemonSet能够让所有(或者特定)的节点运行同一个pod。
- 当节点加入到K8S集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从K8S集群中被移除,被DaemonSet调度的pod会被移除
- 如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。
- 如果一个DaemonSet的Pod被杀死、停止、或者崩溃,那么DaemonSet将会重新创建一个新的副本在这台计算节点上。
- DaemonSet一般应用于日志收集、监控采集、分布式存储守护进程等
2、应用案例,在所有节点部署nginx,用来测试
2.1、编写yaml文件
[root@k8s-master01 yaml]# cat DaemonSet-nginx.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: dt-nginx
namespace: test
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
tolerations: #tolerations代表容忍
- key: node-role.kubernetes.io/master # 能容忍的污点
effect: NoSchedule # kubectl explain pod.spec.tolerations查看(能容忍的污点effect)
containers:
- name: nginx
image: nginx:1.24.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
resources: # resources资源限制是为了防止master节点资源被占用太多,根据实际情况配置
limits:
memory: 100Mi
requests:
memory: 100Mi
2.2、检查语法错误并应用
[root@k8s-master01 yaml]# kubectl apply -f DaemonSet-nginx.yaml --dry-run=client
namespace/test created (dry run)
daemonset.apps/dt-nginx created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f DaemonSet-nginx.yaml
namespace/test created
daemonset.apps/dt-nginx created
2.3、验证
[root@k8s-master01 yaml]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dt-nginx-g8v6q 1/1 Running 0 42s 10.244.39.221 k8s-worker03 <none> <none>
dt-nginx-hx4zq 1/1 Running 0 42s 10.244.195.20 k8s-master03 <none> <none>
dt-nginx-kgpjq 1/1 Running 0 42s 10.244.122.136 k8s-master02 <none> <none>
dt-nginx-nkcwz 1/1 Running 0 42s 10.244.203.226 k8s-worker04 <none> <none>
dt-nginx-qfp88 1/1 Running 0 42s 10.244.69.210 k8s-worker02 <none> <none>
dt-nginx-qfrnn 1/1 Running 0 42s 10.244.79.82 k8s-worker01 <none> <none>
dt-nginx-vmm6r 1/1 Running 0 42s 10.244.32.148 k8s-master01 <none> <none>
使用kuboard查看
五、StatefulSet介绍及应用
1、StatefulSet控制器作用
- StatefulSet 是用来管理有状态应用的控制器。
- StatefulSet 用来管理某Pod集合的部署和扩缩及滚动更新
- StatefulSet 并为这些 Pod 提供持久存储和持久标识符。
2、无状态应用与有状态应用
2.1 无状态应用
如nginx
- 请求本身包含了响应端为响应这一请求所需的全部信息。每一个请求都像首次执行一样,不会依赖之前的数据进行响应。
- 不需要持久化的数据
- 无状态应用的多个实例之间互不依赖,可以无序的部署、删除或伸缩
2.2 有状态应用
如mysql
- 前后请求有关联与依赖
- 需要持久化的数据
- 有状态应用的多个实例之间有依赖,不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。
3、StatefulSet的特点
- 稳定的、唯一的网络标识符。 (通过headless服务实现,这个可以先暂时放一放,讲Service的时候就知道了)
- 稳定的、持久的存储。 (通过PV,PVC,storageclass实现,这个可以先暂时放一放,讲存储的时候就知道了)
- 有序的、优雅的部署和缩放。
- 有序的、自动的滚动更新。
4、StatefulSet的YAML组成
需要三个组成部分:
- headless service: 实现稳定,唯一的网络标识
- statefulset类型资源: 写法和deployment几乎一致,就是类型不一样
- volumeClaimTemplate : 指定存储卷
5、创建StatefulSet应用
关于基于nfs的动态存储,请查看后续
5.1、编写yaml文件
[root@k8s-master01 yaml]# cat StatefulSet-nginx.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
namespace: test
spec:
serviceName: nginx
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24.0
ports:
- containerPort: 80
name: web
volumeMounts:
- name: nginx-www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: nginx-www
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "nfs-client"
resources:
requests:
storage: 2Gi
5.2、检查语法并应用
[root@k8s-master01 yaml]# kubectl apply -f StatefulSet-nginx.yaml --dry-run=client
service/nginx configured (dry run)
statefulset.apps/web configured (dry run)
[root@k8s-master01 yaml]# kubectl apply -f StatefulSet-nginx.yaml
5.3、验证pod信息
[root@k8s-master01 yaml]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-0 1/1 Running 0 9m36s 10.244.203.239 k8s-worker04 <none> <none>
web-1 1/1 Running 0 9m34s 10.244.79.84 k8s-worker01 <none> <none>
web-2 1/1 Running 0 9m31s 10.244.203.240 k8s-worker04 <none> <none>
[root@k8s-master01 yaml]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-10d3722a-f06f-439e-8baf-cbba6069d7cd 2Gi RWO Delete Bound test/nginx-www-web-2 nfs-client 12m
pvc-4edf6abd-98ef-4d2c-ac03-b77e78ecacef 2Gi RWO Delete Bound test/nginx-www-web-0 nfs-client 16m
pvc-d652f399-a29b-40ea-b866-a214e33f2865 2Gi RWO Delete Bound test/nginx-www-web-1 nfs-client 12m
5.4、在对应的nfs服务器中就会创建对应的挂载目录
[root@k8s-nfs ~]# tree /kuberneters/
/kuberneters/
├── test-nginx-www-web-0-pvc-4edf6abd-98ef-4d2c-ac03-b77e78ecacef
├── test-nginx-www-web-1-pvc-d652f399-a29b-40ea-b866-a214e33f2865
└── test-nginx-www-web-2-pvc-10d3722a-f06f-439e-8baf-cbba6069d7cd
3 directories, 0 files
5.5、在nfs挂载目录中添加nginx首页文件并测试
# 在nfs服务器中pod对应的挂载目录中创建测试文件
[root@k8s-nfs ~]# cd /kuberneters/
[root@k8s-nfs kuberneters]# echo "nginx01" > test-nginx-www-web-0-pvc-4edf6abd-98ef-4d2c-ac03-b77e78ecacef/index.html
[root@k8s-nfs kuberneters]# echo "nginx02" > test-nginx-www-web-1-pvc-d652f399-a29b-40ea-b866-a214e33f2865/index.html
[root@k8s-nfs kuberneters]# echo "nginx03" > test-nginx-www-web-2-pvc-10d3722a-f06f-439e-8baf-cbba6069d7cd/index.html
# 在集群中测试
[root@k8s-master01 yaml]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-0 1/1 Running 0 25s 10.244.203.242 k8s-worker04 <none> <none>
web-1 1/1 Running 0 23s 10.244.69.211 k8s-worker02 <none> <none>
web-2 1/1 Running 0 22s 10.244.39.232 k8s-worker03 <none> <none>
[root@k8s-master01 yaml]# curl 10.244.203.242
nginx01
[root@k8s-master01 yaml]# curl 10.244.69.211
nginx02
[root@k8s-master01 yaml]# curl 10.244.39.232
nginx03
使用kuboard查看
六、Job介绍及应用
1、Job是什么?
- 对于ReplicaSet、ReplicationController等类型的控制器而言,它希望pod保持预期数目、持久运行下去,除非用户明确删除,否则这些对象一直存在,它们针对的是耐久性任务,如web服务等。对于非耐久性任务,比如压缩文件,任务完成后,pod需要结束运行,不需要pod继续保持在系统中,这个时候就要用到Job。因此说Job是对ReplicaSet、ReplicationController等持久性控制器的补充。
- Job负责批量处理短暂的一次性任务,即仅执行一次的任务,它保证批处理任务的一个或多个pod成功结束。
2、案例1:计算圆周率2000位
编写yaml文件
[root@k8s-master01 yaml]# vim job1.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi #job名称
labels:
app: pi
spec:
template:
metadata:
name: pi
labels:
app: pi
spec:
restartPolicy: Never #执行完成后不在重启
containers:
- name: pi #容器名
image: perl
imagePullPolicy: IfNotPresent
command: ['perl', '-Mbignum=bpi', '-wle',"print bpi(2000)"]
检查语法错误并执行
[root@k8s-master01 yaml]# kubectl apply -f job1.yaml --dry-run=client
job.batch/pi created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f job1.yaml
job.batch/pi created
验证pod信息
[root@k8s-master01 yaml]# kubectl describe pod pi-rj2rz | tail -8
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 18s default-scheduler Successfully assigned default/pi-rj2rz to k8s-worker04
Normal Pulled 17s kubelet Container image "perl" already present on machine
Normal Created 17s kubelet Created container pi
Normal Started 17s kubelet Started container pi
[root@k8s-master01 yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pi-rj2rz 0/1 Completed 0 25s 10.244.203.247 k8s-worker04 <none> <none>
验证计算结果
[root@k8s-master01 yaml]# kubectl logs pi-rj2rz
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901
查看pod运行状态
[root@k8s-master01 yaml]# kubectl get pod pi-rj2rz -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pi-rj2rz 0/1 Completed 0 2m4s 10.244.203.247 k8s-worker04 <none> <none>
3、案例2:创建固定次数job
编写yaml文件
[root@k8s-master01 yaml]# vim job2.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: busybox-job
labels:
app: busybox-job
spec:
completions: 10 # 执行job的次数
parallelism: 1 # 执行job的并发数
template:
metadata:
name: busybox-job
labels:
app: busybox-job
spec:
restartPolicy: Never
containers:
- name: busybox-job
image: busybox
imagePullPolicy: IfNotPresent
command: ['echo', 'hello']
检查语法错误并执行
[root@k8s-master01 yaml]# kubectl apply -f job2.yaml --dry-run=client
job.batch/busybox-job created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f job2.yaml
job.batch/busybox-job created
验证pod信息
[root@k8s-master01 yaml]# kubectl get job
NAME COMPLETIONS DURATION AGE
busybox-job 10/10 11s 2m20s
[root@k8s-master01 yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox-job-645sx 0/1 Completed 0 93s 10.244.203.252 k8s-worker04 <none> <none>
busybox-job-94dkg 0/1 Completed 0 88s 10.244.203.193 k8s-worker04 <none> <none>
busybox-job-fqr66 0/1 Completed 0 97s 10.244.203.248 k8s-worker04 <none> <none>
busybox-job-jlwp5 0/1 Completed 0 94s 10.244.203.251 k8s-worker04 <none> <none>
busybox-job-q5ff9 0/1 Completed 0 96s 10.244.203.249 k8s-worker04 <none> <none>
busybox-job-rh4fb 0/1 Completed 0 92s 10.244.203.253 k8s-worker04 <none> <none>
busybox-job-sgzx8 0/1 Completed 0 90s 10.244.203.255 k8s-worker04 <none> <none>
busybox-job-tlpjp 0/1 Completed 0 91s 10.244.203.254 k8s-worker04 <none> <none>
busybox-job-xpkw7 0/1 Completed 0 87s 10.244.203.194 k8s-worker04 <none> <none>
busybox-job-z4kbd 0/1 Completed 0 95s 10.244.203.250 k8s-worker04 <none> <none>
验证pod输出结果
[root@k8s-master01 yaml]# kubectl logs busybox-job-645sx
hello
4、案例3:一次性备份MySQL数据库
编写yaml文件准备创建mysql的pod
[root@k8s-master01 yaml]# vim mysql01.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-test
namespace: default
spec:
selector:
app: mysql-dump
ports:
- name: mysql
port: 3306
clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: db
namespace: default
spec:
selector:
matchLabels:
app: mysql-dump
serviceName: "mysql-test"
template:
metadata:
labels:
app: mysql-dump
spec:
nodeName: k8s-worker01
containers:
- name: mysql
image: mysql:5.7
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: "abc123"
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-data
mountPath: "/var/lib/mysql"
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-data
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs-client"
resources:
requests:
storage: 10Gi
检查语法错误并应用
[root@k8s-master01 yaml]# kubectl apply -f mysql01.yaml --dry-run=client
service/mysql-test created (dry run)
statefulset.apps/db created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f mysql01.yaml
service/mysql-test created
statefulset.apps/db created
验证mysql的pod信息
[root@k8s-master01 yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
db-0 1/1 Running 0 2m14s 10.244.79.86 k8s-worker01 <none> <none>
nfs-client-provisioner-856696f4c-cmlgq 1/1 Running 0 18h 10.244.39.230 k8s-worker03 <none> <none>
[root@k8s-master01 yaml]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 22d
mysql-test ClusterIP None <none> 3306/TCP 2m23s
[root@k8s-master01 yaml]# kubectl describe pod db-0 | tail -8
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Pulling 2m36s kubelet Pulling image "mysql:5.7"
Normal Pulled 2m5s kubelet Successfully pulled image "mysql:5.7" in 30.995149216s
Normal Created 2m5s kubelet Created container mysql
Normal Started 2m5s kubelet Started container mysql
使用kuboard查看
在nfs服务器中查看
[root@k8s-nfs kuberneters]# ls
default-mysql-data-db-0-pvc-477511f5-1dfb-48df-834a-41fc10c6b5b5
[root@k8s-nfs kuberneters]# ls default-mysql-data-db-0-pvc-477511f5-1dfb-48df-834a-41fc10c6b5b5/
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem
编写一次性备份mysql的job类型pod的yaml文件
[root@k8s-master01 yaml]# vim mysql-bk.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: mysql-dump
namespace: default
spec:
template:
metadata:
name: mysql-dump
spec:
restartPolicy: Never
nodeName: k8s-worker01
containers:
- name: mysql-dump
image: mysql:5.7
command: ["/bin/sh","-c","mysqldump --host=mysql-test -uroot -pabc123 --databases mysql > /root/mysql2024.sql"]
volumeMounts:
- name: mysql-db # 修改此处的名称为 "mysql-db"
mountPath: "/root"
volumes:
- name: mysql-db
hostPath:
path: /opt/mysqldump
type: Directory
检查语法错误并应用
[root@k8s-master01 yaml]# kubectl apply -f mysql-bk.yaml --dry-run=client
job.batch/mysql-dump created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f mysql-bk.yaml
job.batch/mysql-dump created
验证pod信息
[root@k8s-master01 yaml]# kubectl get job
NAME COMPLETIONS DURATION AGE
mysql-dump 1/1 1s 3m16s
[root@k8s-master01 yaml]# kubectl get pod mysql-dump-swj55 -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-dump-swj55 0/1 Completed 0 55s 10.244.79.88 k8s-worker01 <none> <none>
[root@k8s-master01 yaml]# kubectl describe pod mysql-dump-swj55 | tail -8
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Pulled 71s kubelet Container image "mysql:5.7" already present on machine
Normal Created 71s kubelet Created container mysql-dump
Normal Started 71s kubelet Started container mysql-dump
在对应的节点对应的目录中查看
[root@k8s-worker01 mysqldump]# pwd
/opt/mysqldump
[root@k8s-worker01 mysqldump]# ls
mysql2024.sql
[root@k8s-worker01 mysqldump]#
七、CronJob介绍及应用
1、CronJob介绍
-
类似于Linux系统的crontab,在指定的时间周期运行相关的任务
-
时间格式:分时日月周
2、CronJob应用案例1:周期性输出字符
编写yaml文件
[root@k8s-master01 yaml]# vim cronjob01.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob1
namespace: default
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template: # 添加这一行,以包含 template 字段
spec:
containers:
- name: hello
image: busybox
args:
- "/bin/sh"
- -c
- date; echo hello kubernetes
restartPolicy: OnFailure
检查语法错误并执行
[root@k8s-master01 yaml]# kubectl apply -f cronjob01.yaml --dry-run=client
cronjob.batch/cronjob1 created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f cronjob01.yaml
cronjob.batch/cronjob1 created
验证pod信息
[root@k8s-master01 yaml]# kubectl get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob1 * * * * * False 0 54s 109s
[root@k8s-master01 yaml]# kubectl get pod cronjob1-2847659
cronjob1-28476596-5m9gs cronjob1-28476597-b94j6
[root@k8s-master01 yaml]# kubectl get pod
NAME READY STATUS RESTARTS AGE
cronjob1-28476596-5m9gs 0/1 Completed 0 69s
cronjob1-28476597-b94j6 0/1 ContainerCreating 0 9s
nfs-client-provisioner-856696f4c-cmlgq 1/1 Running 0 24h
[root@k8s-master01 yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cronjob1-28476596-5m9gs 0/1 Completed 0 98s 10.244.203.195 k8s-worker04 <none> <none>
cronjob1-28476597-b94j6 0/1 Completed 0 38s 10.244.203.198 k8s-worker04 <none> <none>
nfs-client-provisioner-856696f4c-cmlgq 1/1 Running 0 24h 10.244.39.230 k8s-worker03 <none> <none>
[root@k8s-master01 yaml]#
验证pod输出
[root@k8s-master01 yaml]# kubectl logs cronjob1-28476596-5m9gs
Thu Feb 22 09:56:01 UTC 2024
hello kubernetes
[root@k8s-master01 yaml]# kubectl logs cronjob1-28476598-s8wr6
Thu Feb 22 09:58:16 UTC 2024
hello kubernetes
在次查看pod信息,会发现每隔一分钟创建一个次
[root@k8s-master01 yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cronjob1-28476596-5m9gs 0/1 Completed 0 3m3s 10.244.203.195 k8s-worker04 <none> <none>
cronjob1-28476597-b94j6 0/1 Completed 0 2m3s 10.244.203.198 k8s-worker04 <none> <none>
cronjob1-28476598-s8wr6 0/1 Completed 0 63s 10.244.203.199 k8s-worker04 <none> <none>
cronjob1-28476599-65lg8 0/1 ContainerCreating 0 3s <none> k8s-worker04 <none> <none>
nfs-client-provisioner-856696f4c-cmlgq 1/1 Running 0 24h 10.244.39.230 k8s-worker03 <none> <none>
[root@k8s-master01 yaml]# kubectl get cronjobs.batch
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob1 * * * * * False 1 15s 4m10s
3、CronJob应用案例1:周期性备份mysql数据库
3.1、MySQL数据库准备
编写yaml文件
[root@k8s-master01 yaml]# cat mysql01.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-test
namespace: default
spec:
selector:
app: mysql-dump
ports:
- name: mysql
port: 3306
clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: db
namespace: default
spec:
selector:
matchLabels:
app: mysql-dump
serviceName: "mysql-test"
template:
metadata:
labels:
app: mysql-dump
spec:
nodeName: k8s-worker01
containers:
- name: mysql
image: mysql:5.7
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: "abc123"
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-data
mountPath: "/var/lib/mysql"
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-data
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs-client"
resources:
requests:
storage: 10Gi
检查语法并应用
[root@k8s-master01 yaml]# kubectl apply -f mysql01.yaml --dry-run=client
service/mysql-test created (dry run)
statefulset.apps/db created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f mysql01.yaml
service/mysql-test created
statefulset.apps/db created
验证pod信息
[root@k8s-master01 yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
db-0 1/1 Running 0 36s 10.244.79.89 k8s-worker01 <none> <none>
验证永久存储
[root@k8s-nfs ~]# cd /kuberneters/
[root@k8s-nfs kuberneters]# ls
default-mysql-data-db-0-pvc-699b04bb-b9cb-4848-8236-93ac761e7016
[root@k8s-nfs kuberneters]# ls default-mysql-data-db-0-pvc-699b04bb-b9cb-4848-8236-93ac761e7016/
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem
3.2、创建周期性备份MySQL数据pod
编写yaml文件
[root@k8s-master01 yaml]# cat mysql-bk.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: mysql-dump
namespace: default
spec:
schedule: "*/1 * * * *" # 1分钟备份一次
jobTemplate:
spec:
template:
spec:
restartPolicy: Never
nodeName: k8s-worker01
containers:
- name: mysql-dump
image: mysql:5.7
command: ["/bin/sh","-c","mysqldump --host=mysql-test -uroot -pabc123 --databases mysql > /root/mysql`date +%Y%m%d%H%M`.sql"]
volumeMounts:
- name: mysql-bp
mountPath: "/root"
volumes:
- name: mysql-bp
hostPath:
path: /opt/mysqlbk
检查语法错误并应用
[root@k8s-master01 yaml]# kubectl apply -f mysql-bk.yaml --dry-run=client
cronjob.batch/mysql-dump created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f mysql-bk.yaml
cronjob.batch/mysql-dump created
验证pod信息
[root@k8s-master01 yaml]# kubectl get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
mysql-dump */1 * * * * False 1 0s 24s
[root@k8s-master01 yaml]# kubectl get pod
NAME READY STATUS RESTARTS AGE
db-0 1/1 Running 0 107m
mysql-dump-28477936-kgcsj 0/1 Completed 0 110s
mysql-dump-28477937-phlpj 0/1 Completed 0 50s
我们等待一段时间,在对应节点的对应目录中查看
[root@k8s-worker01 ~]# cd /opt/mysqldump
[root@k8s-worker01 mysqlbk]# ll
total 19020
-rw-r--r-- 1 root root 3892459 Feb 23 16:16 mysql202402230816.sql
-rw-r--r-- 1 root root 3892459 Feb 23 16:17 mysql202402230817.sql
-rw-r--r-- 1 root root 3892459 Feb 23 16:18 mysql202402230818.sql
-rw-r--r-- 1 root root 3892459 Feb 23 16:19 mysql202402230819.sql
-rw-r--r-- 1 root root 3892459 Feb 23 16:20 mysql202402230820.sql
评论区