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

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

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还包含一个或多个紧密相关的用户业务容器。


4.png


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 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 已经被删除了


通过上面可以看到,如果直接定义一个 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访问哪个结果都是一样的!

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
监控 Cloud Native Java
Quarkus 云原生Java框架技术详解与实践指南
本文档全面介绍 Quarkus 框架的核心概念、架构特性和实践应用。作为新一代的云原生 Java 框架,Quarkus 旨在为 OpenJDK HotSpot 和 GraalVM 量身定制,显著提升 Java 在容器化环境中的运行效率。本文将深入探讨其响应式编程模型、原生编译能力、扩展机制以及与微服务架构的深度集成,帮助开发者构建高效、轻量的云原生应用。
228 44
|
28天前
|
Kubernetes Cloud Native 云计算
云计算与云原生技术探索
🌟蒋星熠Jaxonic,云原生探索者!以代码为舟,遨游技术星河。专注容器化、微服务、K8s与DevOps,践行GitOps理念,拥抱多云未来。用架构编织星辰,让创新照亮极客征途!
云计算与云原生技术探索
|
20天前
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
211 2
|
5月前
|
人工智能 Cloud Native 安全
云原生+AI 为企业出海提供全新技术引擎!明天见
5月22日 14:00「飞天发布时刻」,阿里云云原生应用平台产品负责人李国强将重磅揭晓面向 AI 场景的云原生产品体系升级,通过弹性智能的全球一体化架构、开箱即用的云原生 AI 工程化能力,为中国企业出海提供全新技术引擎。
|
6月前
|
Cloud Native 关系型数据库 分布式数据库
|
6月前
|
存储 关系型数据库 分布式数据库
|
5月前
|
存储 缓存 分布式计算
StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
本文将深入探讨基于 StarRocks 和 Iceberg 构建的云原生湖仓分析技术,详细解析两者结合如何实现高效的查询性能优化。内容涵盖 StarRocks Lakehouse 架构、与 Iceberg 的性能协同、最佳实践应用以及未来的发展规划,为您提供全面的技术解读。 作者:杨关锁,北京镜舟科技研发工程师
StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
|
3月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
181 0
|
6月前
|
存储 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:高可用-无感切换篇
阿里云PolarDB云原生数据库在TPC-C基准测试中以20.55亿tpmC的成绩刷新世界纪录,单位成本仅0.8元人民币。PolarDB通过VotingDisk实现秒级故障切换,RPO=0,提供高可用性。PolarDB还推出国产轻量版,兼具高性能与低成本,满足多样化需求。

热门文章

最新文章

推荐镜像

更多