当前位置: 首页 > article >正文

Kubernetes教程(七)了解集群、标签、Pod和Deployment

了解集群、标签、Pod和Deployment

  • 一、K8s`资源对象`
  • 二、K8s`集群`
    • 1. Master
    • 2. Node
  • 三、Namespace(命名空间)
  • 四、Label(标签)
  • 五、Pod
    • 1. 共享网络命名空间
    • 2. 共享数据
  • 六、工作负载
    • 1. 设置副本数
    • 2. 应用升级
  • 结语

Kubernetes的知识真的特别庞大,知识点多,还特别看重实践操作。我从 Kubernetes这个单词怎么拼写到在搭建好K8s集群并运行一个Nginx,花了一周的时间。我现在也是超级菜鸟一个,连入门都不算,只能边学边记录,我看的书籍是下面2本:

  • 《Kubernetes权威指南》第6版,知识点全面,对概念和原理讲的深入
  • 《Kubernetes企业级云原生运维实战》李振良编写,更偏向实战操作,以便🐮🐴们能用上K8s为老板打工
  • 个人建议先看《Kubernetes企业级云原生运维实战》,不然《Kubernetes权威指南》的第一章(共47页)都根本看不懂💀

一、K8s资源对象

K8s中的基础概念和术语大多围绕资源对象来说的,资源对象可分如下几类:

  • 基础资源对象:节点(Node)、容器组(Pod)、服务(Service)、存储卷(Volume)
  • 基础资源对象相关的事务与控制器:标签(Label)、注解(Annotation)、命名空间(Namespace)、水平扩容、配置(ConfigMap、Secret)、持久化存储(PersistentVolume、PersistentVolumeClaim、StorageClass)、工作负载控制器(Deployment、StatefulSet、DeamonSet、Job、CronJob)
  • 资源管控和权限相关:资源限制、资源配额、角色、角色绑定
  • 网络相关 :Ingress、网络策略(NetworkPolicy)等

K8s中资源对象包括几个公共属性:版本(Version)、类别(Kind)、名称(Name)、标签、注解。我们可以用YAMLJSON格式声明一个K8s资源对象,每个资源对象都有自己特定的结构定义,比如PodService的YAML文件的格式是不同的。定义好的资源对象会保存在etcd这非关系型数据库中,以便快速读写。

二、K8s集群

K8s集群(Cluster)是由MasterNode组成的。

1. Master

Master是控制节点,负责管理和控制整个集群,相当于集群的大脑,在每个K8s集群中都需要一个或一组Master。在Master上运行一下关键进程:

  • kube-apiserver:提供RESTful API接口,是对资源进行增删改查的唯一入口,也是集群控制的入口
  • kube-controller-manager:所有资源对象的自动化控制中心,相当于“大总管”
  • kube-scheduler:负责资源调度(Pod调度)

2. Node

Node是集群中的工作负载节点,是真正干活的打工人。Master会把工作负载分配给Node,当某个Node宕机,其上的工作负载会被Master转移到其他Node上。在每个Node上运行着以下关键进程:

  • kubelet:负责Pod对应容器的创建、启停等任务,听Mater的指挥,实现集群管理的基本功能
  • kube-proxy:实现K8sService通信与负载均衡机制
  • 容器运行时(如Docker):负责本机容器的创建和管理
查看集群有多少节点
kubectl get nodes查看某个Noded的信息
kubectl describe node <node_name>

三、Namespace(命名空间)

在K8s集群中还有一个重要概念-命名空间(Namespace),在大多情况下用于多租户的资源隔离,典型的思路是给每个租户分配一个命名空间。每个命名空间都是相互独立的,不同命名空间的资源对象是逻辑上相互隔离。K8s安装运行后,默认会有2个Namespace:

  • default:给用户用的,用户创建资源对象时,如不指定命名空间,会放到default命名空间
  • kube-system:存放系统相关的资源对象如网络组件、DNS组件、监控类组件
