赞
踩
k8s pod的控制器主要是以下几种:
Deployment
DaemonSet
Job
Cronjob
StatefullSet
准备工作,先定义了一个存储类(storageclass),用于动态制备pv
描述:用来控制无状态pod,每个pod一模一样,pod之间没有联系
测试一:重新调度pod名称与IP地址随机
pod的初始名称为(nginx-deployment-5b95fcf774-zkqlw)、IP地址为:10.244.2.130
删除重新调度后,pod的名称为(nginx-deployment-5b95fcf774-mc9vp)、ip地址为:10.244.1.52
测试二、pod的启动、停止、扩容、缩减并不是线性的
使用命令扩容副本数量仔细观察可以看出来
测试三:pod之间使用共享存储
生成多副本以后,查看对应的pv与pvc,并没有发生数量变化,也不会为每个pod单独分配pv与pvc。(可以对比后面statefullset的测试查看)
---
kind: PersistentVolumeClaim #资源类型pvc
apiVersion: v1 #api版本v1
metadata: # pvc的元数据,即描述
name: pvc1 # pvc的名字pvc1
spec: #pvc资源的详细信息
accessModes: #pvc资源的访问模式
- ReadWriteMany #卷可以被多个节点读写的方式挂载
resources: # 资源定义
requests: #资源请求定义
storage: 1Gi #请求存储1G
storageClassName: "nfs-storage" #存储类的名称,需要先定义存储类
---
apiVersion: apps/v1 # api版本
kind: Deployment # 资源类型为deployment
metadata: #元数据即资源描述信息
name: nginx-deployment #deployment资源名称
labels: #deployment资源标签定义
app: nginx #deployment 资源标签的值
spec: #deployment资源的详细信息
replicas: 1 #副本数量定义
selector: #标签选择器,通过标签选择器控制pod,这里的标签必须与pod的一样
matchLabels: # 匹配标签定义,即控制器控制哪个pod
app: nginx #匹配标签的值
template: # pod的模板
metadata: # 元数据即pod的描述信息
labels: # pod的标签
app: nginx
spec: # pod资源的详细信息
containers: #容器资源定义
- name: nginx #容器名称
image: nginx #镜像名称与标签,没有写标签默认为latest
imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地不存在,网上拉取
resources: # 资源定义
requests: #定义请求的资源
cpu: 100m #定义单个pod请求的cpu资源
ports: # 容器端口定义
- containerPort: 80
volumeMounts:
- name: personal
mountPath: /usr/share/nginx/html
volumes:
- name: personal
persistentVolumeClaim:
claimName: pvc1
readOnly: false
描述:用来保证每个节点有一个指定的pod运行。适合通过pod收集节点
软硬件信息,监控节点状态,或者其他特殊的应用场景
测试
使用daemonset控制器,发现在每个节点上生成一个pod,对pod进行扩容,发现报错提示,未能发现请求的资源。事实上daemonset控制器确实没有replicaset资源的定义
---
apiVersion: apps/v1 # api版本
kind: DaemonSet # 资源类型为daemonset
metadata: #元数据即资源描述信息
name: nginx-daemonset #deployment资源名称
labels: #daemonset资源标签定义
app: nginx #daemonset 资源标签的值
spec: #daemonset资源的详细信息
selector: #标签选择器,通过标签选择器控制pod,这里的标签必须与pod的一样
matchLabels: # 匹配标签定义,即控制器控制哪个pod
app: nginx #匹配标签的值
template: # pod的模板
metadata: # 元数据即pod的描述信息
labels: # pod的标签
app: nginx
spec: # pod资源的详细信息
containers: #容器资源定义
- name: nginx #容器名称
image: nginx #镜像名称与标签,没有写标签默认为latest
imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地不存在,网上拉取
resources: # 资源定义
requests: #定义请求的资源
cpu: 100m #定义单个pod请求的cpu资源
ports: # 容器端口定义
- containerPort: 80 #容器暴露端口80
描述:用来部署一次性任务,完成某次或者某些单次计算任务:比如计算圆周率
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
查看pod日志发现计算圆周率到小数点后2000位
描述:用来部署周期性计划性任务,默认保留最后三个pod。
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
每分钟打印一次时间以及“Hello from the Kubernetes cluster”这句话
描述:用来控制有状态pod
测试一、pod的启动、更新、扩缩、缩减是线性的
此测试比较简答,注意观察就可以了,启动的时候,只有前一个pod创建成功并启动以后,下一个才会创建,删除的时候,按照索引从后往前删除,后一个被删除以后,前一个才会被删除。
使用kubectl scale statefullset 名称 --replicas=自定义副本数量
kubeclt get pod可以查看线性启动与线性删除
测试二、pod的主机名在pod被删除以后,重新调度不会发生变化在测试三最后一步可以体现(删除pod以后重新调度,发现dns并未发生变化)
测试三、每个pod有对应的存储,并且删除pod以后,对应的存储并不会被删除
测试前查看pv与pvc都不存在
使用state fullset控制器部署pod,查看pv与pvc都被创建
扩容副本以后,每个pod对应一个pv与pvc
同时查看nfs的共享目录下自动创建与pod副本对应(或者说与pv数量对应)目录
通过pv修改pod的服务内容
删除pod以后发现pv、pvc仍然存在
重新调度pod以后,注意对应的pod名称并不会变化,同样pod对应的服务内容并不会发生变化
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。