【云原生 | Kubernetes 实战】02、k8s 核心资源 Pod 介绍

news2024/9/22 17:32:37

目录

一、Pod是什么?

白话解释:

1.1 Pod如何管理多个容器?

1.1.2 Pod网络

1.1.3 Pod存储

1.2 之前学习过容器(如docker),为什么还需要Pod?

1.2.1 代码自动发版更新

1.2.2 收集业务日志 

1.3 Pod工作方式

1.3.1 自主式Pod(不推荐)

1.3.2 控制器管理的Pod(推荐)

二、如何基于Pod运行应用?


  • K8s官方文档:https://kubernetes.io/
  • K8s中文官方文档: https://kubernetes.io/zh/
  • K8s Github地址:https://github.com/kubernetes/kubernetes
  • Pod资源对应的官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/

一、Pod是什么?

        官方文档:https://kubernetes.io/docs/concepts/workloads/pods/

        Pod是Kubernetes中的最小调度单元,k8s是通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定一个镜像,这样就可以用来运行具体的服务。一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程。

        Pod是需要调度到k8s集群的工作节点来运行的,具体调度到哪个节点,是根据scheduler调度器实现的。 

白话解释:

        可以把pod看成是一个“豌豆荚”,里面有很多“豆子”(容器)。一个豌豆荚里可以有很多豆子(容器)

        pod相当于一个逻辑主机——比方说我们想要部署一个tomcat应用,如果不用容器,我们可能会部署到物理机、虚拟机或者云主机上,那么出现k8s之后,我们就可以定义一个pod资源,在pod里定义一个把tomcat容器,所以pod充当的是一个逻辑主机的角色。 

1.1 Pod如何管理多个容器?

        Pod中可以同时运行多个容器。同一个Pod中的容器会自动的分配到同一个 node 上。同一个Pod中的容器共享资源、网络环境,它们总是被同时调度,在一个Pod中同时运行多个容器是一种比较高级的用法,只有当你的容器需要紧密配合协作的时候才考虑用这种模式。例如,你有一个容器作为web服务器运行,需要用到共享的volume,有另一个“sidecar”容器来从远端获取资源更新这些文件。

        一些Pod有init容器和应用容器。 在应用程序容器启动之前,运行初始化容器。

1.1.2 Pod网络

        Pod是有IP地址的,假如pod不是共享物理机ip,由网络插件(calico、flannel、weave)划分的ip,每个pod都会被分配到唯一的IP地址。

# 查看所有 pod 详细信息,包括pod 的状态、ip、分配的节点等信息
[root@k8s-master01 ~]# kubectl get pod -A -owide

# 或者查看指定命名空间下的pod
[root@k8s-master01 ~]# kubectl get pods -n kube-system -owide

Docker容器互联的方式:

        创建新容器的时候,通过--net container参数,指定其和已经存在的某个容器共享一个Network Namespace。如下图所示,右方黄色新创建的container,其网卡共享左边容器。因此就不会拥有自己独立的 IP,而是共享左边容器的 IP 172.17.0.2 、端口范围等网络资源。

# 例如和已经存在的none容器共享网络
[root@k8s-master01 ~]# docker run --name container2 --net=container:none -it centos --privileged=true 

 docker 网络详解可用查看这篇文章:【云原生 | Docker 高级篇】06、Docker 网络模式详解_Stars.Sky的博客-CSDN博客

Kubernetes中容器共享的方式:

        在k8s中,启动Pod时,会先启动⼀个pause 的容器,然后将后续的所有容器都 link 到这个pause 的容器,以实现⽹络共享。 

1.1.3 Pod存储

        创建Pod的时候可以指定挂载的存储卷。 POD中的所有容器都可以访问共享卷,允许这些容器共享数据。 Pod只要挂载持久化数据卷,Pod重启之后数据还是会存在的。

1.2 之前学习过容器(如docker),为什么还需要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中的每一个容器里。 