若不指定namespace,查看的是default命名空间内的资源对象
kubectl get pods通过参数查看指定命名空间"dev"的资源对象
kubectl get pods --namespace=dev

四、Label(标签)

Label(标签)是K8s一个核心概念,它就是一个key=value的键值对,其中keyvalue都是用户自定义。Lable可以被附加到NodePodDeploymentServiceVolume等资源对象上,并且 一个资源对象可以有多个标签。 在实际生产环境中,Pod应该都是有标签的,下面看个例子,就知道标签的重要性了。

  • 下面是个定义Service的yaml文件,最后的selector就是指关联有app=nginx标签的Pod
apiVersion: v1        # API版本
kind: Service         # 资源类型
metadata:             # 资源元数据name: nginx         # 资源名称
spec:                 # 资源规格ports:              # 端口映射列表- name:             # 端口名称port: 80          # 公开端口protocol: TCP     # 端口协议,支持TCP、UDP和SCTP,默认TCPtargetPort: 80    # 目标端口,即容器内应用程序监听的端口selector:           # 标签选择器app: nginx        # Pod标签

打上Label后的资源对象,之后就可以通过Lable Selector(标签选择器)查询和筛选,介绍下Lable Selector的一些例子:

  • yaml中配置release : stable标签,这个标签的值就是release=stable
  • release = stable,匹配具有release=stable标签的资源对象
  • release != stable,匹配不具有release=stable标签的资源对象
  • release in (stable, dev)匹配具有release=stablerelease=dev标签的资源对象
  • release notin (stable, dev)匹配不具有release=stablerelease=dev标签的资源对象

五、Pod

Pod(容器组)是K8s中最重要的概念之一,Pod是K8s中最小的调度单元,每一个Pod包含一个特殊的Pause容器(由K8s创建)和一个或多个密切相关的用户业务容器

  • Pod中多个业务容器是密切相关的,将Pod作为最小单位,让Pod内多个应用一起有效地调度和伸缩。
  • Pod中的多个业务容器共享Pause容器的IP,简化了密切相关容器之间的通信。
  • Pod中的多个业务容器共享Volume挂载,简化了密切相关容器之间的文件共享问题。
  • Pod都有一个唯一的Pod IP地址,一个Pod中多个容器共享Pod IP地址。
  • 集群中任意两个Pod之间都可以支持TCP/IP直接通信。

1. 共享网络命名空间

假设一个场景:有2个业务容器,一个是Nginx,一个是指标采集程序(负责采集Nginx性能指标)。这2个业务容器关系是密切相关的。指标采集容器能通过http://127.0.0.1/nginx_status直接访问Nginx容器吗?答案是不能,因为它们2个容器的网络命名空间是隔离的。但是在Pod中,这个2个容器可以共享网络命名空间,在创建一个Pod时,K8s会先创建一个Pause容器,然后业务容器会接着被创建并加入到Pause容器的网络命名空间,这样Pod中的所有容器都在同一个网络命名空间中,可以通过127.0.0.1访问彼此了。
在这里插入图片描述

假设有个collect指标采集程序的镜像,在定义Podyaml文件可以这样写。

  • kind属性的值为Pod,表明是一个定义Pod的文件
  • metadata.name是Pod名称
  • metadata.namespace是命名空间
  • metadata.labels是标签,标签的keyvalue都是自定义,所以这个标签值就是"app=pod-network"
  • spec.containers是用户容器列表,可以添加一个或多个容器
apiVersion: v1              # API版本
kind: Pod                   # 资源类型
metadata:                   # 资源元数据name: pod-network         # Pod名称namespace: default        # 指定命名空间labels:                   # Pod标签app: pod-network        # 标签的key和value都是自定义,这个标签值就是"app=pod-network"
spec:containers:               # Pod中容器列表# 第一个容器(主应用容器)- image: nginx:1.23       # 容器镜像地址name: web               # 容器名称# 第二个容器- image: collect:1.0name: collectcommand: ["/bin/bash", "-c", "while true; do sleep 1; done"] # 容器执行的命令

