• 【云原生 | 从零开始学Kubernetes】五、Kubernetes核心技术Pod


    该篇文章已经被专栏《从零开始学k8s》收录

    在这里插入图片描述

    Pod概述

    Pod是K8S系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在K8S上运行容器化应用的资源对象,其它的资源对象都是用来支撑或者扩展Pod对象功能的,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象的,PersistentVolume资源对象是用来为Pod提供存储等等,K8S不会直接处理容器,而是Pod,Pod是由一个或多个container组成。在 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 通信。

    容器本身之间相互隔离的,一般是通过 namespacegroup 进行隔离,那么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 apply -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 已经被删除了 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    通过上面可以看到,如果直接定义一个 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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    通过上面可以发现通过 deployment 管理的 pod,可以确保 pod 始终维持在指定副本数量,而且两个pod访问哪个结果都是一样的!

    写在最后

    创作不易,如果觉得内容对你有帮助,麻烦给个三连关注支持一下我!如果有错误,请在评论区指出,我会及时更改!
    目前正在更新的系列:从零开始学k8s,从零开始学zabbix
    感谢各位的观看,文章掺杂个人理解,如有错误请联系我指出~

    在这里插入图片描述

  • 相关阅读:
    k8s入门:kubernetes-dashboard 安装
    [HDLBits] Lfsr32
    大数据技术学习笔记(五)—— MapReduce(2)
    分布式链路追踪那点事——微服务总结(三)
    华为云云耀云服务器L实例评测|搭建Domain Admin环境监控公司网站的SSL证书,实现到期提醒
    依赖倒转原则&接口隔离原则&迪米特法则&合成复用原则
    模拟实现map/set[改编红黑树实现map/set容器底层]
    自己动手搭建一个简单的网站
    局部指令和全局指令的注册和使用
    面试题总结 20231024
  • 原文地址:https://blog.csdn.net/qq_45400861/article/details/125739408