文章目录
一、工作负载控制器是什么
工作负载控制器(Workload Controllers)是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。
常用工作负载控制器:
- Deployment:无状态应用部署
- StatefulSet:有状态应用部署
- DaemonSet:确保所有Node运行同一个Pod
- Job:一次性任务
- Cronjob:定时任务
控制器的作用:
- 管理Pod对象
- 使用标签与Pod关联
- 控制器实现了Pod的运维,例如滚动更新、伸缩、副本管理、维护Pod状态等
二、Deployment详解
2.1 Deployment的功能:
- 管理Pod和ReplicaSet
- 具有上线部署、副本设定、滚动升级、回滚等功能
- 提供声明式更新,例如只更新一个新的Image
应用场景:网站、API、微服务
2.2 Deployment:部署
第一步:部署镜像
- kubectl apply -f xxx.yaml
- kubectl create deployment web --image=nginx:1.15
实例:
[root@master ~]# cat test.yaml
---
apiVersion: apps/v1 // api版本
kind: Deployment // 类型
metadata:
name: amu // 容器名字
namespace: default // 默认名称空间
spec:
replicas: 3 // 复制成3个容器
selector:
matchLabels:
app: busybox // 标签
template:
metadata:
labels:
app: busybox // 标签
spec:
containers:
- name: b1
image: busybox // 使用镜像busybox
command: ["/bin/sh","-c","sleep 9000"] // 一直运行
[root@master ~]# kubectl apply -f test.yaml
deployment.apps/amu created
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
amu-864fd4fb54-4hz2h 1/1 Running 0 57s
amu-864fd4fb54-j9ht4 1/1 Running 0 57s
amu-864fd4fb54-w485p 0/1 ContainerCreating 0 57s
2.3 Deployment:滚动升级
第二步:应用升级(更新镜像三种方式)
- kubectl apply -f xxx.yaml
- kubectl set image deployment/web nginx=nignx:1.16
- kubectl edit deployment/web
滚动升级:K8s对Pod升级的默认策略,通过使用新版本Pod逐步更新旧版本Pod,实现停机发布,用户无感知。
滚动升级在K8s中的实现:
- 1个Deployment
- 2个ReplicaSet
滚动更新策略:
spec:
replicas: 3
revisionHistoryLimit: 10 # RS历史版本保存数量
selector:
matchLabels:
app: web
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavaliable: 25%
type: RollingUpdate
- maxSurge:滚动更新过程中最大Pod副本数,确保在更新时启动的Pod数量比期望(replicsa)Pod数量最大多出25%
- maxUnavailable:滚动更新过程中最大不可用Pod副本数,确保在更新时最大25%Pod数量不可用,即确保75%Pod数量是可用状态
实例:
// 本地有镜像
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gaofan1225/httpd v0.2 f61bbd041ba4 11 days ago 89.2MB
// 创建四个httpd容器。名字都叫web
[root@master ~]# cat test2.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: default
spec:
replicas: 4
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: gaofan1225/httpd:v0.2
imagePullPolicy: IfNotPresent
[root@master ~]# kubectl apply -f test2.yaml
deployment.apps/web created
[root@master ~]# kubectl get pods
web-5d688b9745-7gx4g 1/1 Running 0 100s
web-5d688b9745-9hnxz 1/1 Running 0 100s
web-5d688b9745-ft6w9 1/1 Running 0 100s
web-5d688b9745-vmcbv 1/1 Running 0 100s
// 再次编写test2.yaml文件,设置maxSurge、maxUnavaliable
[root@master ~]# cat test2.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: default
spec:
replicas: 4
strategy: // 策略
rollingUpdate: // 滚动更新
maxSurge: 25% // 最大可超出25% #这两个参数可以一起使用也可以分开使用,根据需求决定
maxUnavailable: 25% // 最大不可用25%
type: RollingUpdate
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: gaofan1225/httpd:v0.2
imagePullPolicy: IfNotPresent
// 应用
[root@master ~]# kubectl apply -f test2.yaml
deployment.apps/web configured
// 查看发现暂未发生变化
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-5d688b9745-7gx4g 1/1 Running 0 10m
web-5d688b9745-9hnxz 1/1 Running 0 10m
web-5d688b9745-ft6w9 1/1 Running 0 10m
web-5d688b9745-vmcbv 1/1 Running 0 10m
// 我们去test2.yaml里面修改一下镜像
#其余内容不变
[root@master ~]# vim test2.yaml
image: httpd // 镜像修改就会更新
// 修改完之后应用
[root@master ~]# kubectl apply -f test2.yaml
deployment.apps/web configured
// 发现停止了三个旧的web,启动了两个新的web和一个旧的web,还有两个新web正在创建
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-5d688b9745-7gx4g 1/1 Terminating 0 10m
web-5d688b9745-9hnxz 0/1 Running 0 22m
web-5d688b9745-ft6w9 0/1 Terminating 0 22m
web-5d688b9745-vmcbv 0<
文章评论