2. 共享数据

还是上面那个场景:一个是Nginx,一个是指标采集程序(负责采集Nginx性能指标),指标采集程序要如何读取到Nginx的访问日志文件呢?我们所熟悉的Docker Volume在K8s中也有对应的概念–Pod Volume,它被定义在Pod中,然后被Pod中各个容器挂载到自己的文件系统中。

在这里插入图片描述

  • Pod所在节点的文件系统创建一个空目录,然后挂载到2个业务容器的日志目录
  • Nginx容器的/var/log/nginx写入文件后,指标采集容器的/var/log/nginx也能使用Nginx的日志文件
  • 卷定义的volumes.name和容器挂载的volumeMounts.name要一致,这里都叫"log"
apiVersion: v1
kind: Pod
metadata:labels:app: pod-volumename: pod-volumenamespace: default
spec:containers:# 第一个容器(应用容器)- image: nginx:1.23name: webvolumeMounts:                # 卷挂载- name: log                  # 挂载的卷名称mountPath: /var/log/nginx  # 卷挂载到容器中路径# 第二个容器(日志采集容器)- image: cooect:1.0name: collectcommand: ["/bin/bash", "-c", "while true; do sleep 1; done"]volumeMounts:                # 卷挂载- name: log                  # 挂载的卷名称mountPath: /var/log/nginx  # 卷挂载到容器中的路径volumes:                  # 定义卷- name: log               # 卷名称emptyDir: {}            # 卷类型:emptyDir是临时存储,与Pod生命周期一致

在实际生产环境中,不会直接用kind : Pod这类型的Pod定义文件,一般都会用kind: Deployment类型的工作负载,所以一定要好好学习下面的工作负载

六、工作负载

通常情况下,每个Service对应的Pod副本数量都是固定的,如果一个一个手动创建Pod副本那也太麻烦了。如果有一个Pod模板,在Pod模板里指定Pod副本数量,然后再根据Pod模板创建多个Pod。从这个Pod模板就引出了K8s中的一个抽象概念:工作负载

  • 工作负载用于更高层次地创建和管理Pod,它可以定义Pod的副本数量、运行规格、调度策略等
  • K8s可以自动处理Pod的创建、更新和删除等操作,简化了用户对Pod生命周期的操作
  • 工作负载有4种类型,其中最常用的是Deployment,支持副本管理、副本数扩缩、滚动更新、版本回滚等操作

1. 设置副本数

下面看下一个Deployment的例子:

  • spec.replicas:Pod的副本数量

  • spec.template:用于自动创建新Pod副本的模板

  • spec.selector:用于指定 Deployment 所管理的 Pod 的标签,这个选择器决定了哪些 Pod 是由这个 Deployment 管理的

  • spec.template.metadata.lables:定义了 Pod 的标签,这些标签需要与上面的spec.selector中的选择器匹配,以确保 Deployment 能够识别和管理这些 Pod。

apiVersion: apps/v1    # API版本
kind: Deployment       # 资源类型
metadata:              # 资源元数据name: deploy-user-service   # 资源名称namespace: my-space      # 指定命名空间
spec:                  # 资源规格replicas: 3          # Pod副本数selector:            # 标签选择器matchLabels:       # 匹配标签app: user        template:            # Pod模板metadata:          # Pod元数据labels:          # Pod标签app: userspec:              # Pod规格containers:      # Pod容器配置- image: user-srvice:v3name: web      # 容器名称

2. 应用升级

当源代码需要升级时,需要重新构建镜像并上传到K8s集群中,以下有2中常见的升级方法:

  • 修改资源文件,将Deployment资源中的image字段修改为新的镜像地址,然后使用kubectl apply -f <资源文件>命令。
  • 使用kubectl set image <资源类型>/资源名称 <容器名称>=<镜像地址>命令更新Deployment资源的镜像地址。
kubectl set image deployment/deploy-user-service web=user-srvice:v4 -n my-space

结语

