Kubernetes之深入理解Pod
- Pod相关概念
- Pod详细配置清单
- Pod核心配置
- Pod基本配置
- 1. 创建yaml文件
- 2. 创建namespace并根据yaml文件创建资源
- 3. 查看namespace下的pod列表以及pod的详细信息
- Pod中多个容器的名称和端口号不能相同
- Pod镜像拉取策略
- Pod环境变量
- Pod端口相关设置
- Pod资源相关配置
- Pod启动命令配置
Pod相关概念
- Pod实际上是容器的集合,是k8s中最小调度单元;
- 一个Pod里面可以有n多个不同的容器;
- 一个Pod内的容器之间共享相同的Pod Ip网络;
- Pause容器,这是每个Pod都会有的一个根容器;
- 可以在根容器上设置ip地址,其它容器都共享相同Ip (Pod IP),以实现Pod内部的网路通信,Pod内部的通讯,Pod的之间的通讯采用虚拟二层网络技术来实现。
Pod详细配置清单
apiVersion: v1 #必填,版本号,例如v1
kind: Pod #必填,资源类型,例如Pod、service、Deployment
metadata: #必填,元数据
name: pod-name #必填,Pod名称
namespace: namespace-name #Pod所属的命名空间, 默认为"default"
labels: #自定义标签列表
- name: v1
spec: #必填,Pod中容器的详细定义
containers: #必填,Pod中容器列表
- name: container-name #必填,容器名称
image: nginx:1.7.9 #必填,容器的镜像名称
imagePullPolicy: [ Always|Never|IfNotPresent] #获取镜像的策略
command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用Pod定义的共享存储卷的名称,需用volumes[ ]部分定义的卷名
mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
read0nly: boolean #是否为只读模式
ports: #需要暴露的端口库号列表
- name: string #端口的名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
protocol: string #端口协议,支持TCP和UDP,默认TCP
env: #容器运行前需设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和请求的设置
limits: #资源限制的设置
cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: string #Cpu请求,容器启动的初始可用数量
memory: string #内存请求,容器启动时的初始可用数量
lifecycle: #生命周期钩子
postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
livenessProbe: #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
exec: #对Pod容器内检查方式设置为exec方式
command: [string] #exec方式需要制定的命令或脚本
httpGet: #对Pod内容器健康检查方法设置为HttpGet,需要制定path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #对Pod内容器健康检查方式设置为tcpSocket方式
port: number
apiVersion: v1 # 必选,API的版本号
kind: Pod # 必选,类型Pod
metadata: # 必选,元数据即基础信息
name: nginx # 必选,符合RFC 1035规范的Pod名称
namespace: web-testing # 可选,不指定默认为default,Pod所在的命名空间
labels: # 可选,标签选择器,一般用于Selector
- app: nginx
annotations: # 可选,注释列表
- app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表
name: nginx # 必选,符合RFC 1035规范的容器名称
image: nginx:v1 # 必选,容器所用的镜像地址
imagePullPolicy: Always # 可选,镜像拉取策略
镜像拉取策略分三种:
Always 不管镜像存不存在本地都拉取(默认)
Nerver 不管镜像存不存在本地都不拉取
IfNotpresent 本地有镜像不拉取,没有就拉取
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
volumeMounts: # 可选,存储卷配置
name: webroot # 存储卷名称
mountPath: /usr/share/nginx/html # 挂载目录
readOnly: true # 只读
ports: # 可选,容器需要暴露的端口号列表
name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
env: # 可选,环境变量配置
name: TZ # 变量名
value: Asia/Shanghai
name: LANG
value: en_US.utf8
resources: # 可选,资源限制和资源请求限制
limits: # 最大限制设置
cpu: 1000m
memory: 1024MiB
requests: # 启动所需的资源
cpu: 100m
memory: 512MiB
readinessProbe: # 可选,容器状态检查
httpGet: # 检测方式
path: / # 检查路径
port: 80 # 监控端口
timeoutSeconds: 2 # 超时时间
initialDelaySeconds: 60 # 初始化时间
livenessProbe: # 可选,监控状态检查
exec: # 检测方式
command:
- cat
- /health
httpGet: # 检测方式
path: /_health
port: 8080
httpHeaders:
- name: end-user
value: jason
tcpSocket: # 检测方式
port: 80
initialDelaySeconds: 60 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 检测间隔
successThreshold: 2 # 检查成功为2次表示就绪
failureThreshold: 1 # 检测失败1次表示未就绪
securityContext: # 可选,限制容器不可信的行为
provoleged: false
restartPolicy: Always # 可选,默认为Always
nodeSelector: # 可选,指定Node节点
region: subnet7
imagePullSecrets: # 可选,拉取镜像使用的secret
name: default-dockercfg-86258
hostNetwork: false # 可选,是否为主机模式,如是,会占用主机端口
volumes: # 共享存储卷列表
name: webroot # 名称,与上述对应
emptyDir: {} # 共享卷类型,空
hostPath: # 共享卷类型,本机目录
path: /etc/hosts
secret: # 共享卷类型,secret模式,一般用于密码
secretName: default-token-tf2jp # 名称
defaultMode: 420 # 权限
configMap: # 一般用于配置文件
name: nginx-conf
defaultMode: 420
Pod核心配置
Pod基本配置
1. 创建yaml文件
文件名称:pod.yaml
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: nginx-pod
namespace: bubble-dev
labels:
user: v1 # 标签值
spec:
containers:
- name: nginx # 容器1
image: nginx:1.17.9
- name: tomcat # 容器2
image: tomcat:8
2. 创建namespace并根据yaml文件创建资源
kubectl create ns bubble-dev
kubectl create -f pod.yaml
3. 查看namespace下的pod列表以及pod的详细信息
kubectl get pods -n bubble-dev
kubectl describe pods -n bubble-dev
说明pod运行在192.168.102.160这台工作节点上
[root@master ~]# kubectl describe pods -n bubble-dev
Name: nginx-pod
Namespace: bubble-dev
Priority: 0
Node: node1/192.168.102.160
Start Time: Thu, 12 Jan 2023 08:34:01 -0500
Labels: user=v1
Annotations: <none>
Status: Running
IP: 172.17.0.2
IPs:
IP: 172.17.0.2
Containers:
nginx:
Container ID: docker://53e89cea6f2dab821a4f274be8b6fa60e39cde65dd7ecd9d3786c2618f5be6db
Image: nginx:1.17.9
Image ID: docker-pullable://nginx@sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50
Port: <none>
Host Port: <none>
State: Running
Started: Thu, 12 Jan 2023 08:34:03 -0500
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-lnn96 (ro)
tomcat:
Container ID: docker://bd2b47f17f18a5983dcb0e2c2da60a96bd016da8c2eb644b095430b1f9132884
Image: tomcat:8
Image ID: docker-pullable://tomcat@sha256:421c2a2c73f3e339c787beaacde0f7bbc30bba957ec653d41a77d08144c6a028
Port: <none>
Host Port: <none>
State: Running
Started: Thu, 12 Jan 2023 08:34:58 -0500
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-lnn96 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-lnn96:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-lnn96
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m26s default-scheduler Successfully assigned bubble-dev/nginx-pod to node1
Normal Pulled 2m25s kubelet, node1 Container image "nginx:1.17.9" already present on machine
Normal Created 2m25s kubelet, node1 Created container nginx
Normal Started 2m24s kubelet, node1 Started container nginx
Normal Pulling 2m24s kubelet, node1 Pulling image "tomcat:8"
Normal Pulled 90s kubelet, node1 Successfully pulled image "tomcat:8"
Normal Created 90s kubelet, node1 Created container tomcat
Normal Started 89s kubelet, node1 Started container tomcat
curl 172.17.0.2
curl 172.17.0.2:8080
Pod中多个容器的名称和端口号不能相同
名称不能相同
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: pod
namespace: bubble-dev
labels:
user: v1 # 标签值
spec:
containers:
- name: nginx # 容器1
image: nginx:1.17.9
- name: nginx # 容器2
image: nginx:1.17.9
端口号不能相同
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: pod
namespace: bubble-dev
labels:
user: v1 # 标签值
spec:
containers:
- name: nginx1 # 容器1
image: nginx:1.17.9
- name: nginx2 # 容器2
image: nginx:1.17.9
其中nginx2由于端口号被占用无法启动,一直在重试启动
Pod镜像拉取策略
- Always:每次都是从远程仓库拉取镜像
- IfNotPresent:如果本地有该镜像则使用本地,如果本地没有该镜像则使用远程
- Never:只使用本地镜像,不去远程仓库拉取,本地没有该镜像则会报错
yaml配置清单实例:
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: pod-name
namespace: bubble-dev
labels:
user: v1 # 标签值
spec:
containers:
- name: nginx # 容器名称
image: nginx:1.17.9
imagePullPolicy: IfNotPresent # 用于设置镜像拉取策略
Pod环境变量
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: pod-env
namespace: bubble-dev
labels:
user: v1 # 标签值
spec:
containers:
- name: nginx # 容器名称
image: nginx:1.17.9
env: # 设置环境变量列表
- name: "username"
value: "honey"
- name: "age"
value: "22"
进入容器
kubectl exec -it pod的名称 -n 命名空间 -c 容器名称 /bin/sh
kubectl exec -it pod-env -n bubble-dev -c nginx /bin/sh
读取环境变量
echo $username
echo $age
退出容器
exit
Pod端口相关设置
name <string> # 端口的名称,name在pod中是唯一的,不允许重复
containerPort <integer> # 容器要暴露的端口 (0<x<65536)
hostPort <integer> # 容器要映射到主机上的端口
hostIP <string> # 容器要映射到主机的IP(一般省略)
protocol <string> # 端口协议,必须是UDP、TCP或SCTP,默认为“TCP"
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: pod-port
namespace: bubble-dev
labels:
user: v1 # 标签值
spec:
containers:
- name: nginx # 容器名称
image: nginx:1.17.9
ports: # 设置容器暴露的端口号列表
- name: expose-port
containerPort: 80
protocol: TCP
Pod资源相关配置
可以通过资源配置Pod对应的cpu核数、内存配置等
- limits:限制容器运行时的最大占用资源,当容器占用资源超过limits设置的值时会被终止,并进行重启;
- requests:用于设置限制容器需要的最小资源,如果环境资源不够,容器则将无法启动
cpu:核心数
memory:内存大小,可以使用Gi、Mi、G、M等形式
资源不够无法启动案例
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: pod-resource
namespace: bubble-dev
labels:
user: v1 # 标签值
spec:
containers:
- name: nginx # 容器名称
image: nginx:1.17.9
resources: # 资源配额
limits: # 最大资源限制
cpu: "2" # 限制CPU核心线程数
memory: "10Gi" # 内存限制
requests: # 最小资源限制
cpu: "1" # CPU限制,单位是core数
memory: "10Gi" # 内存限制
Pod启动命令配置
容器启动成功之后 可以执行一些脚本
apiVersion: v1
kind: Pod
metadata:
name: pod-command-test
namespace: bubble-dev
spec:
containers:
- name: busybox
image: busybox:1.30
查看pod信息,busybox停止了
这是因为busybox容器启动后,它会自动关闭,我们可以通过启动命令写脚本,让busybox一直在运行。
apiVersion: v1
kind: Pod
metadata:
name: pod-command
namespace: bubble-dev
spec:
containers:
- name: busybox
image: busybox:1.30
command: [ "/bin/sh","-c","while true;do sleep 3; done;"]
“/bin/sh”,“-c”:使用sh执行命令
“while true;do sleep 3; done;”:一直死循环,为了避免cpu飙高的问题 休眠3s时间
可以发现,busybox仍在运行。