1. pod分类
- Pod 的分类:
自主式 Pod:Pod 退出后不会被创建
控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目
2. 控制器类型
- 控制器类型
- Replication Controller和ReplicaSet(RS一般不会单独用,一般都是和deployment一起使用)
Deployment
DaemonSet
StatefulSet
Job
CronJob
HPA全称Horizontal Pod Autoscaler
- Replication Controller和ReplicaSet
ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet。
ReplicaSet 和 Replication Controller 的唯一区别是选择器的支持,ReplicaSet 支持新的基于集合的选择器需求。
ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。
虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制。
- deployment -> ReplicaSet -> pod ##控制流程
- Deployment
Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法。
典型的应用场景:
用来创建Pod和ReplicaSet
滚动更新和回滚
扩容和缩容
暂停与恢复
- DaemonSet
DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
DaemonSet 的典型用法:
在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。
在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash。
在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、zabbix agent等
一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种类型的 daemon 使用。
一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet,但具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求。
- StatefulSet
StatefulSet 是用来管理有状态应用的工作负载 API 对象。实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,称为“有状态应用”
StatefulSet 用来管理 Deployment 和扩展一组 Pod,并且能为这些 Pod 提供*序号和唯一性保证*。
StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:
稳定的、唯一的网络标识符。
稳定的、持久的存储。
有序的、优雅的部署和缩放。
有序的、自动的滚动更新。
- Job
执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束。
- CronJob
Cron Job 创建基于时间调度的 Jobs。
一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。
- HPA
根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放。
2.1 ReplicaSet控制器
[root@server2 ~]# vim rs.yml
[root@server2 ~]# cat rs.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-example
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: myapp:v1
[root@server2 ~]# kubectl apply -f rs.yml
replicaset.apps/replicaset-example created
[root@server2 ~]# kubectl get rs ##查看rs
NAME DESIRED CURRENT READY AGE
replicaset-example 3 3 3 18s
[root@server2 ~]# kubectl get pod ##查看pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 1 7h40m
replicaset-example-hzhn9 1/1 Running 0 31s
replicaset-example-jwt64 1/1 Running 0 31s
replicaset-example-tb754 1/1 Running 0 31s
[root@server2 ~]# kubectl delete rs replicaset-example ##做完实验释放资源
replicaset.apps "replicaset-example" deleted
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 1 7h47m
replicaset-example-hzhn9 0/1 Terminating 0 7m16s
replicaset-example-jwt64 0/1 Terminating 0 7m16s
replicaset-example-tb754 0/1 Terminating 0 7m16s
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 1 7h47m
2.2 deployment控制器
[root@server2 ~]# vim rs.yml
[root@server2 ~]# cat rs.yml
apiVersion: apps/v1
kind: Deployment ##deployment控制器
metadata:
name: deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx ##此yml文件创建的pod全部标签都是app=nginx,此标签的pod可以被统一控制
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: myapp:v1
[root@server2 ~]# kubectl apply -f rs.yml ##创建
deployment.apps/deployment created
[root@server2 ~]# kubectl get pod ##查看pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 1 7h49m
deployment-6456d7c676-mfrxb 1/1 Running 0 12s
deployment-6456d7c676-xlxw5 1/1 Running 0 12s
deployment-6456d7c676-xn2dp 1/1 Running 0 12s
## deployment -> rs控制器 -> pod
[root@server2 ~]# kubectl get pod
[root@server2 ~]# kubectl get pod --show-labels ##显示所有标签
[root@server2 ~]# kubectl delete -f service.yml ##删除原来服务,方便实验
service "myservice" deleted
[root@server2 ~]# kubectl expose deployment deployment --port=80 ##暴露80端口
service/deployment exposed
[root@server2 ~]# kubectl describe svc deployment ##查看详细信息,有三个pod节点ip
## 清理环境
[root@server2 ~]# kubectl delete -f rs.yml
[root@server2 ~]# kubectl delete svc deployment
[root@server2 ~]# kubectl delete pod/deployment-6456d7c676-mfrxb
[root@server2 ~]# kubectl get all #查看是否清理干净
2.3 DaemonSet控制器
[root@server2 ~]# vim daemonset.yml
[root@server2 ~]# cat daemonset.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-example
labels:
k8s-app: zabbix-agent
spec:
selector:
matchLabels:
name: zabbix-agent
template:
metadata:
labels:
name: zabbix-agent
spec:
containers:
- name: zabbix-agent
image: zabbix-agent
[root@server2 ~]# kubectl apply -f daemonset.yml ##执行之后会在每一个节点上都运行一个zabbix
[root@server2 ~]# kubectl get pod
[root@server2 ~]# kubectl get pod -o wide ##发现server3和server4上都运行有zabbix
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
daemonset-example-69mgd 1/1 Running 0 2m31s 10.244.1.9 server3 <none> <none>
daemonset-example-btstx 1/1 Running 0 2m31s 10.244.2.21 server4 <none> <none>
demo 1/1 Running 1 9h 10.244.1.3 server3 <none>
##环境清理
[root@server2 ~]# kubectl delete -f daemonset.yml
2.4 Job
[root@server2 ~]# vim job.yml
[root@server2 ~]# cat job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl ##server1上拉取上传到仓库
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] ##显示pi后面2000位小数
restartPolicy: Never ##不会重启
backoffLimit: 4 ##出错次数限制为4次
[root@server2 ~]# kubectl create -f job.yml
job.batch/pi created
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 1 9h
pi-hjkcl 0/1 ContainerCreating 0 9s
[root@server2 ~]# kubectl describe pod pi-hjkcl
[root@server2 ~]# kubectl logs pi-hjkcl ##查看生成的日志信息
##清理环境
[root@server2 ~]# kubectl delete -f job.yml
2.5 CronJob
[root@server2 ~]# vim cronjob.yml
[root@server2 ~]# cat cronjob.yml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busyboxplus
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
[root@server2 ~]# kubectl create -f cronjob.yml
cronjob.batch/hello created
[root@server2 ~]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/demo 1/1 Running 1 9h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d5h
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob.batch/hello */1 * * * * False 0 <none> 10s
##间隔1分钟后
[root@server2 ~]# kubectl get pod ##发生了调度
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 1 9h
hello-1613912160-z66tx 0/1 Completed 0 3s
[root@server2 ~]# kubectl get all ##发生了调度
NAME READY STATUS RESTARTS AGE
pod/demo 1/1 Running 1 9h
pod/hello-1613912160-z66tx 0/1 Completed 0 5s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d5h
NAME COMPLETIONS DURATION AGE
job.batch/hello-1613912160 1/1 1s 5s
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob.batch/hello */1 * * * * False 1 14s 68s
[root@server2 ~]# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 42s 5m36s
[root@server2 ~]# kubectl logs hello-1613912160-z66tx
Sun Feb 21 12:56:10 UTC 2021
Hello from the Kubernetes cluster
[root@server2 ~]# kubectl delete cronjob hello ##可以通过单条命令删除,时间任务名称要看对
[root@server2 ~]# kubectl delete -f cronjob.yml ##也可以通过文件删除