Fork me on GitHub

kubernetes系列之《Pod》

1、创建一个Pod的流程(面试易考)

用户通过kubectl命令创建一个Pod的流程:

  1. 客户端提交创建请求,可以通过API Server的Restful API,也可以使用kubectl工具,支持json和yaml格式;
  2. Api Server处理用户请求,存储Pod信息数据到etcd集群中;
  3. Scheduler调度器通过API Server查看未绑定的Pod,尝试为Pod进行分配主机,通过调度算法选择主机后,绑定到这台机器上并且把调度信息写入etcd集群;
  4. kubelet根据调度结果执行Pod创建操作,成功后将信息通过Api Server更新到etcd集群中;

整个Pod创建过程完成,每个组件都在于Api Server进行交互,Api Server就是k8s集群的中间者,组件之间的协同者,是一个集群访问入口;

2、 Pod的多种控制器

  • ReplicaSet: 代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。
  • ReplicaSet主要三个组件组成:
    • 用户期望的pod副本数量
    • 标签选择器,判断哪个pod归自己管理
    • 当现存的pod数量不足,会根据pod资源模板进行新建帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但是RelicaSet不是直接使用的控制器,而是使用Deployment。
  • Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。 参考文章:https://blog.csdn.net/bbwangj/article/details/82011573
  • DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务,比如ingress,elk.服务是无状态的,服务必须是守护进程。参考文章:https://www.cnblogs.com/xzkzzz/p/9553321.html
  • Job:只要任务或程序运行完成就立即退出,不需要重启或重建。 参考文章:https://blog.csdn.net/bbwangj/article/details/82011610
  • Cronjob:周期性任务控制,执行后就退出, 不需要持续后台运行, 参考文章:https://blog.csdn.net/bbwangj/article/details/82867830
  • StatefulSet:管理有状态应用,比如redis,mysql

3、YAML文件创建Pod

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx

4、Pod基本管理

1
2
3
4
5
6
7
8
9
10
11
12
# 创建Pod资源
$ kubectl create -f pod.yaml
# 查看pods
$ kubectl get pods nginx-pod
# 查看pod描述
$ kubectl describe pod/nginx-pod
# 更新资源
$ kubectl apply -f pod.yaml
# 删除资源
$kubectl delete -f pod.yaml
or
$kubectl delete pods nginx-pod

5、资源限制

资源的现在对项目尤为重要,以免一些Pod占用资源过高,导致当前节点资源不可用,这也就直接影响k8s整个集群的状态。这不是我们想看到的结果,所以有资源限制,结合线上业务使用情况,进行资源分配限制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
resources: # 资源限制标签
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"

requests和limits都是做资源限制的,他们的区别在于:

  • requests # pod在创建时向k8s请求的资源大小;
  • limits # 限制了这个Pod运行的最大资源空间;

6、调度约束

  • Pod.spec.nodeName # 强制约束Pod调度到指定Node节点上
  • Pod.spec.nodeSelector # 通过lable-selector机制选择节点
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    apiVersion: v1
    kind: Pod
    metadata:
    name: nginx-pod
    labels:
    app: nginx
    spec:
    # nodeName:node01
    nodeSelector:
    env_role: dev
    containers:
    - name: nginx
    image: nignx

通过label给Node主机设置标签:

1
kubectl label nodes k8s-node-129 env_role=dev

通过–show-labels查看Node的标签:

1
$ kubectl get node --show-labels

7、重启策略

  • Always: 当容器停止,总是重建容器,默认策略。
  • OnFailure: 当容器异常退出(退出状态码非0)时,才重启容器。
  • Never:当容器终止退出,从不重启容器。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    apiVersion: v1
    kind: Pod
    metadata:
    name: nginx-pod
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx
    restartPolicy: OnFailure

8、镜像拉取策略

  • IfNotPresent:默认值,镜像不存在宿主机上时才拉取
  • Always:每次创建Pod时都会重新拉取一次镜像
  • Never:Pod永远不会主动拉取这个镜像
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    apiVersion: v1
    kind: Pod
    metadata:
    name: nginx-pod
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent

9、健康检查

提供Probe机制,有以下两种类型:

  • livenessProbe
    如果检查失败,将容器杀死,根据Pod的restartPolicy来操作。
  • readinessProbe
    如果检查失败,Kubeneres会把Pod从service endpoints中剔除。

Probe支持以下三种检查方法:

  • httpGet
    发送HTTP请求,返回200-400范围状态码为成功。
  • exec
    执行Shell命令返回状态码是0为成功。
  • tcpSocket
    发起TCP Socket建立成功。

官网:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/

10、问题定位

1
2
3
kubectl describe type/name
kubectl logs type/name [-c container]
kubectl exec -it 容器名称 bash

参考文章:

-------------本文结束感谢您的阅读-------------