如果你还没有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(常用的就这几个)
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工作方式
- 在K8s中,所有的资源都可以使用一个yaml文件来创建,创建Pod也可以使用yaml配置文件。
- 使用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流程
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 控制器有以下几种:
- ReplicaSet(副本集):ReplicaSet 用于确保指定数量的 Pod 副本在集群中运行。它通过定义副本数和选择器来管理 Pod 的复制,当 Pod 数量不足或超过指定的副本数时,ReplicaSet 会自动进行调整。
- Deployment(部署):Deployment 是 ReplicaSet 的高级抽象,提供了对应用程序部署的声明式定义。Deployment 可以轻松进行应用程序的部署、扩缩容、滚动升级和回滚操作。
- StatefulSet(有状态副本集):StatefulSet 用于管理有状态应用程序,如数据库、elasticsearch集群等。它确保有序地启动和终止有状态的 Pod,并为每个 Pod 分配稳定的网络标识和持久化存储。
- DaemonSet(守护进程集):DaemonSet 用于在集群的每个节点上运行一个 Pod 的副本。它适用于在每个节点上运行后台任务、监控代理等场景。
- Job(作业):Job 用于运行一次性任务或批处理任务。它创建一个或多个 Pod 来执行任务,并确保任务成功完成后终止相应的 Pod
更多内容也可以查看Kubernetes 官方文档