文章目录
Pod概述
Pod是什么
- Pod就像是豌豆荚一样,它由一个或者多个容器组成
- Pod是Kubernetes中最小的管理元素
- Pod是一个服务的多个进程的聚合单位
- 同一个Pod共享网络IP及权限
- 同一个Pod共享主机名称
- 同一个Pod共享存储设备
为什么要使用Pod
- 容器服务之间有相关性
- 启动容器的时候需要初始化或进行相关配置
Pod生命周期
- Pod对象自从创建开始至终止的时间范围称为其生命周期
- 在这段时间中,Pod处在多种不同的状态,并执行相关操作
- 创建容器为必要的操作,其他为可选操作(包括运行初始化容器、启动后钩子、存活性探测、就绪性探测以及终止前钩子等)
Pod 创建过程
Pod创建过程与状态
-
Pod相位状态
- Pod的status字段是一个PodStatus的对象,Pod对象总是应该处于其生命周期进程中以下几个相位(phase)之一
- Pending:容器创建过程中,但它尚未被调度完成
- Runnig:所有容器都已经被kubelet创建完成
- Succeeded:所有容器都已经成功终止了并不会被重启
- Failed Pod:Pod中的所有容器中至少有一个容器退出是非0状态
- Unknown:无法正常获取到Pod对象的状态信息
Pod资源文件
- Pod 资源对象文件
# 样例
--- # Yaml 文件起始标志
kind: Pod # 当前创建资源的类型
apiVersion: v1 # 当前资源对应的版本
metadata: # 属性信息,元数据
name: mypod # 属性信息,资源的名称
spec: # 资源的特性描述(规约)
containers: # 容器资源特征描述
- name: linux # 容器名称
image: myos:latest # 启动容器使用的镜像
stdin: true # 是否启用交互式(值为False时可以省略)
tty: true # 是否分配终端(值为False时可以省略)
ports: # 声明容器使用的网络协议
- protocol: TCP # 声明容器使用的协议
containerPort: 80 # 声明容器使用的端口号
使用资源文件定义Pod
- terminationGracePeriodSeconds:等待多少秒后删除,默认30S
- restartPolicy:服务故障策略
- Always(默认):Pod中容器不论如何,停止了都将重启
- Never:Pod中容器不论以任何方式停止,都不会重启
- OnFailure:Pod中容器非正常停止会自动重启,正常停止不会重启
- imagePullPolicy:镜像下载策略
- Always:每次创建Pod都会重新拉取一次镜像
- Never:Pod永远不会主动拉取这个镜像
- IfNotPresent(默认):默认值,镜像在宿主机上不存在时才拉取镜像
[root@master ~]# vim myhttpd.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: myhttpd
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Always
containers:
- name: apache
image: myos:httpd
imagePullPolicy: IfNotPresent
ports:
- protocol: TCP
containerPort: 80
[root@master ~]# kubectl apply -f myhttpd.yaml
pod/myhttpd created
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myhttpd 1/1 Running 0 3s 10.244.3.10 node-0003
[root@master ~]# curl http://10.244.3.10
Welcome to The Apache.
多容器 Pod
# 样例
--- # Yaml 文件起始标志
kind: Pod # 当前创建资源的类型
apiVersion: v1 # 当前资源对应的版本
metadata: # 属性信息,元数据
name: mynginx # 属性信息,资源的名称
spec: # 资源的特性描述(规约)
containers: # 容器资源特征描述
- name: nginx # 容器名称
image: myos:nginx # 启动容器使用的镜像
ports: # 声明容器使用的网络协议
- protocol: TCP # 声明容器使用的协议
containerPort: 80 # 声明容器使用的端口号
- name: php # 容器名称
image: myos:phpfpm # 启动容器使用的镜像
[root@master ~]# vim mynginx.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mynginx
spec:
containers:
- name: nginx
image: myos:nginx
ports:
- protocol: TCP
containerPort: 80
- name: php
image: myos:phpfpm
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mynginx 2/2 Running 0 2s
# 进入 mynginx 这个 Pod 中,容器 nginx
[root@master ~]# kubectl exec -it mynginx -c nginx -- /bin/bash
# 查看 mynginx 这个 Pod 中,容器 nginx 的日志
[root@master ~]# kubectl logs mynginx -c nginx
# 进入 mynginx 这个 Pod 中,容器 php
[root@master ~]# kubectl exec -it mynginx -c php -- /bin/bash
# 查看 mynginx 这个 Pod 中,容器 php 的日志
[root@master ~]# kubectl logs mynginx -c php
静态Pod
-
什么是静态Pod
-
静态Pod是由kubelet守护进程直接管理的Pod,不需要API服务器监管。与由控制面管理的Pod不同
-
kubelet监视每个静态Pod(在它崩溃之后重新启动)
-
静态Pod永远都会绑定到一个指定节点上的kubelet
-
静态Pod的spec不能引用其他API对象
-
静态Pod配置路径:/var/lib/kubelet/config.yaml
staticPodPath:/etc/kubernetes/manifests
-
-
创建静态Pod
[root@master ~]# cp -a mypod.yaml /etc/kubernetes/manifests/
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod-master 1/1 Running 0 10s
- 删除静态Pod
[root@master ~]# rm -f /etc/kubernetes/manifests/mypod.yaml
[root@master ~]# kubectl get pods
No resources found in default namespace.
自定义命令
- 创建Pod时,可以为其设置启动时要执行的命令和参数,如果配置了自定义命令,那么容器镜像中自带的命令与参数将会被覆盖不再执行
- 命令设置在command字段下,如果要配置命令有参数,就填写在args字段下
简单命令
[root@master ~]# vim mycmd.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mycmd
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Never
containers:
- name: linux
image: myos:v2009
imagePullPolicy: IfNotPresent
command: ["sleep"]
args: ["10"]
[root@master ~]# kubectl apply -f mycmd.yaml
pod/mycmd created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mycmd 1/1 Running 0 3s
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mycmd 0/1 Completed 0 11s
[root@master ~]# kubectl delete -f mycmd.yaml
pod "mycmd" deleted
嵌入式脚本
[root@master ~]# vim mycmd.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mycmd
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Always
containers:
- name: linux
image: myos:v2009
imagePullPolicy: IfNotPresent
command: ["/bin/bash"]
args:
- -c
- |
while true;do
sleep 5
echo "hello world."
done
[root@master ~]# kubectl apply -f mycmd.yaml
pod/mycmd created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mycmd 1/1 Running 0 6s
[root@master ~]# kubectl logs mycmd
hello world.
hello world.
hello world.
[root@master ~]# kubectl delete -f mycmd.yaml
pod "mycmd" deleted
Pod调度策略
- 调度流程
- 调度器给一个pod做调度选择包含两个步骤:过滤和打分
- 第一步过滤(筛选):
- 首先筛选出满足Pod所有的资源请求节点,这里包含计算资源、内存、存储、网络、端口号等等,如果没有节点能满足Pod的需求,Pod将一直停留在Pending状态,直到调度器能够找到合适的节点运行它
- 第二步打分(优选):
- 调度器根据打分规则给每个可调度节点打分,选择最高分节点运行Pod。如果存在多个最高分,则在其中随机选择
- 绑定
- 在确定运行节点后,调度器将这个结果通知kube-apiserver,这个过程叫做绑定
Pod定向调度
- 基于节点的调度
- nodeName 标签,让Pod运行在制定的节点上
- 注意:如果标签指定的节点无法运行Pod,它不会迁移到其他节点,将一直等待下去
[root@master ~]# kubectl get nodes node-0001
NAME STATUS ROLES AGE VERSION
node-0001 Ready <none> 3h v1.22.5
[root@master ~]# vim myhttpd.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: myhttpd
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Always
nodeName: node-0001 # 基于节点名称进行调度
containers:
- name: apache
image: myos:httpd
imagePullPolicy: IfNotPresent
ports:
- protocol: TCP
containerPort: 80
[root@master ~]# kubectl apply -f myhttpd.yaml
pod/myhttpd created
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myhttpd 1/1 Running 0 3s 10.244.1.3 node-0001