Kubernetes Pod 深入解析,Pod创建和常见 pod控制器

如果你还没有Kubernets环境,请先查看Kubernetes集群环境安装指南

pod 是什么?

  • pod是kubenetes中最小的调度单元,kubernetes是通过定义一个pod资源,然后在pod里运行容器,容器需要指定一个镜像,这样就可以用来运行具体的服务,一个pod封装一个容器或多个容器
  • pod里的容器共享存储,网络等,也就是说把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程
  • pod是需要调度到k8s集群的工作节点来运行的,具体运行到哪个节点,是根据seheduler调度器实现的

pod 如何管理多个容器

pod中可以同时运行多个容器,同一个pod中的容器会自动分配到同一个node节点上,同一个pod中的容器共享资源、网络环境 ,他们总是被同时调度,在一个pod中同时运行多个容器是一种比较高级的用法,只有当你的容器需要紧密配合协作的时候才考虑这种模式

pod网络

pod是有IP地址的,假如pod不是共享物理机ip,有网络插件calicao,flannel等划分的ip,每个pod都被分配唯一的IP地址

k8s中共享容器的方式是,在启动pod时,先启动一个pause的容器,然后将后续的所有容器都link到这个pause的容器,以实现网络共享.

[root@pengfei-master1 ~]# kubectl get pods  -n kube-system -owide 
#具体命令解释如下
# get pods:获取 Pod 对象列表
# -n kube-system:指定命名空间为 kube-system,该命名空间通常用于存放 Kubernetes 系统组件
# -owide:以宽输出格式显示详细信息,包括 Pod 名称、所属命名空间、所在节点、IP 地址等。
# -o 输出格式除了wide,还可以输出yaml,json(常用的就这几个)
kubectl get pod

pod 存储

  • 创建pod的时候可以指定挂载的存储卷,pod中的所有容器都可以访问共享卷,允许这些容器共享数据,pod只要改在持久化数据卷,pod重启之后数据还是存在的

为什么学习了容器还要学习pod

1、Pod是由一组紧耦合的容器组成的容器组,当然目前最流行的就是Docker、containerd、podman容器,Pod就可以作为1或者多个容器的载体。

2、Pod中的所用容器会被一致调度、同节点部署,并且在一个“共享环境”中运行。Pod想成一个车:车里面好多座位,每个座位都坐不同的人,每个座位想成是一个容器,这里的“共享环境”包括以下几点: 1)所有容器共享一个IP地址和端口空间,意味着容器之间可以通过localhost高效访问,不能有端口冲突 2)允许容器之间共享存储卷,通过文件系统交互信息

3、有些容器需要紧密联系,需要一起工作。Pod提供了比容器更高层次的抽象, Pod中的所有容器使用同一个网络的namespace,即相同的IP地址和Port空间。它们可以直接用localhost通信。同样的,这些容器可以共享存储,当K8s挂载Volume到Pod上,本质上是将volume挂载到Pod中的每一个容器里。

pod工作方式

  1. 在K8s中,所有的资源都可以使用一个yaml文件来创建,创建Pod也可以使用yaml配置文件。
  2. 使用kubectl run在命令行创建Pod(不常用)

自主式pod

所谓自主式pod就是直接定一个pod资源,但存在一个问题,假如我们不小心删了pod,pod就不存在了

[root@pengfei-master1 pod]# cat pod_frist.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-test
  labels:
    app: nginx
    environment: production
  namespace: default
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

上面没指定名称空间,创建的pod默认在default名称空间

查看名称空间

注:yaml资源清单编写技巧后面将细说,可关注我看后续

使用kubectl apply创建和更新 pod

#创建和更新pod,都才用apply
# -f 指定pod yaml文件
[root@pengfei-master1 pod]# kubectl apply -f pod_frist.yaml 
pod/nginx-test created
[root@pengfei-master1 pod]# kubectl get pods -owide
NAME         READY   STATUS    RESTARTS   AGE   IP              NODE            NOMINATED NODE   READINESS GATES
nginx-test   1/1     Running   0          69s   10.244.225.65   pengfei-node2   <none>           <none>

使用kubectl delete删除pod

[root@pengfei-master1 pod]# kubectl delete -f pod_frist.yaml
pod "nginx-test" deleted
[root@pengfei-master1 pod]# kubectl get pods -owide #查看默认名称空间pod
No resources found in default namespace

通过上面可以看到,如果直接定义一个Pod资源,Pod被删除后,就彻底被删除了,这在生产环境还是有非常大风险的,所以今后我们接触的Pod,都是控制器管理的

如何基于pod运行容器

pod创建流程

创建pod流程图

创建pod流程

kubectl apply -f pod_frist.yaml>找到config文件,基于config文件指定的用户访问指定的集群,这样就找到了apiserver

第一步:
通过 kubectl 命令向 apiserver 提交创建pod的请求,apiserver接收到pod创建请求后,会将pod的属性信息(metadata)写入etcd。

第二步:
apiserver触发watch机制准备创建pod,信息转发给调度器scheduler,调度器使用调度算法选择node,调度器将node信息给apiserver,apiserver将绑定的node信息写入etcd

第三步:
apiserver又通过watch机制,调用kubelet,指定pod信息,调用容器运行时创建并启动pod内的容器。

第四步:
创建完成之后反馈给kubelet, kubelet又将pod的状态信息给apiserver,
apiserver又将pod的状态信息写入etcd。

常用的 Pod 控制器

在 Kubernetes 中,常用的 Pod 控制器有以下几种:

  1. ReplicaSet(副本集):ReplicaSet 用于确保指定数量的 Pod 副本在集群中运行。它通过定义副本数和选择器来管理 Pod 的复制,当 Pod 数量不足或超过指定的副本数时,ReplicaSet 会自动进行调整。
  2. Deployment(部署):Deployment 是 ReplicaSet 的高级抽象,提供了对应用程序部署的声明式定义。Deployment 可以轻松进行应用程序的部署、扩缩容、滚动升级和回滚操作。
  3. StatefulSet(有状态副本集):StatefulSet 用于管理有状态应用程序,如数据库、elasticsearch集群等。它确保有序地启动和终止有状态的 Pod,并为每个 Pod 分配稳定的网络标识和持久化存储。
  4. DaemonSet(守护进程集):DaemonSet 用于在集群的每个节点上运行一个 Pod 的副本。它适用于在每个节点上运行后台任务、监控代理等场景。
  5. Job(作业):Job 用于运行一次性任务或批处理任务。它创建一个或多个 Pod 来执行任务,并确保任务成功完成后终止相应的 Pod

更多内容也可以查看Kubernetes 官方文档

Comments

No comments yet. Why don’t you start the discussion?

发表评论