Pod通过控制器实现应用的运维,如伸缩、升级等,控制器决定了创建pod资源的方式和类型,在集群上管理和运行容器的对象通过label-selector 相关联。
控制器 又称之为工作负载,分别包含以下类型控制器:
1: Deployment
2: StatefulSet
3: DaemonSet
4:Job
5: CronJob
特点:
部署无状态应用,只关心数量,不论角色等,称无状态
管理Pod和ReplicaSet
具有上线部署、副本设定、滚动升级、回滚等功能
提供声明式更新,例如只更新一个新的image
应用场景: web 服务
示例:
# vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
Replicaset是副本数,回滚就是通过此来实现
创建资源
# kubectl create -f nginx-deployment.yaml
查看创建的pod资源、控制器和副本
# kubectl get pods,deploy,rs
查看历史版本
# kubectl rollout history deployment/nginx-deployment
特点:
部署有状态应用
解决Pod独立生命周期,保持Pod启动顺序和唯一性
稳定,唯一的网络标识符,持久存储(例如: etcd 配置文件,节点地址发生变化,将无法使用)
有序,优雅的部署和扩展、删除和终止(例如: mysql 主从关系,先启动主,再启动从)
有序,滚动更新
应用场景: 数据库
有状态和无状态的区别:
无状态:
1)deployment认为所有的pod都是一样的
2)不用考虑顺序的要求
3)不用考虑在哪个node节点上运行
4)可以随意扩容和缩容
有状态:
1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd, zookeeper
2)实例之间不对等的关系,以及依靠外部存储的应用。
常规service和无头服务区别
service: 一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
Headless service无头服务, 不需要cluster-IP,直接绑定具体的Pod的IP(当Pod的IP地址是动态变化时,所以常用于绑定DNS访问)
示例1:
先创建DNS资源
# cd demo
# rz -E
把coredns.yaml复制过来
# kubectl create -f coredns.yaml
# kubectl get pods -n kube-system
# vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: dns-test
spec:
containers:
- name: busybox
image: busybox:1.28.4
args:
- /bin/sh
- -c
- sleep 36000
restartPolicy: Never
创建dns资源
# kubectl create -f pod3.yaml
# kubectl get pods
再用statefulset控制器类型 创建nginx pod资源,并创建无头服务资源
# vim sts.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: nginx-statefulset
namespace: default
spec:
serviceName: nginx
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
# kubectl create -f sts.yaml
有状态化创建的pod,是自动进行打标签进行区分
# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-statefulset-0 1/1 Running 0 30s
nginx-statefulset-1 1/1 Running 0 17s
nginx-statefulset-2 1/1 Running 0 9s
# kubectl get pods,svc
验证DNS解析
# kubectl exec -it dns-test.sh
解析pod的唯一域名和自身的IP
查看各个pod资源的IP地址
DNS解析出各个pod的IP 地址
总结:
StatefulSet与Deployment区别:
StatefulSet创建的pod是有身份的!
身份三要素:
域名 nginx-statefulset-0.nginx
主机名 nginx-statefulset-0
存储 (PVC)
特点:
在每一个Node上运行一个Pod
新加入的Node也同样会自动运行一个Pod
应用场景:Agent、监控
https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
官方案例(监控)
示例:
用DaemonSet 控制器类型创建nginx pod资源,没有指定副本replicats,它会根据node节点的个数创建,如果再新加一个node节点,也会给新node节点创建pod
# vim ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
# kubectl apply -f ds.yaml
DaemonSet会在每个node节点都创建一个Pod
# kubectl get pods
# kubectl get pods -o wide
如果再新加一个node节点,也会给新node节点创建pod
Job分为普通任务(Job)和定时任务(CronJob)
一次性执行
应用场景:离线数据处理,视频解码等业务
https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/
官方案例
应用大数据场景
示例:
用job控制器类型创建资源,执行算圆周率的命令,保持后2000位,创建过程等同于在计算
,重试次数默认是6次,修改为4次,当遇到异常时Never状态会重启,所以要设定次数。
# vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
在node节点提前下载perl镜像,因为镜像比较大所以提前下载好
node1 node2节点:
# docker pull perl
创建过程等同于在计算
# kubectl apply -f job.yaml
job.batch/pi created
查看状态
# kubectl get pods
# kubectl describe pod pi-tkdlc
查看日志,看计算结果,结果输出到控制台
# kubectl logs pi-tkdlc
3.141592653589793.............................................共2000位
周期性任务,像Linux的Crontab一样。
周期性任务
应用场景:通知,备份
https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/
官方案例
示例:
每隔一分钟输出一条信息,打印hello
# vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
busybox 是linux内核镜像
# kubectl create -f cronjob.yaml
# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 25s
# kubectl get pods
查看日志,内容输出到控制台
# kubectl logs hello-1581917340-dzxbj
Mon Feb 17 05:29:09 UTC 2020
Hello from the Kubernetes cluster
等待一分钟后又会再执行一次
# kubectl get pods
# kubectl logs hello-1581917400-nkb72
最后删除资源,不然第二天服务器宕机
# kubectl delete -f cronjob.yaml