Pod基本概念
Pod是Kubernetes创建和管理的最小单元,一个Pod由一个容器 或多个容器组成,这些容器共享存储、网络。

Pod特点:
- 
一个Pod可以理解为是一个应用实例,提供服务
 
- 
Pod中容器始终部署在一个Node上
 
- 
Pod中容器共享网络、存储资源
 
- 
Kubernetes直接管理Pod,而不是容器
 
Pod存在的意义
Pod主要用法:
如果有这些需求,你可以运行多个容器:
Pod资源共享实现机制

共享网络:将业务容器网络加入到“负责网络的容器”实现网络共享
测试验证是否共享网络:
vim pod-net.yaml
apiVersion: v1 kind: Pod metadata:   name: my-pod spec:   containers:   - name: web     image: nginx   - name: test     image: busybox     command: ["/bin/sh","-c","sleep 360000"]
 
   | 
 
kubectl apply -f pod-net.yaml  kubectl exec -it my-pod -c test -- sh    wget 127.0.0.1:80  cat index.html      
   | 
 

共享存储:容器通过数据卷共享数据
测试验证是否共享存储:
vim pod-vol.yaml
apiVersion: v1 kind: Pod metadata:   name: my-pod2 spec:   containers:   - name: web2     image: nginx     volumeMounts:     - name: log       mountPath: /data
    - name: test2     image: busybox     command: ["/bin/sh","-c","sleep 360000"]     volumeMounts:     - name: log       mountPath: /data
    volumes:   - name: log     emptyDir: {}
 
   | 
 
kubectl apply -f pod-vol.yaml  kubectl exec -it my-pod2 -c test2 -- sh      cd /data touch 1.txt kubectl exec -it my-pod2 -c web2 -- bash    cd /data ls
   | 
 
Pod管理命令
创建Pod:
kubectl apply -f pod.yaml  或者使用命令 kubectl run nginx --image=nginx 
   | 
 
查看Pod:
kubectl get pods  kubectl describe pod <pod名称>
   | 
 
查看日志:
kubectl logs <pod名称> [-c CONTAINER]  kubectl logs <pod名称> [-c CONTAINER] -f 
   | 
 
进入容器终端:
kubectl exec <pod名称> [-c CONTAINER] -- bash 
   | 
 
删除Pod:

重启策略+健康检查(应用自修复)

重启策略:
健康检查有以下两种类型:
支持以下三种检查方法:
- 
httpGet:发送HTTP请求,返回200-400范围状态码为成功。
 
- 
exec:执行Shell命令返回状态码是0为成功。
 
- 
tcpSocket:发起TCP Socket建立成功
 
参考链接:https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
测试验证:
vim pod-check.yaml
apiVersion: v1 kind: Pod metadata:   labels:     test: liveness   name: pod-check spec:   containers:   - name: liveness     image: busybox     args:     - /bin/sh     - -c     - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600     livenessProbe:       exec:         command:         - cat         - /tmp/healthy       initialDelaySeconds: 5       periodSeconds: 5     readinessProbe:       exec:         command:         - cat         - /tmp/healthy       initialDelaySeconds: 5            periodSeconds: 5           
 
   | 
 
kubectl apply -f pod-check.yaml kubectl expose pod pod-check --port 80 --target-port=80 kubectl get pod -w            kubectl get endpoints -w      kubectl describe pod pod-check  
   | 
 


示例:端口探测
apiVersion: v1 kind: Pod metadata:   name: probe-demo   namespace: demo spec:   containers:   - name: web     image: nginx     ports:     - containerPort: 80     readinessProbe:       httpGet:         path: /         port: 80       initialDelaySeconds: 30        periodSeconds: 10      livenessProbe:       httpGet:         path: /         port: 80       initialDelaySeconds: 30        periodSeconds: 10 
 
   | 
 
注:livenessProbe与readinessProbe配置一样。
示例:执行Shell命令
livenessProbe:   exec:     command:     - cat     - /tmp/healthy
   | 
 
示例:HTTP请求
livenessProbe:   httpGet:     path: /healthz     port: 8080     httpHeaders:     - name: Custom-Header       value: Awesome
   | 
 
环境变量
变量值几种定义方式:
- 
自定义变量值
 
- 
变量值从Pod属性获取
 
- 
变量值从Secret、ConfigMap获取
 
示例
vim pod-var.yaml
apiVersion: v1 kind: Pod metadata:   name: pod-envars spec:   containers:     - name: test       image: busybox       command: [ "sh", "-c", "sleep 36000"]       env:       - name: MY_NODE_NAME         valueFrom:           fieldRef:             fieldPath: spec.nodeName       - name: MY_POD_NAME         valueFrom:           fieldRef:             fieldPath: metadata.name       - name: MY_POD_NAMESPACE         valueFrom:           fieldRef:             fieldPath: metadata.namespace       - name: MY_POD_IP         valueFrom:           fieldRef:             fieldPath: status.podIP       - name: ABC         value: "123456"
 
   | 
 
kubectl apply -f pod-var.yaml  kubectl exec -it pod-envars -- sh
   | 
 
验证:

Init Container
Init Container:顾名思义,用于初始化工作,执行完就结束,可以理解为一次性任务。
- 
支持大部分应用容器配置,但不支持健康检查
 
- 
优先应用容器执行
 
应用场景:
示例:
部署一个web网站,网站程序没有打到镜像中,而是希望从代码 仓库中动态拉取放到应用容器中。
vim pod-init.yaml
apiVersion: v1 kind: Pod metadata:   name: init-demo spec:   initContainers:   - name: download     image: busybox     command:     - wget     - "-O"     - "/opt/index.html"     - http://www.ctnrs.com     volumeMounts:     - name: wwwroot       mountPath: "/opt"   containers:   - name: nginx     image: nginx     ports:     - containerPort: 80     volumeMounts:     - name: wwwroot       mountPath: /usr/share/nginx/html   volumes:   - name: wwwroot     emptyDir: {}
 
   | 
 
kubectl apply -f pod-init.yaml  kubectl get pod  kubectl describe pod init-demo  kubectl exec -it init-demo -- bash
   | 
 
验证:

因此,Pod中会有这几种类型的容器:
Infrastructure Container:基础容器
维护整个Pod网络空间
InitContainers:初始化容器
先于业务容器开始执行
Containers:业务容器
并行启动