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:业务容器
并行启动