kubernetes系列之《Pod》

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

用户通过kubectl命令创建一个Pod的流程:
在这里插入图片描述
客户端提交创建请求,可以通过API Server的Restful API,也可以使用kubectl工具,支持json和yaml格式;
Api Server处理用户请求,存储Pod信息数据到etcd集群中;
Scheduler调度器通过API Server查看未绑定的Pod,尝试为Pod进行分配主机,通过调度算法选择主机后,绑定到这台机器上并且把调度信息写入etcd集群;
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
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:

  • name: nginx
    image: nginx
    4、Pod基本管理

创建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整个集群的状态。这不是我们想看到的结果,所以有资源限制,结合线上业务使用情况,进行资源分配限制。

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机制选择节点
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主机设置标签:

kubectl label nodes k8s-node-129 env_role=dev
通过–show-labels查看Node的标签:

$ kubectl get node --show-labels
7、重启策略
Always: 当容器停止,总是重建容器,默认策略。
OnFailure: 当容器异常退出(退出状态码非0)时,才重启容器。
Never:当容器终止退出,从不重启容器。
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永远不会主动拉取这个镜像
    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、问题定位 kubectl describe type/name kubectl logs type/name [-c container] kubectl exec -it 容器名称 bash