1.2.1 代码自动发版更新

        假如生产环境部署了一个go的应用,而且部署了几百个节点,希望这个应用可以定时的同步最新的代码,以便自动升级线上环境。这时,我们不希望改动原来的go应用,可以开发一个Git代码仓库的自动同步服务,然后通过Pod的方式进行编排,并共享代码目录,就可以达到更新java应用代码的效果。

1.2.2 收集业务日志 

        某服务模块已经实现了一些核心的业务逻辑,并且稳定运行了一段时间,日志记录在了某个目录下,按照不同级别分别为 error.log、access.log、warning.log、info.log,现在希望收集这些日志并发送到统一的日志处理服务器上。

        这时我们可以修改原来的服务模块,在其中添加日志收集、发送的服务,但这样可能会影响原来服务的配置、部署方式,从而带来不必要的问题和成本,也会增加业务逻辑和基础服务的藕合度。

        但如果使用Pod的方式,通过简单的编排,既可以保持原有服务逻辑、部署方式不变,又可以增加新的日志收集服务。

        而且如果我们对所有服务的日志生成有一个统一的标准,或者仅对日志收集服务稍加修改,就可以将日志收集服务和其他服务进行Pod编排,提供统一、标准的日志收集方式。

        这里的“核心业务服务”、“日志收集服务”分别是一个镜像,运行在隔离的容器环境中。 

1.3 Pod工作方式

        在K8s中,所有的资源都可以使用一个yaml文件来创建,创建Pod也可以使用yaml配置文件。或者使用kubectl run在命令行创建Pod(不常用)。 

1.3.1 自主式Pod(不推荐)

所谓的自主式Pod,就是直接定义一个Pod资源,如下:

#1. 创建pod yaml资源文件:
[root@k8s-master01 pod-yaml]# vi 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:latest
    imagePullPolicy: IfNotPresent

#2. k8s集群(三台机子都要)拉取相关镜像
docker pull tomcat

#3. 创建pod
[root@k8s-master01 pod-yaml]# kubectl apply -f pod-tomcat.yaml

#4. 查看pod是否创建成功
[root@k8s-master01 pod-yaml]# kubectl get pods -owide -l app=tomcat
[root@k8s-master01 pod-yaml]# kubectl get pods

但是自主式Pod是存在一个问题的,假如我们不小心删除了pod:

[root@k8s-master01 pod-yaml]# kubectl delete pods tomcat-test 
pod "tomcat-test" deleted

# 查看pod是否还在
[root@k8s-master01 pod-yaml]# kubectl get pods
No resources found in default namespace.
[root@k8s-master01 pod-yaml]# kubectl get pods -l app=tomcat
No resources found in default namespace.

        结果是空,说明pod已经被删除了通过上面可以看到,如果直接定义一个Pod资源,那Pod被删除,就彻底被删除了,不会再创建一个新的Pod,这在生产环境还是具有非常大风险的,所以今后我们接触的Pod,都是控制器管理的。 

1.3.2 控制器管理的Pod(推荐)

        常见的管理Pod的控制器:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。控制器管理的Pod可以确保Pod始终维持在指定的副本数运行。如,通过Deployment管理Pod 

#1. k8s集群拉取 nginx 镜像
docker pull nginx

#2. 创建资源清单文件
[root@k8s-master01 pod-yaml]# vi pod-nginx.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:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

#3. 更新资源清单文件
[root@k8s-master01 pod-yaml]# kubectl apply -f pod-nginx.yaml

#4. 查看pods
[root@k8s-master01 pod-yaml]# kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
nginx-test-7767bdd4d-r4qt7   1/1     Running   0          33s
nginx-test-7767bdd4d-rqrm5   1/1     Running   0          33s

# 查看Deployment
[root@k8s-master01 pod-yaml]# kubectl get deployments.apps 
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
nginx-test   2/2     2            2           49s

