【云原生 | 从零开始学Kubernetes】五、Kubernetes核心技术Pod
时间:2022-08-30 07:30:00
本文已被专栏从零开始学习k8s》收录
Pod详解
- Pod概述
-
- Pod基本概念
- Pod存在的意义
- Pod多何管理多个容器?
- Pod实现机制
-
- 共享网络
- 共享存储
- Pod 工作方式
- 实战:创造自主式 Pod
- 实战:创建控制器管理 Pod
- 写在最后
Pod概述
Pod是K8S可以在系统中创建和管理的最小单元是用户在资源对象模型中创建或部署的最小资源对象模型K8S上运行容器应用的资源对象和其他资源对象用于支持或扩展Pod例如,控制器对象用于控制对象功能Pod对象的,Service或者Ingress用于暴露的资源对象Pod引用对象,PersistentVolume资源对象对象Pod提供存储等等,K8S容器不会直接处理,而是Pod,Pod一个或多个container组成。在 Pod 在操作容器时,容器需要指定一个镜像来操作特定的服务。在 Pod 在操作容器时,容器需要指定一个镜像来操作特定的服务。 Pod 包装一个容器(或多个容器),Pod 容器共享存储、网络等。也就是说,我们应该把整个放在一边 pod 它被视为虚拟机,然后每个容器相当于在虚拟机中运行的过程。
Pod 需要调度 k8s 根据集群的工作节点,具体调度到哪个节点 scheduler 实现了调度器。
pod 相当于一个逻辑主机,比方说我们想要部署一个 tomcat 应用程序,如果不使用容器,我们可能会部署在物理机器、虚拟机或云主机上,那么它就会出现 k8s 之后,我们可以定义一个 pod 资源,在 pod 里定义一个 tomcat 容器,所以 pod 充当逻辑主机的角色。
Pod是Kubernetes最重要的概念,每一个Pod都有一特殊的被称为 根容器Pause容器。Pause容器对应的镜像属于Kubernetes除了平台的一部分Pause容器,每个Pod它还包含一个或多个密切相关的用户业务容器。
Pod基本概念
- 最小部署单元
- Pod【一组容器集合】由一个或多个容器组成
- 一个pod集装箱共享网络命名空间
- Pod是短暂的
- 每个Pod它包含一个或多个切相关的用户业务容器
Pod存在的意义
- 创建容器使用docker,一个docker对应一个容器,一个容器运行一个应用程序
- Pod它是多过程设计,使用多个应用程序,即一个Pod多个容器在一个容器中运行应用程序
- Pod亲密应用的存在是为了亲密应用
- 两个应用程序交互
- 通过127.0.0.1 或 socket】
- 两个应用之间需要频繁调用
Pod是K8S集群中所有业务类型的基础可以是Pod看作运行在K8S集群中的小机器人需要不同类型的小机器人来执行不同类型的业务。K8S的业务主要可以分为以下几种
- 长期伺服型:long-running
- 批处理型:batch
- 节点后台支撑型:node-daemon
- 状态应用型:stateful application
对应上述类型的小型机器人控制器有:Deployment、Job、DaemonSet 和 StatefulSet
Pod多何管理多个容器?
Pod 多个容器可以同时运行。同一个 Pod 中间容器将自动分配到同一个容器 node 上。同一个 Pod 在一个容器共享资源和网络环境中,它们总是同时调度 Pod 只有当你的容器需要密切合作时,才会考虑使用这种模式。例如,你有一个容器作为容器 web 需要共享的服务器运行 volume,有另一个“sidecar从远端获取资源更新这些文件的容器。
一些 Pod 有 init 容器和应用容器。 初始化容器在应用程序容器启动前运行。
Pod实现机制
主要有以下两种机制
- 共享网络
- 共享存储
共享网络
Pod 是有 IP 地址,每个 pod 都是唯一分配的 IP 地址(IP 地址依赖于网络插件 calico、flannel、 weave 等分配),POD 容器共享网络名称空间包括 IP 地址和网络端口。 Pod 可以使内容器 用 localhost 相互通信。 Pod 中间的容器也可以通过网络插件 calico 与其他节点相比 Pod 通信。
容器本身相互隔离,一般通过 namespace 和 group 隔离,然后Pod内容器如何实现通信?
- 首先,它需要满足同一容器的前提namespace之间
关于Pod要实现原则,首先要做的Pod创建根容器: pause容器
,然后我们在创建业务容器 【nginx,redis 等等,会添加到 info容器
中(info容器就是pause容器)
而在 info容器
中会独立出 ip地址,mac地址,port 等待信息,然后实现网络共享
完整步骤如下
- 通过 Pause 在容器中添加其他业务容器Pause在容器中,所有业务容器都可以在相同的名称空间中实现网络共享
共享存储
创建 Pod 可指定挂载的存储卷。 POD 所有容器都可以访问共享卷,允许这些容器共享数据。 Pod 只需挂载持久数据卷,Pod 数据重启后仍会存在。
Pod持久数据专门存储在某个地方,因为如果数据在故障转移过程中消失,损失非常严重。
Pod 工作方式
在 K8s 所有资源都可以使用 yaml 创建和创建文件 Pod 也可以使用 yaml 配置文件。或使用 kubectl run 创建命令行 Pod(不常用)。
实战:创造自主式 Pod
所谓自主式 Pod,就是直接定义一个 Pod 资源(先在node1和node2节点上用docker拉取tomcat镜像)
[root@k8smaster~]# mkdir test [root@k8smaster~]# cd test [root@k8smaster~]# vim 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: tomcat imagePullPolicy: IfNotPresent #更新资源清单 [root@k8smaster test]# kubectl aply -f pod-tomcat.yaml
#查看 pod 是否创建成功
[root@k8smaster test]# kubectl get pods -o wide -l app=tomcat
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-test 1/1 Running 0 3h9m 10.244.1.9 k8snode2 <none> <none>
#但是自主式 Pod 是存在一个问题的,假如我们不小心删除了 pod
[root@xianchaomaster1 ~]# kubectl delete pods tomcat-test
#查看 pod 是否还在
[root@xianchaomaster1 ~]# kubectl get pods -l app=tomcat
#结果是空,说明 pod 已经被删除了
通过上面可以看到,如果直接定义一个 Pod 资源,那 Pod 被删除,就彻底被删除了,不会再创建一个新的 Pod,这在生产环境还是具有非常大风险的,所以今后我们接触的 Pod 都是控制器管理的。如果是不重要的可以重新更新资源清单(yaml文件保存好)。
实战:创建控制器管理的 Pod
常见的管理 Pod 的控制器:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。
控制器管理的 Pod 可以确保 Pod 始终维持在指定的副本数运行。 比如通过 Deployment 管理 Pod。
我们首先在node1和node2拉取nginx的镜像(用docker)
#创建一个资源清单文件
[root@k8smaster test]# vim 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: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
#更新资源清单文件
[root@k8smaster test]# kubectl apply -f nginx-deploy.yaml
#查看 Deployment
[root@k8smaster test]# kubectl get deploy -l app=nginx-deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-test 2/2 2 2 119s
#查看 pod
[root@k8smaster test]# kubectl get pods -o wide -l app=nginx
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
nginx-test-84b997bfc5-6dkxx 1/1 Running 0 2m30s 10.244.2.12 k8snode <none>
nginx-test-84b997bfc5-z6lqm 1/1 Running 0 2m40s 10.244.2.11 k8snode <none>
#删除 nginx-test-84b997bfc5-6dkxx 这个 pod
[root@k8smaster test]# kubectl delete pods nginx-test-84b997bfc5-6dkxx
pod "nginx-test-84b997bfc5-6dkxx" deleted
[root@k8smaster test]# kubectl get pods -o wide -l app=nginx
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
nginx-test-84b997bfc5-6vccl 1/1 Running 0 11s 10.244.1.11 k8snode2 <none>
nginx-test-84b997bfc5-z6lqm 1/1 Running 0 3m47s 10.244.2.11 k8snode <none>
#发现重新创建一个新的 pod 是 nginx-test-84b997bfc5-6vccl
通过上面可以发现通过 deployment 管理的 pod,可以确保 pod 始终维持在指定副本数量,而且两个pod访问哪个结果都是一样的!
写在最后
创作不易,如果觉得内容对你有帮助,麻烦给个三连关注支持一下我!如果有错误,请在评论区指出,我会及时更改!
目前正在更新的系列:从零开始学k8s,从零开始学zabbix
感谢各位的观看,文章掺杂个人理解,如有错误请联系我指出~