Kubernetes——Pod

文章目录

    • Pod概述
      • Pod是什么
      • 为什么要使用Pod
      • Pod生命周期
    • Pod 创建过程
    • Pod创建过程与状态
    • Pod资源文件
      • 使用资源文件定义Pod
      • 多容器 Pod
      • 静态Pod
      • 自定义命令
    • Pod调度策略
      • Pod定向调度

Pod概述

Pod是什么

  • Pod就像是豌豆荚一样,它由一个或者多个容器组成
  • Pod是Kubernetes中最小的管理元素
  • Pod是一个服务的多个进程的聚合单位
  • 同一个Pod共享网络IP及权限
  • 同一个Pod共享主机名称
  • 同一个Pod共享存储设备

为什么要使用Pod

  • 容器服务之间有相关性
  • 启动容器的时候需要初始化或进行相关配置

Pod生命周期

  • Pod对象自从创建开始至终止的时间范围称为其生命周期
  • 在这段时间中,Pod处在多种不同的状态,并执行相关操作
  • 创建容器为必要的操作,其他为可选操作(包括运行初始化容器、启动后钩子、存活性探测、就绪性探测以及终止前钩子等)
February h1 12:01 h1 12:02 h1 12:03 h1 12:04 h1 12:05 h1 12:06 h1 12:07 h1 12:08 Init1 Init2 Init3 post start liveness probe readiness probe pre stop main Container init main Pod生命周期

Pod 创建过程

User API Server etcd Scheduler kubelet Runtime create pod write Confirm Confirm watch(new pod) bind pod write Confirm Confirm watch(bound pod) Runtime-shim Confirm update pod status write Confirm Confirm User API Server etcd Scheduler kubelet Runtime

Pod创建过程与状态

  • Pod相位状态

    • Pod的status字段是一个PodStatus的对象,Pod对象总是应该处于其生命周期进程中以下几个相位(phase)之一
    1. Pending:容器创建过程中,但它尚未被调度完成
    2. Runnig:所有容器都已经被kubelet创建完成
    3. Succeeded:所有容器都已经成功终止了并不会被重启
    4. Failed Pod:Pod中的所有容器中至少有一个容器退出是非0状态
    5. Unknown:无法正常获取到Pod对象的状态信息
      Kubernetes——Pod_第1张图片

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:服务故障策略
    1. Always(默认):Pod中容器不论如何,停止了都将重启
    2. Never:Pod中容器不论以任何方式停止,都不会重启
    3. OnFailure:Pod中容器非正常停止会自动重启,正常停止不会重启
  • imagePullPolicy:镜像下载策略
    1. Always:每次创建Pod都会重新拉取一次镜像
    2. Never:Pod永远不会主动拉取这个镜像
    3. 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

你可能感兴趣的:(Kubernetes,kubernetes,docker)