#5. 删除一个pod
[root@k8s-master01 pod-yaml]# kubectl delete pods nginx-test-7767bdd4d-r4qt7
pod "nginx-test-7767bdd4d-r4qt7" deleted

#6. 再次查看,立马又重新创建了一个pod
[root@k8s-master01 pod-yaml]# kubectl get pods 
NAME                         READY   STATUS    RESTARTS   AGE
nginx-test-7767bdd4d-d5pqv   1/1     Running   0          8s
nginx-test-7767bdd4d-rqrm5   1/1     Running   0          3m52s

通过上面可以发现通过deployment管理的pod,可以确保pod始终维持在指定副本数量。 

二、如何基于Pod运行应用?

创建pod流程: 

kubectl apply -f pod-nginx.yaml->找到(/root/.kube/config)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。

上一篇文章:【云原生 | Kubernetes 实战】01、K8s-v1.25集群搭建和部署基于网页的 K8s 用户界面 Dashboard_Stars.Sky的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Kubernetes系列】工作负载资源之ReplicaSet

文章目录概述工作原理何时使用示例ReplicaSet的配置Pod 模板Pod 选择算符Replicas操作使用ReplicaSet删除 ReplicaSet 和它的 Pod只删除 ReplicaSet将 Pod 从 ReplicaSet 中隔离扩缩 ReplicaSetReplicaSet 的替代方案Deployment(推荐)裸 PodJobDaemonSet…

twitter推文采集案例

案例内容:twitter的推文采集。 通过游客身份获取twitter中用户的推文。 用户推文:只能翻22页,1页45条左右。 每个用户最多获取最近900条推文 (登录后),不登录区别也不大。 UserByScreenName 一般只有用户名的时候,需要先通过UserByScreenName接口获取 rest_id 用于后…

frp穿透你的远程桌面

缘起 作为一个程序员,经常会遇到需要使用远程桌面的述求(居家办公、加班,你懂的)。所以,在网上找一圈远程桌面解决方案之后,最终还是使用frp来穿透远程桌面。(推荐使用) 前提 需要…

计算机内功修炼:程序的机器级表示(C与汇编)

程序的机器级表示历史观点程序编码1. 机器级代码2. 代码示例数据格式访问信息1. 操作数指示符2. 数据传送指令算术与逻辑操作1. 加载有效地址2. 一元操作和二元操作3. 移位操作例子特殊的算术操作控制1. 条件码2. 访问条件码3. 跳转指令及编码4. 翻译条件分支5. 循环6. 条件传送…

[附源码]计算机毕业设计JAVA龙虎时代健身房管理系统

[附源码]计算机毕业设计JAVA龙虎时代健身房管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM …

JDBC数据库的连接

JDBC数据库的连接 简介:本文以简洁的篇幅带领大家快速入门java连接数据库,以查询为演示方案。 编写代码步骤 创建工程,导入驱动jar包 下载官网:https://downloads.mysql.com/archives/c-j/ 注册驱动 # mysql5的注册驱动的办法…

BEV感知PETR-V1和PETR-V2

参考代码:PETR 1. 概述 介绍:这两篇文章提出了以位置编码转换(PETR,position embedding transformation)为基础的BEV感知方法,按照方法中组件不同可将PETR划分为V1和V2版本。在V1版本中提出了基础版本的PE…

【C++】c++11学习-常用特性总结

