kubernetes核心概念 Controller
一、pod控制器controller
1.1 Controller作用及分类
controller用于控制pod
控制器主要分为:
- Deployments:Deployment是管理应用副本的API对象。管理员只需要在Deployment中描述期望的状态,Deployment就能根据一定的策略将ReplicaSet与Pod更新到管理员预期的状态。Deployment提供了运行Pod的能力,并且为Pod提供滚动升级、伸缩、副本等功能,一般用于运行无状态的应用
- ReplicaSet :副本集,控制pod扩容,裁减
- StatefulSets:StatefulSet用来管理一组Pod集合的部署和扩缩容,并为这些Pod提供持久化存储和持久化标识符。与Deployment不同的是,StatefulSet为每个Pod维护了一个固定的ID。这些Pod是基于相同的模板来创建的,但是不能相互替换,无论怎么调度,每个Pod都有一个固定的ID比如部署mysql,kafka等
- DaemonSet:DaemonSet确保全部Node上运行一个Pod的副本。当有Node加入集群时,会自动为它们新增一个Pod;当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod
- Jobs:Job负责批量处理短暂的一次性任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
- Cronjob:CronJob负责周期性的处理任务,根据Cron表达式定时执行Job。
1.2 Deployment
1.2.1 Replicaset控制器的功能
- 支持新的基于集合的selector(以前的rc里没有这种功能)
- 通过改变Pod副本数量实现Pod的扩容和缩容
1.2.2 Deployment控制器的功能
- Deployment集成了上线部署、滚动升级、创建副本、回滚等功能
- Deployment里包含并使用了ReplicaSet
1.2.3 Deployment用于部署无状态应用
1.2.4 创建deployment类型应用
1, 准备YAML文件
[root@k8s-master1 ~]# vim deployment-nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx # deployment名
spec:
replicas: 1 # 副本集,deployment,pod的个数里使用了replicaset
selector:
matchLabels:
app: nginx # 匹配的pod标签,表示deployment和rs控制器控制带有此标签的pod
template: # 代表pod的配置模板
metadata:
labels:
app: nginx # pod的标签
spec:
nodeName: k8s-worker01 # 调度到k8s-worker1节点
containers: # 以下为pod里的容器定义
- name: nginx
image: nginx:1.19.6
imagePullPolicy: IfNotPresent #先使用本地镜像,在下载镜像
ports:
- containerPort: 80
resources: #内存限制
limits:
memory: "200Mi"
requests:
memory: "100Mi"
livenessProbe:
httpGet: # 使用httpGet方式
port: http # http协议,也可以直接写80端口
path: /index.html # 探测家目录下的index.html
initialDelaySeconds: 3 # 延迟3秒开始探测
periodSeconds: 5 # 每隔5s钟探测一次
2, 应用YAML文件创建deployment
[root@k8s-master1 ~]# kubectl apply -f deployment-nginx.yml
deployment.apps/deploy-nginx created
3, 查看验证
[root@k8s-master1 ~]# kubectl get deployment # deployment可简写成depoly
NAME READY UP-TO-DATE AVAILABLE AGE
deploy-nginx 1/1 1 1 2m3s
[root@k8s-master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-7f64bfc548-wdqs9 1/1 Running 0 91s 192.168.79.101 k8s-worker01 <none> <none>
[root@k8s-master1 ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
deploy-nginx-7f64bfc548 1 1 1 3m38s
[root@k8s-master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-7f64bfc548-wdqs9 1/1 Running 0 7m33s 192.168.79.101 k8s-worker01 <none> <none>
1, 删除pod(**注意: 是删除deployment中的pod**)
~~~powershell
[root@k8s-master01 pod]# kubectl delete pods deploy-nginx-7f64bfc548-wdqs9
pod "deploy-nginx-7f64bfc548-wdqs9" deleted
也就是说**pod的IP不是固定的,IP地址也会变化
既然IP地址不是固定的,所以需要一个固定的访问endpoint给用户,那么这种方式就是service.
1.2.7 pod版本升级
1, 升级前验证nginx版本
[root@k8s-master01 pod]# kubectl describe pods deploy-nginx-7f64bfc548-sm7q7 | grep Image
Image: nginx:1.19.6
Image ID: docker-pullable://nginx@sha256:8e10956422503824ebb599f37c26a90fe70541942687f70bbdb744530fc9eba4
2, 升级为1.20.2版
kubectl set image deployment deploy-nginx nginx=nginx:1.20.2
deployment.apps/deploy-nginx image updated
说明:
deployment deploy-nginx
代表名为deploy-nginx的deployment
可通过下面命令查看是否已经成功
[root@k8s-master01 pod]# kubectl describe pods deploy-nginx-6f7d7cb688-zltbf | grep Image
Image: nginx:1.20.2
Image ID: docker-pullable://nginx@sha256:8e10956422503824ebb599f37c26a90fe70541942687f70bbdb744530fc9eba4
验证 pod
[root@k8s-master01 pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deploy-nginx-6f7d7cb688-zltbf 1/1 Running 0 2m18s
验证版本
root@k8s-master01 pod]# kubectl describe pods deploy-nginx-6f7d7cb688-zltbf | grep Image
Image: nginx:1.20.2
Image ID: docker-pullable://nginx@sha256:8e10956422503824ebb599f37c26a90fe70541942687f70bbdb744530fc9eba4
2, 定义要回退的版本
~~~powershell
[root@k8s-master1 ~]# kubectl rollout history deployment deploy-nginx --revision=1
3, 执行回退
~~~powershell
[root@k8s-master1 ~]# kubectl rollout undo deployment deploy-nginx --to-revision=1
deployment.apps/deploy-nginx rolled back
4, 验证
[root@k8s-master01 pod]# kubectl describe pods deploy-nginx-7f64bfc548-bpt68 | grep Image
Image: nginx:1.19.6
Image ID: docker-pullable://nginx@sha256:8e10956422503824ebb599f37c26a90fe70541942687f70bbdb744530fc9eba4
### 1.2.9 副本扩容
1, 扩容为2个副本
~~~powershell
[root@k8s-master1 ~]# kubectl scale deployment deploy-nginx --replicas=2
deployment.apps/deploy-nginx scaled
2, 查看
[root@k8s-master01 pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deploy-nginx-7f64bfc548-542h2 1/1 Running 0 3s
deploy-nginx-7f64bfc548-bpt68 1/1 Running 0 85s
1.2.10 副本裁减
1, 指定副本数为1进行裁减
[root@k8s-master1 ~]# kubectl scale deployment deploy-nginx --replicas=1
deployment.apps/deploy-nginx scaled
2, 查看验证
[root@k8s-master01 pod]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-7f64bfc548-bpt68 1/1 Running 0 2m20s 192.168.79.104 k8s-worker01
1.2.12 删除deployment
如果使用 kubectl delete deployment deploy-nginx
命令删除deployment,那么里面的pod也会被自动删除
二、pod控制器Controller进阶
2.1 DaemonSet
2.1.1 DaemonSet介绍
DaemonSet是Kubernetes中的一种控制器对象,它的主要作用是在Kubernetes集群的每个节点上运行一个Pod的副本。这意味着,当DaemonSet被创建时,系统会自动调度Pod到所有符合条件的节点上,确保每个节点上都有且仅有一个该Pod的实例。
DaemonSet在Kubernetes中有着广泛的应用场景,例如部署网络插件的Agent组件、存储插件的Agent组件、监控组件和日志组件等。这些组件都需要在每个节点上运行,以处理节点上的容器网络、挂载远程存储目录、操作容器的Volume目录、收集监控信息和日志等任务。
DaemonSet的特性
1.每个节点运行一个实例:DaemonSet会在集群的每个节点上自动创建一个Pod的副本,并确保每个节点上都有一个Pod在运行。这种特性使得DaemonSet特别适合用于部署需要在每个节点上运行的守护进程应用程序。
2.节点生命周期绑定:当新的节点加入到Kubernetes集群时,DaemonSet会自动在该节点上运行所需的Pod副本。相反,当节点从集群中移除或被标记为不可调度时,DaemonSet会移除或清理与之关联的Pod。
3.节点选择性部署:DaemonSet支持使用NodeSelector、NodeAffinity等机制来精细控制Pod在哪些节点上运行。这使得用户可以根据需要,将Pod部署在具有特定标签的节点上
2.1.2 DaemonSet应用案例
1, 编写YAML文件
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.6
imagePullPolicy: IfNotPresent
3, 验证
[root@k8s-master01 pod]# kubectl get daemonset -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
nginx-daemonset 3 3 2 3 2 <none> 92s nginx nginx:1.19.6 app=nginx
~~~powershell
[root@k8s-master01 pod]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-daemonset-cmxdt 1/1 Running 0 114s 192.168.79.111 k8s-worker01 <none> <none>
nginx-daemonset-pbd6s 1/1 Running 0 114s 192.168.32.157 k8s-master01 <none> <none>
nginx-daemonset-wkf68 0/1 ImagePullBackOff 0 114s 192.168.69.230 k8s-worker02 <none> <none>
k8s集群中每个节点都会运行一个pod
2.2 Job
2.2.1 Job介绍
- 对于非耐久性任务,比如压缩文件,任务完成后,pod需要结束运行,不需要pod继续保持在系统中,这个时候就要用到Job。
- Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
特点:
创建Pod运行特定任务,确保任务运行完成
任务运行期间节点异常时会自动重新创建Pod
支持并发创建Pod任务数和指定任务数
1, 编写YAML文件
[root@master ~]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: example-job
spec:
template:
metadata:
name: example-job-pod
spec:
containers:
- name: c
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 30']
restartPolicy: OnFailure 失败后重启
2, 应用YAML文件创建job
[root@master ~]# kubectl apply -f job.yml
job.batch/example-job created
3, 验证
[root@k8s-master1 ~]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
example-job 1/1 11s 18s
[root@k8s-master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
example-job-tjq9b 0/1 Completed 0 27s
Completed状态,也不再是ready状态
2.3 CronJob
2.3.1 CronJob介绍
在 k8s 中,CronJob 是一种用于定期执行任务的资源对象。它基于 Cron 表达式,允许您在指定的时间间隔内自动运行容器化的任务
CronJob 特点
在现代的云原生应用中,定时任务是一个非常重要的组成部分。k8s 提供了一种称为 CronJob 的机制,可以让我们方便地定义和管理定时任务。
CronJob 管理基于时间的 job,即:
在给定时间点只运行一次
周期性地在给定时间点运行
一个 CronJob 对象类似于 crontab(cron table)文件中的一行。它根据指定的预定计划周期性地运行一个 Job,格式可以参考 cron。
典型的用法如下所示:
在给定的时间点调度 Job 运行
创建周期性运行的 Job,例如:数据库备份、发送邮件
2.3.2 CronJob应用案例
1, 编写YAML文件
[root@k8s-master1 ~]# vim cronjob.yml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob1
spec:
schedule: "* * * * *" # 分时日月周
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo hello kubernetes
imagePullPolicy: IfNotPresent
restartPolicy: OnFailure
2, 应用YAML文件创建cronjob
[root@k8s-master1 ~]# kubectl apply -f cronjob.yml
cronjob.batch/cronjob1 created
3, 查看验证
[root@k8s-master1 ~]# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob1 * * * * * False 0 <none> 21s
[root@k8s-master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
cronjob-1564993080-qlbgv 0/1 Completed 0 2m10s
cronjob-1564993140-zbv7f 0/1 Completed 0 70s
cronjob-1564993200-gx5xz 0/1 Completed 0 10s
看AGE时间,每分钟整点执行一次