大家好,欢迎来到IT知识分享网。
1 Pods介绍
概念:Pod是Kubernetes中的最小调度单元,k8s是通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定一个镜像,这样就可以用来运行具体的服务。一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程。
Pod是需要调度到k8s集群的工作节点来运行的,具体调度到哪个节点,是根据scheduler调度器实现的。
2 Pod 管理多个容器
Kubernetes 集群中的 Pod 主要有两种用法:
- 运行单个容器的 Pod。“每个 Pod 一个容器” 模型是最常见的 Kubernetes 用例; 在这种情况下可以将 Pod 看作单个容器的包装器。Kubernetes 直接管理 Pod,而不是容器。
- 运行多个需要协同工作的容器的 Pod。 Pod 可以封装由多个紧密耦合且需要共享资源的并置容器组成的应用。 这些位于同一位置的容器可能形成单个内聚的服务单元 —— 一个容器将文件从共享卷提供给公众, 而另一个单独的边车容器则刷新或更新这些文件。 Pod 将这些容器和存储资源打包为一个可管理的实体。
Pod中可以同时运行多个容器。同一个Pod中的容器会自动的分配到同一个 node 上。同一个Pod中的容器共享资源、网络环境,它们总是被同时调度,在一个Pod中同时运行多个容器是一种比较高级的用法,只有当你的容器需要紧密配合协作的时候才考虑用这种模式。例如,你有一个容器作为web服务器运行,需要用到共享的volume,有另一个“sidecar”容器来从远端获取资源更新这些文件。
2.1 init容器与边车容器(sidecar)
在 Kubernetes 中,边车容器 是在主应用容器之前启动并持续运行的容器。 Init 容器:在 Pod 初始化期间完成运行的容器。
Init 容器与普通的容器非常像,除了如下两点:
- 它们总是运行到完成。
- 每个都必须在下一个启动之前成功完成。
如果 Pod 的 Init 容器失败,kubelet 会不断地重启该 Init 容器直到该容器成功为止。 然而,如果 Pod 对应的 restartPolicy 值为 “Never”,并且 Pod 的 Init 容器失败, 则 Kubernetes 会将整个 Pod 状态设置为失败。
边车容器是与主应用容器在同一个 Pod 中运行的辅助容器。 这些容器通过提供额外的服务或功能(如日志记录、监控、安全性或数据同步)来增强或扩展主应用容器的功能, 而无需直接修改主应用代码。
4 学习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中的每一个容器里。
4.1 使用pod的好处
4.1.1 代码自动发版更新
假如生产环境部署了一个go的应用,而且部署了几百个节点,希望这个应用可以定时的同步最新的代码,以便自动升级线上环境。这时,我们不希望改动原来的go应用,可以开发一个Git代码仓库的自动同步服务,然后通过Pod的方式进行编排,并共享代码目录,就可以达到更新java应用代码的效果。
4.1.2 收集业务日志
某服务模块已经实现了一些核心的业务逻辑,并且稳定运行了一段时间,日志记录在了某个目录下,按照不同级别分别为 error.log、access.log、warning.log、info.log,现在希望收集这些日志并发送到统一的日志处理服务器上。
这时我们可以修改原来的服务模块,在其中添加日志收集、发送的服务,但这样可能会影响原来服务的配置、部署方式,从而带来不必要的问题和成本,也会增加业务逻辑和基础服务的藕合度。
如果使用Pod的方式,通过简单的编排,既可以保持原有服务逻辑、部署方式不变,又可以增加新的日志收集服务。
而且如果我们对所有服务的日志生成有一个统一的标准,或者仅对日志收集服务稍加修改,就可以将日志收集服务和其他服务进行Pod编排,提供统一、标准的日志收集方式。
这里的“核心业务服务”、“日志收集服务”分别是一个镜像,运行在隔离的容器环境中。
5 Pod的工作方式
在K8s中,所有的资源都可以使用一个yaml文件来创建,创建Pod也可以使用yaml配置文件。或者使用kubectl run在命令行创建Pod(不常用)。
5.1 自主式Pod
所谓的自主式Pod,就是直接定义一个Pod资源,如下:
导入镜像
[root@master1 ~]# ctr -n=k8s.io images import xianchao-tomcat.tar.gz unpacking docker.io/xianchao/tomcat-8.5-jre8:v1 (sha256:14dae4798a335e2925e4ee07b3ccd519a67faab2a9155adeb76add8d7)...done [root@node1 ~]# ctr -n=k8s.io images import xianchao-tomcat.tar.gz unpacking docker.io/xianchao/tomcat-8.5-jre8:v1 (sha256:14dae4798a335e2925e4ee07b3ccd519a67faab2a9155adeb76add8d7)...done
定义一个pod资源
[root@master1 ~]# vim pod-tomcat.yaml [root@master1 ~]# cat pod-tomcat.yaml apiVersion: v1 kind: Pod metadata: name: tomcat-test namespace: default labels: app: tomcat spec: containers: - name: tomcat-java ports: - containerPort: 8080 image: xianchao/tomcat-8.5-jre8:v1 imagePullPolicy: IfNotPresent
申请资源文件并查看pod是否创建成功
[root@master1 ~]# kubectl apply -f pod-tomcat.yaml pod/tomcat-test created [root@master1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE tomcat-test 1/1 Running 0 39s [root@master1 ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES tomcat-test 1/1 Running 0 4m34s 10.244.166.142 node1 <none> <none>
但是自主式Pod是存在一个问题的,假如我们不小心删除了pod:
[root@master1 ~]# kubectl delete pods tomcat-test pod "tomcat-test" deleted [root@master1 ~]# kubectl get pods No resources found in default namespace.
结果是空,说明pod已经被删除了
如果直接定义一个Pod资源,那Pod被删除,就彻底被删除了,不会再创建一个新的Pod,这在生产环境还是具有非常大风险的,所以今后我们接触的Pod,都是控制器管理的。
5.2 控制器管理的Pod
常见的管理Pod的控制器:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。
控制器管理的Pod可以确保Pod始终维持在指定的副本数运行。
[root@master1 ~]# ctr -n=k8s.io images import xianchao-nginx.tar.gz unpacking docker.io/xianchao/nginx:v1 (sha256:47f9a127fcda0c39a444b9aeabcf71f0aa2c450b7bdb7434aca)...done [root@node1 ~]# ctr -n=k8s.io images import xianchao-nginx.tar.gz unpacking docker.io/xianchao/nginx:v1 (sha256:47f9a127fcda0c39a444b9aeabcf71f0aa2c450b7bdb7434aca)...done
定义资源清单
[root@master1 ~]# vim nginx-deploy.yaml [root@master1 ~]# cat nginx-deploy.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-test labels: app: nginx-deploy spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: my-nginx image: xianchao/nginx:v1 imagePullPolicy: IfNotPresent ports: - containerPort: 80
申请创建资源清单文件并查看pod
[root@master1 ~]# kubectl apply -f nginx-deploy.yaml deployment.apps/nginx-test created [root@master1 ~]# kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE nginx-test 2/2 2 2 10s [root@master1 ~]# kubectl get replicaset NAME DESIRED CURRENT READY AGE nginx-test-5b76549fbd 2 2 2 47s [root@master1 ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-test-5b76549fbd-ggkmh 1/1 Running 0 67s 10.244.166.143 node1 <none> <none> nginx-test-5b76549fbd-q5z7x 1/1 Running 0 67s 10.244.166.144 node1 <none> <none>
删除其中一个pod
[root@master1 ~]# kubectl delete pod nginx-test-5b76549fbd-ggkmh pod "nginx-test-5b76549fbd-ggkmh" deleted [root@master1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-test-5b76549fbd-g9462 1/1 Running 0 9s nginx-test-5b76549fbd-q5z7x 1/1 Running 0 3m44s
发现重新创建一个新的pod
通过上面可以发现通过deployment管理的pod,可以确保pod始终维持在指定副本数量
6 Pod如何运行应用/工作流程
创建Pod流程:
kubectl apply -f nginx-deploy.yaml->找到config文件,基于config文件指定的用户访问指定的集群,这样就找到了apiserver。
- 通过kubectl命令向API Server提交创建pod的请求,API Server接收到请求后,会把pod的属性信息(metadata)写进etcd;
- API Server触发watch机制准备创建pod, 信息发给调度器Scheduler,调度器使用调度算法选择node,调度器把node信息发给API Server,API Server把绑定node的信息写进etcd;
- API Server又通过watch机制调用kubelet,指定pod信息,调用容器运行时创建并启动pod内的容器;
- 创建完成之后反馈给kubelet, kubelet又将pod的状态信息给API Server,API Server又将pod的状态信息写入etcd。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/146840.html