文章目录
1. 什么是controller
- 在集群上管理和运行容器的对象,它是实际存在的,不像pod是抽象的
- 可以进行有状态应用部署和无状态应用部署
2. Pod和Controller的关系
- Pod是通过Controller实现应用的运维,比如伸缩,滚动升级等等
- Pod和Controller通过label建立关系
3. 五种控制器类型
3.1 deployment
3.1.1 特点
- 部署无状态的应用。如nginx,web服务,微服务等
- 管理Pod和ReplicaSet
- 具有上线部署、副本设定、滚动升级、回滚等功能
3.1.2 示例
- 生成yml文件
kubectl create deployment web --image=nginx #不能做复用,只能做测试
kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml #生成yaml文件样板
web.yml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
replicas: 1
selector: # 与下面的labels完成匹配
matchLabels:
app: web
strategy: {}
template:
metadata:
creationTimestamp: null
labels: # 完成匹配
app: web
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}
- 使用yaml部署应用
[root@k8sMaster ~]# kubectl apply -f web.yaml
deployment.apps/web created
[root@k8sMaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-5dcb957ccc-2fvt9 0/1 ContainerCreating 0 6s
- 对外发布(暴露对外端口号)
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml
kubectl apply -f web1.yaml
- 查看暴露端口号并访问
[root@k8sMaster ~]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/web-5dcb957ccc-2fvt9 1/1 Running 0 12m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 20d
service/web1 NodePort 10.97.135.244 <none> 80:30800/TCP 5m47s
30800为对外暴露端口
3.1.3 应用升级回滚和弹性伸缩
- 应用升级
应用升级时,先下载镜像,当pod启动后,会替换掉旧版本
kubectl set image deployment web nginx=nginx:1.15
- 查看升级版本
[root@k8sMaster ~]# kubectl rollout history deployment web
deployment.apps/web
REVISION CHANGE-CAUSE
1 <none>
2 <none>
- 查看升级状态
[root@k8sMaster ~]# kubectl rollout status deployment web
deployment "web" successfully rolled out
这是升级成功的显示
- 回滚到上一个版本
[root@k8sMaster ~]# kubectl rollout undo deployment web
deployment.apps/web rolled back
- 回滚到指定版本
[root@k8sMaster ~]# kubectl rollout undo deployment web --to-revison=2
deployment.apps/web rolled back
- 弹性伸缩
[root@k8sMaster ~]# kubectl scale deployment web --replicas=10
deployment.apps/web scaled
3.2 StatefulSet
3.2.1 特点
部署有状态应用
解决Pod独立生命周期,保持Pod启动顺序和唯一性
稳定,唯一的网络标识符,持久存储(例如: etcd 配置文件,节点地址发生变化,将无法使用)
有序,优雅的部署和扩展、删除和终止(例如: mysql 主从关系,先启动主,再启动从)
有序,滚动更新
应用场景: 数据库
3.2.2 无状态和有状态区别
-
无状态:
(1) deployment认为所有的pod都是一样的
(2) 不用考虑顺序的要求
(3) 不用考虑在哪个node节点上运行
(4) 可以随意扩容和缩容 -
有状态:
(1) 实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd, zookeeper
(2) 实例之间不对等的关系,以及依靠外部存储的应用。
3.2.3 部署有状态应用
常规service和无头服务区别:
(1) service: 一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
(2) Headless service无头服务, 不需要cluster-IP,直接绑定具体的Pod的IP(当Pod的IP地址是动态变化时,所以常用于绑定DNS访问)
注意无头service(即:clusterIP:None)
创建开始
查看pod,有三个pod,每个都是唯一名称
查看创建无头的service,这里为None表示无头service
3.3 DaemonSet
3.3.1 特点
- 部署守护进程
- 确保所有的node运行同一个pod
应用场景:Agent、监控
3.3.2 示例
用DaemonSet 控制器类型创建nginx pod资源,没有指定副本replicats,它会根据node节点的个数创建,如果再新加一个node节点,也会给新node节点创建pod
3.4 Job普通任务
3.4.1 特点
应用场景:离线数据处理,视频解码等业务
3.4.2 示例
用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位
3.5 CronJob定时任务
3.5.1 特点
周期性任务,像Linux的Crontab一样。
周期性任务
应用场景:通知,备份
3.5.2 示例
每隔一分钟输出一条信息,打印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 <none> 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
4. StatefulSet与Deployment区别
StatefulSet创建的pod是有身份的,有唯一标识的。
- 每个pod都有唯一的主机名
- 唯一域名生成规则:格式:主机名.service名称.名称空间.svc.cluster.local【例如:
】
参考博客:https://blog.csdn.net/weixin_45691464/article/details/106326605