前面学习了使用yaml直接创建pod,但是在创建的时候遇到了一些问题
1、很多参数无法修改
2、无法多副本
1、控制器
deployment
可以修改pod参数,支持多副本,支持更新策略
statefulset
daemonset
cronjob
job
第三方提供的扩展控制器
阿里云的openkruise
cloneset
advanced statefulset
advanced deamonset
生成一个deployment的pod
[root@cka01 ~]# kubectl create deploy webserver --image=nginx:1.21 --dry-run=client -o yaml> deploy-web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: webserver
name: webserver
namespace: cka
spec:
replicas: 1 #副本数
selector: # 选择带有特定标签的pod。监视pod的状态是否正常,pod的副本数是否正确,所以通过deployment创造的pod的标签不能与其他的pod重复。
matchLabels:
app: webserver
type: backend
strategy: {}
template: # pod.yaml 里面的内容. 不需要指定name,会根据deployment的name,加上hash串生成一个name,也不需要指定namesapce,这里的namespace与deployment一样
metadata:
creationTimestamp: null
labels:
app: webserver
type: backend
spec:
containers:
- image: nginx:1.21
name: nginx
resources: {}
status{}
可以发现,使用delete pod去删除pod的时候,删不掉,会立马拉起一个新的pod。这是由于 selector在监视pod的状态以及副本数。发现副本数不够则立即拉起新的副本
怎么删除
1、将yaml里面replicas数量改成0,再重新apply
2、删除对应的deployment,则里面的pod也会删除
deployment的增删改查
get 操作:
edit 操作
[root@cka01 deployment]# kubectl edit deploy webserver -n cka
[root@cka01 deployment]# kubectl describe deploy -n cka
[root@cka01 deployment]# kubectl describe deploy -n cka webserver
delete:
[root@cka01 deployment]# kubectl delete deploy -n cka webserver1
滚动更新策略
recreate: 将现有的副本数全部删除,再全部重建
rollingUpdate:滚动更新
* Maxsurge:先建后删。不管Maxunavailable的值是多少。都先创建Maxsurge个副本数,再删除Maxsurge个旧pod,依次滚动
* MaxUnavailable:先删后建。一般只有maxsurge不可用时,才会执行Maxunavailable。先删除Maxunavalibe个旧pod,再创建Maxunavailable个新pod,依次滚动
Maxsurge/Maxunavaliable:0 表示不生效 25% 表示 总副本数的25%
Maxsurge/Maxunavalive: 1-n .表示先删后建或者先建后删的 n个pod
这两不能同时为0
默认为25%
statefulset 有状态集
支持副本数
支持容器id名称固定不变
支持分区(分批发布):100个副本,在服务发布的时候可以先发布一个副本,验证该副本是否正常。如果正常,可以继续发布。
不支持更新策略
支持容器顺序启停
缺点:如果副本数很多,statefulset的一次更新很慢。
创建statefulset资源对象的pod
[root@cka01 statefulset]# cat statfulset-web.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
creationTimestamp: null
labels:
app: webserver
name: webserver
namespace: cka
spec:
serviceName: webhahahha #指定名称id前缀
replicas: 3 #副本数
selector: # 选择带有特定标签的pod。监视pod的状态是否正常,pod的副本数是否正确,所以通过deployment创造的pod的标签不能与其他的pod重复。
matchLabels:
app: webserver
type: backend
template: # pod.yaml 里面的内容. 不需要指定name,会根据deployment的name,加上hash串生成一个name,也不需要指定namesapce,这里的namespace与deployment一样
metadata:
creationTimestamp: null
labels:
app: webserver
type: backend
spec:
containers:
- image: nginx:1.21
name: nginx
分区演示:
默认跟新策略:
apiVersion: apps/v1
kind: StatefulSet
metadata:
creationTimestamp: null
labels:
app: webserver
name: webserver
namespace: cka
spec:
serviceName: webhahahha #指定名称id前缀
replicas: 4 #副本数
selector: # 选择带有特定标签的pod。监视pod的状态是否正常,pod的副本数是否正确,所以通过deployment创造的pod的标签不能与其他的pod重复。
matchLabels:
app: webserver
type: backend
updateStrategy:
rollingUpdate:
partition: 2 #保留两个旧副本 通过修改这里的字段值,以控制更新,当想全部更新时,把partition的值设置为0即可。
type: RollingUpdate
template: # pod.yaml 里面的内容. 不需要指定name,会根据deployment的name,加上hash串生成一个name,也不需要指定namesapce,这里的namespace与deployment一样
metadata:
creationTimestamp: null
labels:
app: webserver
type: backend
spec:
containers:
- image: nginx:1.21
name: nginx
daemonset
- 不知道副本数
- 不支持更新策略
- 每个节点都会运行一个,且只会运行一个
- 适用于agent类型的应用
job
一次性任务,相当于at
[root@cka01 job]# cat job-test.yaml
apiVersion: batch/v1
kind: Job
metadata:
labels:
app: test-job
name: test-job
namespace: cka
spec:
backoffLimit: 3 #副本数
activeDeadlineSeconds: 120
manualSelector: true # 这里job类型的pod的yaml文件,这个是必须的
selector: # 选择带有特定标签的pod。监视pod的状态是否正常,pod的副本数是否正确,所以通过deployment创造的pod的标签不能与其他的pod重复。
matchLabels:
app: hello
template: # pod.yaml 里面的内容. 不需要指定name,会根据deployment的name,加上hash串生成一个name,也不需要指定namesapce,这里的namespace与deployment一样
metadata:
creationTimestamp: null
labels:
app: hello
spec:
restartPolicy: Never
containers:
- image: busybox:1.28
name: busybox
cronjob
定时任务,相当于crontab
apiVersion: batch/v1
kind: CronJob
metadata:
name: test-crojob
namespace: cka
labels:
app: test-cronjob
spec:
schedule: "* * * * *"
successfulJobsHistoryLimit: 5 #保留成功支持的pod job数
failedJobsHistoryLimit: 3 #保留失败执行的job数
startingDeadlineSeconds: 300 #最后启动时间。不管前一个job有没有执行完,5分钟之后都启动
jobTemplate:
metadata:
namespace: cka
labels:
name: test-job
spec:
backoffLimit: 3
activeDeadlineSeconds: 120
template:
metadata:
labels:
app: hello
spec:
restartPolicy: Never
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- "echo 'hello world'"
#第三方扩展控制器,阿里云开源
openkruise
kubernetes的包管理器:
helm:专门用于kubernetes集群当中部署应用的
安装 官网:https://helm.sh/zh/
仓库管理:
添加(初始化):
helm repo add bitnami https://charts.bitnami.com/bitnami
查询:helm repo list
更新: [root@cka01 ~]# helm repo update
删除:[root@cka01 ~]# helm repo remove bitnami
修改:
helm repo remove bitnami
helm repo add bitnami https://xxx.xxx.xxx/yyy
包管理:
搜索:
helm search repo redis
安装:
[root@cka01 ~]# helm install redistest bitnami/redis -n helm
获取(拉取)包:[root@cka01 ~]# helm fetch bitnami/redis
更新包:[root@cka01 redis]# helm upgrade redistest bitnami/redis -n helm -f values.yaml
或者卸载使用更改过的value.yaml 重装[root@cka01 redis]# helm install redistest bitnami/redis -n helm -f values.yaml
卸载:[root@cka01 redis]# helm uninstall redistest -n helm
重装[root@cka01 redis]# helm install redistest bitnami/redis -n helm -f values.yaml
openkruise的第三方控制器。