K8s的知识体系真的是太庞大了,本篇暂时写到这里,本篇涉及到的PodDeployment也只是真正相关知识的九牛一毛而已。但是学习一门新技术,不能按部就班地一个一个章节死磕每个知识点。要先对整体有个大概了解,着重看最主要最常用的功能,之后再反复的看书实践,提取知识点。

相关文章:

Kubernetes教程(七)了解集群、标签、Pod和Deployment

了解集群、标签、Pod和Deployment 一、K8s资源对象二、K8s集群1. Master2. Node 三、Namespace&#xff08;命名空间&#xff09;四、Label&#xff08;标签&#xff09;五、Pod1. 共享网络命名空间2. 共享数据 六、工作负载1. 设置副本数2. 应用升级 结语 Kubernetes的知识真的…...

zerotier搭建免费moon服务器

&#x1f31f; 前言 ZeroTier是一种基于P2P的虚拟组网工具&#xff0c;通过搭建‌Moon服务器‌可大幅提升跨运营商/跨国节点的连接质量。本文使用云服务演示部署流程。 &#x1f4cb; 准备工作 ‌注册三丰云账号‌ ‌创建CentOS 8.5实例‌ &#xff08;这里选择centos8以上&a…...

【网络安全 | 漏洞挖掘】四链路账户接管

