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

news2025/4/22 3:31:37

了解集群、标签、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,默认TCP
    targetPort: 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.0
    name: collect
    command: ["/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-volume
  name: pod-volume
  namespace: default
spec:
  containers:
  # 第一个容器(应用容器)
  - image: nginx:1.23
    name: web
    volumeMounts:                # 卷挂载
    - name: log                  # 挂载的卷名称
      mountPath: /var/log/nginx  # 卷挂载到容器中路径
  # 第二个容器(日志采集容器)
  - image: cooect:1.0
    name: collect
    command: ["/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: user
    spec:              # Pod规格
      containers:      # Pod容器配置
      - image: user-srvice:v3
        name: 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也只是真正相关知识的九牛一毛而已。但是学习一门新技术,不能按部就班地一个一个章节死磕每个知识点。要先对整体有个大概了解,着重看最主要最常用的功能,之后再反复的看书实践,提取知识点。

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

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

相关文章

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

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

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…

静态时序分析: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

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 定义颜色和游戏参数…

【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 或者直接…

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

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

基于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 函数 三、总结与多线…

vue组件库el-menu导航菜单设置index,地址不会变更的问题

请先确认 1.路由已配置好 route-index.js如下&#xff0c; 2.view-ProHome.vue中已预留路由展示位 3.导航菜单复制组件库&#xff0c;并做修改 其中index与路由配置的地址一致 运行后发现点击菜单&#xff0c;url地址还是不变&#xff0c;查看组件库 Element - The worlds …

MySQL 优化方案

一、MySQL 查询过程 MySQL 查询过程是指从客户端发送 SQL 语句到 MySQL 服务器&#xff0c;再到服务器返回结果集的整个过程。这个过程涉及多个组件的协作&#xff0c;包括连接管理、查询解析、优化、执行和结果返回等。 1.1 查询过程的关键组件 连接管理器&#xff1a;管理…

智能对话小程序功能优化day1-登录鉴权

目录 1.数据库表构建。 2.完善登录相关的实例对象。 3.登录相关功能实现。 4.小程序效果。 最近尝试下trae加入claude3.7后的读图生成代码功能&#xff0c;可以看到简单的页面一次性生成确实准确率高了不少&#xff0c;想起来之前笔记中开发的智能问答小程序功能还是有些简…

MinIO的预签名直传机制

我们传统使用MinIo做OSS对象存储的应用方式往往都是在后端配置与MinIO的连接和文件上传下载的相关接口&#xff0c;然后我们在前端调用这些接口完成文件的上传下载机制&#xff0c;但是&#xff0c;当并发量过大&#xff0c;频繁访问会对后端的并发往往会对服务器造成极大的压力…