k8s进阶:Pod

About Pod

  • k8s的最少调度单位

  • pod内容器共享network namespace 和volume(docker run也能实现但对容器的启动顺序有要求)

  • 本质上是容器的逻辑隔离(类似namespace)

  • 中间容器: Pause容器

    • 每个pod内第一个启动的容器
    • 什么都不做,永远处于暂停状态镜像只有700k左右

    又称infra container;当一个pod内含有多个容器,就需要共享network namespace,k8s的解决方案是,创建一个小容器,其他所有的容器通过join namespace的方式加入到这个小容器的network container中实现共享.

    主要作用:

    1. 在pod中担任linux 命名空间共享的基础
    2. 启用pid命名空间,开启init进程
  • pod维护并生成容器内的hosts文件,保证一个pod内的所有容器都使用同一份hosts文件

    • 修改:

      1
      2
      3
      4
      5
      spec:
      hostAliases:
      - ip: "x.x.x.x"
      hostname:
      - "domain.com"
  • 所有namespace层面都由pod维护

    1
    2
    3
    4
    spec:
    #是否使用宿主机的network namespace和 PID namespace
    hostNetwork: true
    hostPID: true

lifecycle

1
2
3
4
5
6
7
8
9
10
11
12
spec:
containers:
lifecycle:
#与entrypoint同时执行,容器一启动就执行
postStart:
exec:
command: ["/bin/sh", "-c", "echo web starting ... >> /var/log/messages"]
#容器停止前执行,并且等待执行完成后,才会给容器发出停止信号,当然有超时;一般做容器的优雅退出
preStop:
exec:
#如果脚本执行太快,用docker exec再tail -f 可能看不出效果(屏幕刷新来不及),所以加个sleep
command: ["/bin/sh", "-c", "echo web stopping ... >> /var/log/messages && sleep 3"]

pod的生命周期

  1. Pendding: 等待调度
  2. containterCreating: 调度完成,创建容器
  3. Running: 成功创建
  4. Succeded: 成功退出, $?=0
  5. Failed: 错误退出
  6. Ready: 通过健康检查
  7. CrashLoopBackoff: 没有通过健康检查
  8. Unknow: ApiServer没有收到pod的信息

ProjectedVolume

投射数据卷: ApiServer将文件投射到容器中

Secret

secret的修改是动态实时的,不需要重启容器

base64加密

1
echo -n "123456" | base64

创建secret

1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: Secret
metadata:
name: dbpass
#不透明的,混浊的
type: Opaque
data:
username: <base64加密后的字符串>
passwd: <base64加密后的字符串>

挂载secret

1
2
3
4
5
6
7
8
9
10
11
12
spec:
containers:
volumeMounts:
- name: db-secret
mountPath: /db-secret
readOnly: true
volumes:
- name: db-secret
projectd:
sources:
- secret:
name: dbpass

Configmap

与secret类似,但不加密,也是可以实时修改

1
2
kubectl create configmap <cm-name> --from-file <config-file>
kubectl edit cm <cm-name>

也可以通过KV方式创建,创建pod时作为环境变量传入

1
2
3
4
5
6
env:
- name: JAVA_OPTS
valueFrom:
configMapKeyRef:
name: configs
key: JAVA_OPTS

DownwardAPI

将pod本身的信息以文件形式挂载到容器中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
spec:
containers:
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo
volumes:
- name: podinfo
projected:
source:
- downwardAPI:
items:
- path: "labels"
fieldRef:
filedPath: metadata.labels
- path: "name"
fieldRef:
fieldPath: metadata.name
- path: "namespace"
fieldRef:
fieldPath: metadata.namespace
- path: "mem-request"
fieldRef:
containerName: web
fieldPath: limits.memory

k8s进阶:Pod
http://example.com/2023/03/17/k8s-pod/
作者
Peter Pan
发布于
2023年3月17日
许可协议