文章目录
引言
控制器:又称之为工作负载,分别包含以下类型控制器
- Deployment(无状态)
- StatefulSet(有状态)
- DaemonSet(只要)
- Job
- CronJob
Pod与控制器之间的关系
- controllers:在集群上管理和运行容器的对象通过label-selector相关联
- Pod通过控制器实现应用的运维,如伸缩,升级等
1、Deployment(无状态)
- 部署无状态应用
- 管理Pod和ReplicaSet
- 具有上线部署、副本设定、滚动升级、回滚等功能
- 提供声明式更新,例如只更新一个新的Image
- 应用场景:web服务
[root@master ~]# 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
kubectl create -f nginx-deployment.yaml
kubectl get pods,deploy,rs
查看控制器
kubectl edit deployment/nginx-deployment
查看历史版本
kubectl rollout history deployment/nginx-deployment
2、SatefulSet(有状态)
- 部署有状态应用
- 解决Pod独立生命周期,保持Pod启动顺序和唯一性
- 稳定,唯一的网络标识符,持久存储(例如:etcd配置文件,节点地址发生变化,将无法使用)
- 有序,优雅的部署和扩展、删除和终止(例如:mysql主从关系,先启动主,再启动从)
- 有序,滚动更新
- 应用场景:数据库
2.1 有状态与无状态的区别
无状态
- deployment认为所有的pod都是一样的
- 不用考虑顺序的要求
- 不用考虑在哪个node节点上运行
- 可以随意扩容和缩容
有状态
- 实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
- 实例之间不对等的关系,以及依靠外部存储的应用
2.2 常规service和无头服务区别
- service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
- Headless service :无头服务,不需要cluster-IP,直接绑定具体的Pod的IP
2.2.1 Service类型
- Cluster_IP
- NodePort:使用Pod所在节点的IP和其端口范围
- Headless
- HostPort(ingress、kubesphere)
- LoadBalance负载均衡(F5硬件负载均衡器)
ps:k8s暴露方式主要就3种:ingress loadbalance(SLB/ALB K8S集群外的负载均衡器、Ng、harproxy、KONG、traefik等等) service
vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
labels:
app: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx
[root@master ~]# kubectl create -f nginx-service.yaml
service/nginx-svc created
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d7h
nginx-svc NodePort 10.105.83.81 <none> 80:30676/TCP 2s
在node节点操作,查看集群间通讯
2.2.2 headless方式
因为Pod动态IP地址,所以常用于绑定DNS访问—来尽可能固定Pod的位置
[root@master demo]# vim headless.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
kubectl apply -f headless.yaml
kubectl get svc
再定义一个pod
[root@master demo]# vim dns-test.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 dns-test.yaml
kubectl get svc
解析kubernetes和nginx-svc名称
kubectl exec -it dns-test sh
创建StatefulSet.yaml文件
vim statefulSet.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
清理所有pod
kubectl delete -f .
kubectl create -f statefulSet.yaml
kubectl get pods,svc
解析pod的唯一域名和自身的ip
kubectl apply -f dns-test.yaml
kubectl exec -it dns-test sh
nslookup nginx-statefulset-0.nginx
nslookup nginx-statefulset-1.nginx
nslookup nginx-statefulset-2.nginx
总结
StatefulSet与Deployment区别:有身份的!
身份三要素:
- 域名 nginx-statefulset-0.nginx
- 主机名 nginx-statefulset-0
- 存储(PVC)
3、DaemonSet(守护进程集)
- 在每一个Node上运行一个Pod
- 新加入的Node也同样会自动运行一个Pod
- 应用场景:Agent
[root@master demo]# vim daemonSet.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
DaemonSet会在每个node节点都创建一个Pod
kubectl apply -f daemonSet.yaml
kubectl get pods
4、Job
- Job分为普通任务(Job)和定时任务(CronJob)
- 一次性执行
- 应用场景:离线数据处理,视频解码等业务
示例:
重试次数默认是6次,修改为4次,当遇到异常时Never状态会重启,所以要设定次数。
[root@master demo]# vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
在node1节点下载perl镜像,因为镜像比较大所以提前下载好
docker pull perl
创建
查看到完成状态
结果输出到控制台
清除job资源
kubectl get job
kubectl delete -f job.yaml
5、CronJob
- 周期性任务,像Linux的Crontab一样。
- 周期性任务
- 应用场景:通知,备份
示例:
[root@master demo]# vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: lcdb
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: lcdb
image: busybox
args:
- /bin/sh
- -c
- date; echo lcdb from the Kubernetes cluster
restartPolicy: OnFailure
kubectl apply -f cronjob.yaml
kubectl get pod
kubectl get cronjob
清除cronjob资源
kubectl delete -f cronjob.yaml