在k8s中,按照pod的创建方式可以将其分为两类:
- 自主式pod:k8s自己创建出来的pod,删除就会消失
- 控制器创建的pod:通过控制器创建的pod,这种pod删除了后还会自动创建
在k8s中,有很多类型的pod控制器,每种都有自己适合的场景,常见的有下面这些:
- replicaset:保证指定数量的pod运行,支持pod数量变更
- deployment:通过replicaset来控制pod,并支持滚动升级,版本后退
- horizontal pod autoscaler:根据集群负载自动调整pod,并支持滚动升级,版本回退
保证一定数量pod正常运行,持续监听pod的运行状态,一旦pod发生故障,就会重启和重建,支持pod数量的扩缩容和版本镜像的升级
[root@master ~]# cat repolicaset.yaml apiVersion: apps/v1 kind: ReplicaSet metadata: name: repolicaset namespace: dev spec: replicas: 3 ##副本数量 selector: ##标签选择器 matchLabels: app: nginx-pod template: metadata: labels: app: nginx-pod spec: containers: - name : nginx image: nginx:1
//查看镜像,发现了三个
[root@master ~]# kubectl get pod -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
repolicaset-dns84 1/1 Running 0 2m22s 10.244.2.20 server1
repolicaset-ngv8g 1/1 Running 0 2m22s 10.244.2.19 server1
repolicaset-q8cps 1/1 Running 0 2m22s 10.244.1.15 server2
使用scale命令实现rs扩缩容,后面--repicass=n直接指定目标数量即可
kubectl scale rs repolicaset --replicas=2 -n dev
使用编辑对镜像版本进行修改
kubectl edit rs repolicaset -n dev
删除replicaset
##使用kubectl delete命令会删除rs及它管理的pod
[root@master ~]# kubectl delete rs repolicaset -n dev
replicaset.apps "repolicaset" deleted
##推荐yaml删除
kubectl delete -f repolicaset.yaml
他不直接管理pod,而是通过管理rs来管理pod
- 支持版本滚动升级和版本回退
[root@master ~]# cat deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: dp namespace: dev labels: version: v1 spec: replicas: 3 ##副本数量 revisionHistoryLimit: 3 ##保留历史版本 默认10 selector: matchLabels: app: nginxpod template: metadata: labels: app: nginxpod spec: containers: - name: nginx image: nginx:1
deployment支持两种镜像更新策略:重建更新和滚动更新
strategy:指定新的pod替换旧的pod策略
type:指定策略类型,支持两种策略
recreate:创建出新的pod之前会杀死所有已存在的pod
rollingupdate:滚动更新,杀死一部分就启动一部分,更新过程中存在两个版本的pod
rollingupdate:当类型为这个的时候,可以设置参数
maxunvailable:指定升级中不可用最大数量 默认25%
maxsurge: 指定升级过程中可以超过期望pod最大数量,默认25%
[root@master ~]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dp
namespace: dev
labels:
version: v1
spec:
strategy: ##设置滚动更新
type: RollingUpdate
rollomgUpdate:
maxUnavailable: 25%
maxSurge: 25%
replicas: 4 ##副本数量
revisionHistoryLimit: 3 ##保留历史版本 默认10
selector:
matchLabels:
app: nginxpod
template:
metadata:
labels:
app: nginxpod
spec:
containers:
- name: nginx
image: nginx:1
//观察现象 [root@master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE dp-97475579b-89fd6 1/1 Running 0 6m22s dp-97475579b-9kcmb 1/1 Running 0 13m dp-97475579b-rd2ds 1/1 Running 0 72s dp-97475579b-rgqcl 1/1 Running 0 13m [root@master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE dp-566d689f97-b8f55 0/1 ContainerCreating 0 3s dp-566d689f97-lhznp 0/1 ContainerCreating 0 3s dp-97475579b-89fd6 1/1 Running 0 6m42s dp-97475579b-9kcmb 1/1 Running 0 13m dp-97475579b-rgqcl 1/1 Running 0 13m ##有两个镜像删除了
重新创建新的pod 添加--record参数
//记录这次更新
[root@master ~]# kubectl create -f deployment.yaml --record
##新版本不需要这个参数
//查看版本记录
[root@master ~]# kubectl rollout history deployment dp -n dev
deployment.apps/dp
REVISION CHANGE-CAUSE
2 kubectl create --filename=deployment.yaml --record=true
3 kubectl create --filename=deployment.yaml --record=true
回退上一个版本
##查看当前版本
[root@master ~]# kubectl get deploy -n dev -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
dp 4/4 4 4 17m nginx nginx:1 app=nginxpod
##回退至版本2
[root@master ~]# kubectl rollout undo deploy dp --to-revision=2 -n dev
##查看版本信息 发现已经变成了最新版
[root@master ~]# kubectl get deploy -n dev -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
dp 4/4 4 4 21m nginx nginx app=nginxpod
HPA是一个自动化的pod控制器
保证集群中的每一台节点都运行一个副本,一般用于日志收集,节点监控。、
控制器特点:
- 每当想集群添加一个节点时,指定的pod副本也将添加到该节点上
- 当节点从集群中移除时,pod也就被垃圾回收了
[root@master ~]# cat daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds
namespace: dev
labels:
version: v1
spec:
selector:
matchLabels:
app: nginxpod
template:
metadata:
labels:
app: nginxpod
spec:
containers:
- name: nginx
image: nginx:1
查看效果
[root@master ~]# kubectl get ds -n dev
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ds 2 2 2 2 2 49s
##发现是2个pod
[root@master ~]# kubectl get pod -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED
ds-cnlb2 1/1 Running 0 81s 10.244.1.75 server2
ds-l9f6p 1/1 Running 0 81s 10.244.2.81 server1
##此时发现 server1 和server2一个