未经许可,不得转载。 文章目录 正文正文 这一过程始于身份验证流程中的 IDOR 漏洞。登录时,后台会发送多个请求。在 Burp Suite 分析这些请求时,我注意到一个值得关注的请求: 请求: POST /validateUser {"email": "victim@example.com" }响应: {…...

【最新】DeepSeek 实用集成工具有那些?

deepseek 系列github仓库地址 【主页】deepseek-aiDeepSeek-R1DeepSeek-V3DeepSeek-VL2【本文重点介绍】awesome-deepseek-integration 注意&#xff1a;以下内容来自awesome-deepseek-integration DeepSeek 实用集成&#xff08;awesome-deepseek-integration&#xff09; 将…...

linux 的免密切换用户PAM配置

/etc/pam.d/su是Linux系统中与用户切换&#xff08;su命令&#xff09;相关的PAM&#xff08;Pluggable Authentication Modules&#xff0c;可插拔认证模块&#xff09;配置文件。以下是对它的详细介绍&#xff1a; 简介 作用 PAM是一种用于管理系统认证的机制&#xff0c;…...

Flutter_学习记录_video_player、chewie 播放视频

1. video_player 视频播放 插件地址&#xff1a;https://pub.dev/packages/video_player 添加插件 导入头文件 import package:video_player/video_player.dart;Android配置&#xff08;iOS不用配置&#xff09; 修改这个文件&#xff1a;/android/app/src/main/AndroidMani…...

【MySQL】增删改查进阶

目录 一、数据库约束 约束类型 NULL约束&#xff1a;非空约束 UNIQUE&#xff1a;唯一约束 DEFAULT&#xff1a;默认值约束 PRIMARY KEY&#xff1a;主键约束 FOREIGN KEY&#xff1a;外键约束 二、表的设计 三、新增 四、查询 聚合查询 聚合函数 GROUP BY子句 HA…...

为什么会出现redis数据库?redis是什么?

什么是 Redis? 为什么要用 Redis? 下面我将从 Redis 出现的背景、Redis 的解决方案个来回答。 1、Redis 出现的背景 互联网的应用越来越多&#xff0c;例如社交网络、电商、实时服务发展的十分迅速&#xff0c;这就导致了传统技术栈&#xff08;如关系型数据库&#xff09;…...

静态时序分析:SDC约束命令set_ideal_latency详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 当使用set_ideal_network命令将当前设计中的一组端口或引脚标记为理想网络源后&#xff0c;理想属性会沿着组合逻辑进行传播&#xff0c;理想网络中的线网和单元…...

达梦数据库查看字符集编码

select SF_GET_UNICODE_FLAG(); 返回 0 代表数据库字符集编码为 GB18030 1 代表数据库字符集编码为 UTF-8 2 代表数据库字符集编码为韩文字符集 EUC-KR...

LPDDR5x电源使用Si电容对PI和PSIJ影响分析

SoC可能包含许多高速接口&#xff0c;其中LPDDR5X目前因为高带宽、低功耗、大容量等性能优势开始逐渐在AI计算、5G通信、视频处理等领域开始使用。LPDDR5X目前的速率高达8.533 GT/s&#xff0c;以及多个为这些接口供电的IO电压轨&#xff0c;而这些IO轨的PDN需要提供低阻抗&…...

【玩转23种Java设计模式】结构型模式篇:组合模式

软件设计模式&#xff08;Design pattern&#xff09;&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...

Pac-Man(吃豆人) 游戏

目录 前言 1. Pygame游戏开发基础 1.1 Pygame简介 1.2 游戏开发基本概念 1.3 Pygame核心模块介绍 2. 游戏设计与规划 2.1 游戏规则设计 2.2 游戏对象规划 2.3 技术方案选择 3. 创建游戏窗口与初始化 3.1 初始化Pygame环境 3.2 设置游戏窗口 3.3 定义颜色和游戏参数…...

内网安全防护新思路 —— HFish + ELK 与 T-Pot 全面蜜罐系统比较分析

在当前网络安全环境日益复杂的背景下&#xff0c;企业和组织面临着来自外部与内部的多种威胁。为了更好地了解攻击者行为、捕获恶意活动并及时响应&#xff0c;部署蜜罐&#xff08;Honeypot&#xff09;系统已成为提升内网安全防护的重要手段。本文将重点介绍两种内网蜜罐防护…...

贪心算法(5)(java)k次取反后最大化的数组和

题目&#xff1a;给定一个整数数组 nums 和一个整数 k&#xff0c;你可以进行最多 k 次取反操作。每次操作可以选择数组中的一个元素并将其取反&#xff08;即 x 变为 -x&#xff09;。最终返回经过 k 次取反操作后&#xff0c;数组可能的最大总和。 解法&#xff1a;分情况讨…...

【Spring】@PostConstruct详解

在 Java 开发中&#xff0c;尤其是在基于 Spring 框架的项目里&#xff0c;我们常常会遇到需要在对象创建并完成依赖注入后&#xff0c;执行一些初始化操作的场景。PostConstruct注解正是为解决此类问题而诞生的&#xff0c;它为我们提供了一种便捷且优雅的方式来处理对象的初始…...

OEM SQL Details and Session Details 5s 或者parallel 才会在sql monitor显示

从企业管理器 13.4 版本更新 10 (RU10) 开始&#xff0c;ASH Analytics 的 SQL 详细信息和会话详细信息深入屏幕已更新为使用 Oracle JET UI。 在 Ash Analytics 中&#xff0c;单击左下角区域中“热门 SQL”中的 SQL ID 即可深入了解 SQL 详细信息。 单击右下角“热门会话”区…...

JSAR 基础 1.2.1 基础概念_空间小程序

JSAR 基础 1.2.1 基础概念_空间小程序 空间空间自由度可嵌入空间空间小程序 最新的技术进展表明&#xff0c;官网之前的文档准备废除了&#xff0c;基于xsml的开发将退出历史舞台&#xff0c;three.js和普通web结合的技术将成为主导。所以后续学习请移步three.js学习路径&#…...

Spring Security的作用

一、概述 Spring Security是一个框架&#xff0c;提供认证&#xff08;authentication&#xff09;、授权&#xff08;authorization&#xff09;和保护&#xff0c;以抵御常见攻击。对 常见漏洞 的保护提供了全面的支持&#xff0c;它对保护命令式和响应式应用程序有一流的支…...

数据结构与算法效率分析:时间复杂度与空间复杂度详解(C语言)

1. 算法效率 1.1 如何衡量一个算法的好坏&#xff1f; 在计算机程序设计中&#xff0c;衡量算法优劣的核心标准是效率。但效率不仅指运行速度&#xff0c;还需要综合以下因素&#xff1a; 时间因素&#xff1a;算法执行所需时间 空间因素&#xff1a;算法运行占用的内存空间…...

数据类设计_图片类设计之4_规则类图形混合算法(前端架构)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇,讨论图片类型设计出来后在场景中如何表达,以及图片的混合算法.前面的内容属于铺垫和基础,这篇内容和实际联系起来了. 背景图和前景图 这里笔者想先…...

从零使用docker并安装部署mysql8.3.0容器

在开始使用docker到完成mysql的安装部署&#xff0c;中间有很多的坑等着 安装docker并配置 sudo yum install docker-ce 启动docker并设置开机启动项 sudo systemctl start docker sudo systemctl enable docker查看docker是否启动 sudo systemctl status docker 或者直接…...

【从零开始学习计算机科学】编译原理(二)高级编程语言及其语法描述

【从零开始学习计算机科学】编译原理(二)高级编程语言及其语法描述 高级语言及其语法描述程序语言的定义形式语言与自动机文法的类型语言的类型自动机词法规则语法规则四则运算的语法描述布尔表达式语法描述赋值、分支、循环、程序块语句语法描述数组说明语句过程调用语句语义…...

STM32全系大阅兵(2)

接前一篇文章:STM32全系大阅兵(1) 本文内容参考: STM32家族系列的区别_stm32各个系列区别-CSDN博客 STM32--STM32 微控制器详解-CSDN博客...

cpu 多级缓存L1、L2、L3 与主存关系

现代 CPU 的多级缓存&#xff08;L1、L2、L3&#xff09;和主存&#xff08;DRAM&#xff09;构成了一个层次化的内存系统&#xff0c;旨在通过减少内存访问延迟和提高数据访问速度来优化计算性能。以下是对多级缓存和主存的详细解析&#xff1a; 1. 缓存层次结构 现代 CPU 通…...

MyBatis 的核心配置文件是干什么的? 它的结构是怎样的? 哪些是必须配置的,哪些是可选的?

MyBatis 的核心配置文件&#xff08;通常命名为 mybatis-config.xml&#xff09;是 MyBatis 应用程序的入口点&#xff0c;它定义了 MyBatis 的全局配置信息 。 核心配置文件的作用&#xff1a; 配置 MyBatis 的运行时行为: 通过 <settings> 标签设置全局参数&#xff…...

哪些业务场景更适合用MongoDB?何时比MySQL/PostgreSQL好用?

哪些业务场景更适合用MongoDB&#xff1f;何时比MySQL/PostgreSQL好用&#xff1f; 就像淘宝的个性化推荐需要灵活调整商品标签&#xff0c;MongoDB这种"变形金刚"式的数据库&#xff0c;在处理以下三类中国特色业务场景时更具优势&#xff1a; 一、动态数据就像&q…...

Java学习——day20

文章目录 1. 异常处理与优化1.1 在文件操作中使用 try-catch1.2 try-with-resources 语法1.3 使用 finally 块关闭资源1.4 代码健壮性与优化 2. 实践任务2.1 改进思路2.2 示例改进要点2.3 检查点 3. 总结3.1 改进后的完整代码&#xff1a; 4. 今日生词 今日学习目标&#xff1a…...

基于Python+SQLite实现校园信息化统计平台

一、项目基本情况 概述 本项目以清华大学为预期用户&#xff0c;作为校内信息化统计平台进行服务&#xff0c;建立网页端和移动端校内信息化统计平台&#xff0c;基于Project_1的需求实现。 本项目能够满足校内学生团体的几类统计需求&#xff0c;如活动报名、实验室招募、多…...

[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现

标题&#xff1a;[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现 水墨不写bug 文章目录 一、生产者消费者模型特点&#xff1a;二、实现2.1详细解释1. 成员变量2. 构造函数3. Isfull 和 Isempty4. Push 函数5. Pop 函数6. 析构函数7. GetSize 函数 三、总结与多线…...