pod的定义及作用
- pod是kubernetes调度的最小的逻辑单元,是对容器封装的外壳,一个pod内可以有多个容器,他们可以共享netns存储卷。一般一个pod只放一个容器,除非是特殊情况可以运行多个容器。(nginx+filebeat)
- 通过标签来管理(labelselector)pod资源(如app=nginx),k8s是resful风格的api,通过http、https对外提供api服务,所有能被操作的目标都是对象,所有对象都可以使用标签选,可以被标签选择器所选择,一个资源可以有多个标签,一个标签可以对应多个资源
pod的分类 及常用操作命令
#自主式pod,把需求发送给aipserver,通过scheduler把请求调度到需要创建pod的node节点上,一旦pod所在的节点故障,pod也就随之消失不能实现全局性的调度控制器管理的pod,此时的pod在k8s系统中具了生命周期的资源,随着任务的结束而停止#常用操作命令#创建一个资源kubectl create -f xxx.yaml#查看某一类型的资源kubectl get pod/rc/rs/ns/svc/deployment -n namespace(default 默认可以不写)#查看某个资源的详情kubectl describe pod/rc/rs/ns/svc/deployment 名字#删除某个资源kubectl delete pod/rc/rs/ns/svc/deployment 名字kubectl delete pod/rc/rs/ns/svc/deployment -f xxx.yaml#修改某个资源信息kubectl edie pod/rc/rs/ns/svc/deployment 名字
如何创建一个pod资源
使用命令的方式来创建一个pod资源
kubectl run nginx-pod --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run -o yaml
nginx-pod #表示起一个资源的名称
--image #表示使用那个镜像
--port #要暴露的端口
--replicas #要启几个实例
--dry-run #干跑模式,也就是模拟一下,没有实际执行
-o yaml #输出yaml格式的信息
#此pod资源是通过pod控制器来创建的,通过控制器来管理,当删除此pod资源时,管理器会重新创建一下
kubectl get pod -o wide #查看创建的具体信息(调度到那个节点,pod的ip信息)
kubectl get deploy nginx-deploy #查看刚才创建的deploy的情况
使用清单方式来创建一个pod资源(五个一级字段)
cat > nginx-pod.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: default
labels:
app: nginx-pod
release: canary
spec:
containers:
- name: deploy-demo
image: nginx:1.14-alpine
ports:
- name: http
containerPort: 80
EOF
#创建这个pod资源
kubectl create -f nginx-pod.yaml
#查看创建的pod资源
kubectl get pods -o wide
如何在一个pod中运行两个容器
vim nginx-busybox-two-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-busybox-pod
namespace: default
labels:
app: nginx-busybox-pod
release: canary
spec:
containers:
- name: deploy-demo
image: nginx:1.14-alpine
ports:
- name: http
containerPort: 80
- name: nginx-busybox-pod
image: busybox:latest
command: ["sleep 1999"]
#创建pod资源
kubectl create -f nginx-busybox-two-pod.yaml
此pod资源是手动创建,一旦删除此pod那么它的生命周期也不终止,不会重新创建
pod控制器分类
#ReplicationController (副本控制器) ,它所控制的pod的数量一旦少一个,就会马上会启动一个,会保证pod
的数量和用户期望的数量是一致的(多退少补)。另外一种功能,可以实现滚动更新、回滚
#ReplicaSet (副本集控制器)不直接使用,是通过声明式的控制器deployment来实现的
#Deploymnet 只负责管理无状态的应用,也可以管理二级控制器,比如rs (常用)
#HPA(horizontalPodAutoscaler)根据监控的资源信息,如果超过预定的值就会增加pod,当监控的值小于预定的
值就会杀掉几个pod,也算是一种控制器
#StatefulSet 有状态控制器来管理
#DaemonSet 在node节点上只运行一个副本
#Job 运行一个作业
#CronJob 周期性作业
如何通过控制器来创建pod资源
pod控制器的作用:
#代用户创建一定数量的pod副本,并保证pod副本一直处于running状态,如果pod的数量低于用户所期望的数量时,
会自动补全
ReplicationController(rc)
#replicaSet(上一个版本是replicationController)管理无状态的pod资源
#spec有三个部分组成
#replicas用户期望pod副本数量
#selector标签选择器
#template pod模板(pod数量不符合用户的期望值时,会根据模板来完成pod的创建
replicationcontroller(rc) yaml格式的模板
cat > rc-demo.yaml << EOF
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 2
selector:
app: nginx
release: canary
template:
metadata:
name: nginx
labels:
app: nginx
release: canary
spec:
containers:
- name: nginx
image: nginx:1.13-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
EOF
使用rc来实现动态的更新及回滚,创建一个新的yaml文件
cat > rc-demo2.yaml << EOF
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx02
spec:
replicas: 2
selector:
app: nginx02
release: canary
template:
metadata:
name: nginx02
labels:
app: nginx02
release: canary
spec:
containers:
- name: nginx02
image: nginx:1.14-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
EOF
使用命令来实现回滚操作
#指定镜像版本实现滚动升级(一个一个按顺序升级)
kubectl rolling-update nginx --image=nginx:1.14-alpine --update-period=2s
#nginx 对那个资源做回滚操作
#--image=nginx:1.14-alpine使 用那个镜像文件
#--update-time=5s 更新周期,默认为1分钟
如果发现有问题及时再回滚到上一个版本
kubectl rolling-update nginx --image=nginx:1.13-alpine --update-period=1s
rc在指定文件更新的时会导致服务中断,需要修改svc后服务才能正常
kubectl rolling-update nginx -f rc-demo2.yaml --update-period=2s
ReplicaSet
#replicaSet(是replicationController升级版)管理无状态的pod资源,一般不建议使用这个控制管理器
#它的spec有三个部分组成
#replicas用户期望pod副本数量
#matchLabels标签选择器
#template pod模板(pod数量不符合用户的期望值时,会根据模板来完成pod的创建
replicaset yaml格式的模板
cat > rs-demo-pod.yaml << EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-demo-pod
spec:
replicas: 2
selector:
matchLabels:
app: rs-demo
release: canary
template:
metadata:
name: rs-demo-pod
labels:
app: rs-demo
release: canary
spec:
containers:
- name: rs-demo-pod
image: nginx:1.13-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
EOF
如果实例的个数不符合用户的需要如何修改
#修改实例的个数,可以通过修改yaml的配置文件来实现
#可以直接修改
kubectl edit rs rs-demo-pod #修改replicas的值
#也可用这个命令设定副本的数量
kubectl scale --replicas=1 rs rs-demo-pod
#修改rs文件中镜像文件后,只有pod重建后才会更新,原来创建的pod资源不会更新,从而可以实现金丝鹊方式的
更新操作
#可以创建第二个rs2资源,标签选择器要符合service的要求,等数量和rs1的数量同样多的时候,再把rs1删除
deployment(声明式创建资源)
deployment的工作原理
使用命令kubectl apply -f deploy-demo.yaml来创建一个deployment类型的资源,实际上是deployment
通过控制rs,由rs来创建pod,从而达到控制pod的目的。
deploy-yaml模板:
cat > deploy-demo.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy-demo
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: deploy-demo
release: canary
template:
metadata:
labels:
app: deploy-demo
release: canary
spec:
containers:
- name: deploy-pod
image: ikubernetes/myapp:v2
ports:
- name: http
containerPort: 80
EOF
如果实例的个数不符合用户的需要如何修改
#修改replicas的值
vim nginx-deploy-demo.yaml
#再次使用命令
kubectl apply -f nginx-deploy-demo.yaml #就可达到修改pod的个数
#打补丁的方法
kubectl patch deploy nginx-deploy-demo -p '{"spec":{"replicas":5}}'
#使用命令增加副本的数量
kubectl scale --replicas=5 deploy nginx-deploy-demo
#修改配置文件中replicas的值
kubrctl edit deploy nginx-deploy-demo
如何实现版本的自动更新
#先修改升级策略
kubectl patch deploy nginx-deploy-demo -p '{"spec":{"strategy":{"rollingUpdate":
{"maxSurge":1,"maxUnavailable":0}}}}'
#maxSurge最多多几个可用,maxUnavailable最多少几个不可用
#修改镜像版本
kubectl set image deploy nginx-deploy-demo deploy-demo=ikubernetes/myapp:v3
#使用命令查看时时更新的进度
kubectl get pods -l app=deploy-demo -w #-w代表watch的意思
实现版本回滚
先查看一下版本数量
kubectl rollout history deploy nginx-deploy-demo --record
自动回滚到上一个版本
kubectl rollout undo deploy nginx-deploy-demo --record
回滚到指定版本
kubectl rollout undo deploy nginx-deploy-demo --to-reversion=2 --record
#--record 记录命令
#检查更新的版本
kubectl rollout history deploy nginx-deploy-demo
可以直接修改镜像版本,或者副本数量
kubectl edit deploy nginx-deploy-demo
pod的生命周期
就绪性检查
- 检查一个文件是否存在,如果存在就认为准备就绪,那么可以对外提供服务,就绪检测只检查一次,如果通过不会检查第二次
cat > readiness-httpget.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget-pod
spec:
containers:
- name: readiness-httpget-pod
image: 10.0.0.70:5000/nginx:1.15-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
readinessProbe:
httpGet:
port: http
path: /esion.html
initialDelaySeconds: 1
failureThreshold: 3
restartPolicy: Always
EOF
#生成这个pod资源
kubectl create -f readiness-httpget.yaml
#检查此pod为未就绪的状态
#进入pod内部添加一个站点文件后,服务正常
kubectl exec -it readiness-httpget-pod /bin/sh
存活性检查
- 存活检查是为了确保服务持续正常,会每隔几秒钟检查一次,如果超过失败的次数,那么就会重新启动一个新的pod
liveness-exec方法探测
cat > liveness-exec.yaml << EOf
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
namespace: default
spec:
containers:
- name: liveness-exec-pod
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","touch /tmp/healthy; sleep 30; rm /tmp/healthy; sheep 300"]
livenessProbe:
exec:
command: ["test","-e","/tmp/healthy"]#检查此文件是否存在
initialDelaySeconds: 1
periodSeconds: 3
restartPolicy: Always
EOF
#生成这个pod资源
kubectl create -f liveness-exec-pod.yml
#检查此pod为服务不正常
#直到服务正常为止
liveness-httpget方法探测
apiVersion: v1
kind: Pod
metadata:
name: liveness-httpget-pod
namespace: default
spec:
containers:
- name: liveness-httpget-pod
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
livenessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
restartPolicy: Always
liveness-tcpsocket方法探测
vim liveness-tcpsocket.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-tcpsocket-pod
namespace: default
spec:
containers:
- name: liveness-tcpsocket-pod
image: nginx:1.14-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 1
periodSeconds: 3
restartPolicy: Always
