Kubernetes控制器
了解控制器
kubernetes控制器会监听资源的创建、更新、删除事件,并触发Reconcile调用函数作为响应,Reconcile是一个使用资源对象的命名空间和资源对象名称来调用的函数,使得资源对象得实际状态与资源清单中定义的状态保持一致。
ReplicaSet
可以创建多副本的控制器,用于高可用高并发场景。
资源清单编写如下:
# nginx-rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-rs
namespace: default
spec:
replicas: 3 #期望的Pod副本数量,默认值为1
selector: #Label Selector,必须匹配Pod模板中的标签
matchLabels:
app: nginx
template: # Pod 模板
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.23.1
ports:
- containerPort: 80
ReplicaSet控制器删除了Pod并不会重新创建一个新的Pod,虽然可以高并发作用,但是没有自动恢复的能力,不能高可用,这是ReplicaSet控制器的弊端。
Deployment
Deployment控制器其实就是在ReplicaSet控制器之上的控制器,在平时应用中一般我们不会直接去使用ReplicaSet控制器,而是使用Deployment控制去操控ReplicaSet控制器,Deployment控制器在它的基础上新增了Pod的滚动更新功能。
资源清单编写如下:
#nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.23.1
ports:
- containerPort: 80
可以看出比起ReplicaSet配置清单中多了如下选项:
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
minReadySeconds:表示Kubernetes在等待设置的时间后才进行升级,如果没有设置该值,Kubernetes 会假设该容器启动起来后就提供服务了
type: RollingUpdate:其中type类型分为RollingUpdate和Recreate,RollingUpdate为滚动更新,Recreate则是执行全部重新创建
maxSurge:升级过程中最多可以比原先设置多出的Pod数量,可以是数字也可以是百分比
maxUnavailable:升级过程中最多有多少个 Pod 处于无法提供服务的状态
DarmonSet
DaemonSet用于在每个 Kubernetes 节点中将守护进程的副本作为后台进程运行,说白了就是在每个节点部署一个 Pod副本
资源清单编写如下:
# nginx-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-ds
namespace: default
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.23.1
name: nginx
ports:
- name: http
containerPort: 80
应用场景大概如下:
- 节点监控守护进程,如 Prometheus 监控集群,可以在每个节点上运行一个 node-exporter进程来收集监控节点的信息;
- 日志收集守护程序,如fluentd或logstash,在每个节点上运行以收集容器的日志
- 节点网络插件,比如flannel、calico,在每个节点上运行为 Pod 提供网络服务。
注意:也可以结合污点来实现某些需求和部署调整
Job和Cronjob
Job控制器:
一般用来创建一个任务,我们定义一个 Job 来执行一个倒计时的任务
资源清单编写如下:
# job-demo.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec:
parallelism: 2
completions: 8
template:
spec:
restartPolicy: OnFailure #执行失败则重启,要不就是死循环,job只适合执行一次
containers:
- name: counter
image: busybox
command:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
parallelism:定义了一个Job在任意时间最多可以有多少个 Pod 同时运行
completions:定义Job至少要完成任务的Pod数量
restartPolicy:重启策略一般这里会用Never(无论成功与否都不重启)和OnFailure(运行失败则重启)
Cronjob控制器:
就是在Job的基础上加上了时间调度,我们可以在给定的时间点运行一个任务,也可以周期性地在给定时间点运行
资源清单编写如下:
# cronjob-demo.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob-demo
spec:
schedule: "*/1 * * * *"
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: hello
image: busybox
args:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
定时格式的编写和linux中的crontab差不多
successfulJobsHistoryLimit:指定可以保留多少成功完成的job
failedJobsHistoryLimit:指定可以保留多少失败的job
StatefulSet
StatefulSet用于部署有状态服务的控制器
Headless Service:
对于DNS的两种情况:
- 1.第一种就是普通的 Service,我们访问"mysvc.mynamespace.svc.cluster.local"的时候是通过集群中的 DNS 服务解析到的 mysvc 这个 Service 的 cluster IP 的。
- 2.第二种情况就是 Headless Service,对于这种情况,我们访问"mysvc.mynamespace.svc.cluster.local"的时候是直接解析到的 mysvc 代理的某一个具体的 Pod 的 IP 地址,中间少了 cluster IP 的转发,这就是二者的最大区别,Headless Service 不需要分配一个 VIP,而是可以直接以 DNS 的记录方式解析到后面的 Pod 的 IP 地址。
资源清单编写如下:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
labels:
app: nginx
spec:
ports:
- name: http
port: 80
clusterIP: None
selector:
app: nginx
注意:定义上和普通的 Service 几乎一致, 只是他的'clusterIP=None',所以,这个 Service 被创建后并不会被分配一个 cluster IP,而是会以 DNS 记录的方式暴露出它所代理的 Pod
1.创建pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /tmp/pv001
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /tmp/pv002
2.编写StatefulSet 资源清单
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
namespace: default
spec:
serviceName: "nginx"
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.23.1
ports:
- name: web
containerPort: 80
volumeMounts:
- name: pv-test
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: pv-test
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
高级控制器HPA
HPA 通过监控分析一些控制器控制的所有 Pod 的负载变化情况来确定是否需要调整 Pod 的副本数量。
补充说明:HPA是在Deployment控制器之上的控制器,主要通过控制Deployment来管理控制Pod。
资源清单编写如下:
1.先创建一个deployment限制cpu或者memory
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.23.1
name: nginx
resources:
limits:
cpu: 2000m
memory: 4Gi
requests:
cpu: 2000m
memory: 4Gi
ports:
- name: http
containerPort: 80
2.编写HPA资源清单:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: nginx-deploy-hpa
namespace: default
spec:
maxReplicas: 3
minReplicas: 5
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deploy
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 30