pod的定义及作用

  • pod是kubernetes调度的最小的逻辑单元,是对容器封装的外壳,一个pod内可以有多个容器,他们可以共享netns存储卷。一般一个pod只放一个容器,除非是特殊情况可以运行多个容器。(nginx+filebeat)
  • 通过标签来管理(labelselector)pod资源(如app=nginx),k8s是resful风格的api,通过http、https对外提供api服务,所有能被操作的目标都是对象,所有对象都可以使用标签选,可以被标签选择器所选择,一个资源可以有多个标签,一个标签可以对应多个资源

pod的分类 及常用操作命令

  1. #
  2. 自主式pod,把需求发送给aipserver,通过scheduler把请求调度到需要创建podnode节点上,一旦pod所在的节点故障,pod也就随之消失不能实现全局性的调度
  3. 控制器管理的pod,此时的podk8s系统中具了生命周期的资源,随着任务的结束而停止
  4. #常用操作命令
  5. #创建一个资源
  6. kubectl create -f xxx.yaml
  7. #查看某一类型的资源
  8. kubectl get pod/rc/rs/ns/svc/deployment -n namespace(default 默认可以不写)
  9. #查看某个资源的详情
  10. kubectl describe pod/rc/rs/ns/svc/deployment 名字
  11. #删除某个资源
  12. kubectl delete pod/rc/rs/ns/svc/deployment 名字
  13. kubectl delete pod/rc/rs/ns/svc/deployment -f xxx.yaml
  14. #修改某个资源信息
  15. 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

官方文档参考:
https://kubernetes.io/zh/docs/concepts/workloads/controllers/replicationcontroller/#%e5%b8%b8%e8%a7%81%e7%9a%84%e4%bd%bf%e7%94%a8%e6%a8%a1%e5%bc%8f

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