前言 由于种种历史原因,C的C11版本更新带来了很多有用的东西~,在C98的基础语法体系之上,来看看C11新增了哪些实用的特性吧~ (加把劲~~(๑╹◡╹)ノ""") 目录 一、列表初始化 1.原始的列…

Mysql8.x版本主从加读写分离(二) mysql8.x读写分离

Mysql8.x版本主从加读写分离(一) mysql8.x主从_争取不加班!的博客-CSDN博客 Mycata需要使用jdk 单独一台服务器部署的mycat 192.168.11.143 手动上传jdk的包 tar zxvf jdk-8u121-linux-x64.tar.gz -C /usr/local/ 解压 cd /usr/local…

c++ - 第14节 - c++中的多态

1. 多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。举个栗子:比如买票这个行为,当普通人买票时,是全价买票;学生…

如何运行黑马程序员redis项目黑马点评(hm-dianping)、常见报错解决与部分接口的测试方法

文章目录一、相关链接二、下载代码方法一:使用git clone方法二:直接下载程序zip压缩包三、如何运行这份代码运行sql文件1、先新建数据库hmdp2、导入项目中的hmdp.sql文件修改application.yaml配置文件配置Mysql1、配置驱动2、配置url(这个不一…

Allwinner T3 汽车级处理器为工业级 SoM 提供动力

Allwinner T3 是一款四核 Cortex-A7 汽车级处理器,支持 -40C 至 85C 的宽工业温度范围。对比了全志T3的规格后,我觉得和全志A40i差不多,因为全志有不同的事业部,T系列是面向车规级市场,而A系列一直以来都是面向平板市场…

python之Matplotlib

1.数据可视化是什么? 数据可视化是将数据转换为图或表等信息图像,以一种更直观的方式展示和呈现数据.可视化,是通过图形化的手段进行有效地表达,准确高效,简洁全面地传递某种信息,甚至帮助我们发现某种规律和特征,挖掘数据背后的价值. 2. Matplotlib是什么? matplotlib是一…

教程:如何将一首歌生成一个二维码?

大雨打在树叶上的声音、烟花绽放的声音、邻居家的狗叫声、海浪和沙滩的决斗声、冬天的风掀翻路人衣服的声音、小孩练琴的声音、啤酒冒泡的声音…… 哦,还有你唱歌的声音,这些都可以做成一个二维码。扫码后就可以听到。 如今,声音二维码已经…

华为云GaussDB打造金融行业坚实数据底座,共创数字金融新未来

近期,由北京金融信息化研究所主办的首届中国金融业数据库技术大会在京顺利举行,大会邀请了金融主管单位领导、金融机构高层、以及数据库企业代表和众多数据库领域专家,共同畅谈金融行业数据库应用的创新发展和实践成果。华为云数据库服务产品…

为什么重写 equals 还要重写 hashCode 方法?

关于equals与hashCode关系的描述 我们可以先来看一下这个定理 (1)如果两个对象的 hashCode 值相等的情况下,对象的内容值不一定相等(hash碰撞问题) (2)如果使用 equals 方法比较两个对象内容值…

世界杯“引爆”东南亚电商狂潮,电商人如何选品和营销?

世界杯,作为最受关注的国际赛事之一,2022年的世界杯已经在卡塔尔拉开帷幕,中国元素无处不在,为跨境电商行业带来很多新机遇。对于跨境电商来说,更是要牢牢抓住这场全球赛事的商机!那么跨境电商人应该如何紧…

全面焕新|详解 Grafana v9.0.x 新增功能特性

Grafana 9.0 是一个提升 Grafana 易用性的版本,通过全新的和改进的操作界面来获取数据,以及默认的 Grafana 警报体验。 Grafana 的一个主要使命是让可观测性、数据可视化和分析更容易的惠及到每个人。对于像 Prometheus 和 Loki 这样的流行数据源&#…

基于Jeecgboot前后端分离的ERP系统开发代码生成(四)

今天主要做一个采购入库单的功能 这个是主从表,所以也是通过online表单设计完成基本功能 1、采购入库单 按照上面生成代码,基本的录入编辑等功能就可以了,当然一些细节需要后续完善 选择商品 2、审核通过 对于库存的更新,需要进行…

跨境电商独立站站群模式

首先我们来了解一下什么是独立站组模式?独立站群模式是指通过建站工具快速建立多个网站。每个网站都有独立的域名,每个网站只存放某个垂直领域的产品,包装成专业的工厂和卖家。每个网站的产品详情和公司实力展示尽量完美(不是市面上的复制品)…