K8s学习笔记——资源组件篇

news2024/11/25 13:36:43

引言

前一篇文章我们介绍了K8s的概念理解和常用命令,这篇我们重点介绍K8s的资源组件和相关配置使用。

1. Node & Pod

Node:

是 Pod 真正运行的主机,可以是物理机,也可以是虚拟机。为了管理 Pod,每个 Node 节点上至少要运行 container runtime(比如 docker, rkt, containerd)、kubelet 和 kube-proxy 服务。

Pod:

是一组紧密关联的容器集合(也可以是单个容器),它们共享 IPC(进程间通信) , Network namespace 和 文件存储(需挂载到容器),是 Kubernetes 调度的基本单位。

Node和Pod的关系如下图所示:
在这里插入图片描述
上图中的Node中共有4个Pod,分别为:
在这里插入图片描述

2. Namespaces

是对一组资源和对象的抽象集合,相当于给k8s系统内部的对象划分一些命名空间。常见的 pods, services, replication controllers 和 deployments 等都是属于某一个 namespace 的(默认是 default)。

创建命名空间的配置示例:

apiVersion: v1
kind: Namespace  # 表示要创建的资源类型为命名空间
metadata:
  name: test     # 命名空间名称为test

命名空间的使用则是通过Pod或Service中的metadata.namespace字段来声明。

3. Service

是应用服务的抽象,为应用提供负载均衡和服务发现。它通过将多个 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上。

每个 Service 都会自动分配一个 cluster IP(仅在集群内部可访问的虚拟地址)和 DNS 名,其他容器可以通过该地址或 DNS 来访问服务,而不需要了解后端容器的运行。

Service模型如下所示:
在这里插入图片描述
创建Service的配置:

kind: Service               # 创建的资源类型为服务
apiVersion: v1
metadata:                   # 资源的元数据
  name: {{name}}            # 服务名称
  namespace: {{namespace}}  # 所属namespace
spec:                       # 指定服务的规格,包括选择器和端口
  selector:                 # 用于指定服务所选择的Pod的标签
    k8s-app: {{name}}       # 选择具有标签k8s-app且值为占位符{{name}}的Pod
  ports:                    # 指定服务的端口映射规则
  - name: serviceport       # 定义了一个名为serviceport的端口映射,将容器内的8081端口映射到服务的端口8081上
    protocol: TCP
    port: 8081              # 服务对外开放的访问端口
    targetPort: 8081        # 容器内端口

4. Ingress

为进入集群的请求提供路由规则的集合,类似于反向代理Nginx的作用,它可以按规则将请求路由到具体的Service上。

Ingress模型如下图示例:
在这里插入图片描述
创建Ingress的配置规则:

apiVersion: extensions/v1beta1
kind: Ingress              # 创建的资源类型为Ingress
metadata:
  name: test
spec:                      # 指定Ingress的规格,包括规则(rules)
  rules:
  - host: foo.bar.com      # 请求的主机名,会用于Request中的Host头过滤
    http:                  # 使用http协议
      paths:               # 请求路径配置
      - backend:           # 指定要请求的后端服务
          serviceName: s1  # 后端服务名称
          servicePort: 80  # 后端服务端口
  - host: bar.foo.com
    http:
      paths:
      - backend:
          serviceName: s2
          servicePort: 80

5. Deployment

用于无状态 Pod 部署声明,这些Pod对部署顺序没有要求(如nginx),可以定义 Pod 的副本数量,调度策略等,是最常用的一种部署方式,一般将 Pod 的定义内置在 Deployment 中。

Deployment的配置规则示例:

apiVersion: apps/v1
kind: Deployment          # 创建的资源类型为Deployment
metadata:
  name: {{name}}
  namespace: {{namespace}}
spec:                     # Deployment的规格,包括副本数(replicas)、选择器(selector)、模板(template)等。
  replicas: 2             # 创建2个pod副本
  selector:               # 选择Pod的条件配置 
    matchLabels:
      k8s-app: {{name}}   # 选择具有标签k8s-app且值为占位符{{name}}的Pod
  template:               # 用于定义Pod的模板
    metadata:
      labels:             # 设置Pod的标签
        k8s-app: {{name}}
    spec:
      terminationGracePeriodSeconds: 10  # Pod的优雅终止期限为10秒
      nodeSelector:
        k8s-meeting: true # 按需调整
      volumes:    # 定义了两个存储卷log和conf
      - name: log
        hostPath: # 使用主机磁盘路径/var/log/quanshi/{{name}}进行挂载, 类型为目录或创建目录
          path: /var/log/quanshi/{{name}}
          type: DirectoryOrCreate
      - name: conf
        configMap:        # 使用名称为{{name}}的ConfigMap配置数据进行挂载
          name: {{name}}
      containers:         # 容器定义,名称和镜像均使用占位符表示
      - name: {{name}}    # 容器名称
        image: {{image}}  # 容器使用的镜像名称
        env:              # 注入到系统的环境变量,程序能读到,每个Pod可以不同                 
        - name: NODE_IP
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        resources:
          limits:      # 指定容器可以使用的最大资源空间
            cpu: 2000m      # 2个CPU核心
            memory: 4000Mi  # 4000Mi=4GB
          requests:    # 表示容器部署需要的最小资源
            cpu: 100m       # 占用一个CPU核心的1/10, 1C=1000m
            memory: 150Mi   # 150MB
        securityContext:    # 容器特权配置,有一些特殊的场景需要配置,例如syslog
          privileged: false
        volumeMounts:       # 指定容器中的挂载卷和挂载路径
        - name: log         # 卷log(上面有指定)挂载到容器的/var/log/quanshi目录下
          mountPath: /var/log/quanshi
        - name: conf        # 卷conf(上面有指定)挂载到容器的/mnt/conf目录下
          mountPath: /mnt/conf

6. StatefulSet

为了解决有状态服务的部署问题,能做到有序部署,有序扩展,即 Pod 是有顺序的。在部署或者扩展的时候要依据定义的顺序依次依序进行(即从 0 到 N-1,在下一个 Pod 运行之前所有之前的 Pod 必须都是 Running 和 Ready 状态)。

典型场景有:

  • 数据库部署(如MySQL),每个Pod都有一个稳定的网络标识和唯一的持久化存储卷,可以确保数据的持久性和一致性;
  • 消息队列(如Kafka)每个Pod都有一个唯一的网络标识和持久化存储卷,确保消息的可靠性和持久化存储;
  • 分布式缓存(如Redis),每个Pod都有一个唯一的网络标识和持久化存储卷,可以确保缓存数据的可靠性和一致性。

创建StatefulSet的配置示例:

apiVersion: v1
kind: Service            # 先定义一个Service,供下文的StatefulSet使用
metadata:
  name: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None  # None表示不分配集群IP
  selector:        # 选择具有标签app: nginx的Pod与该Service关联
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet         # 创建的资源类型为StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"    # 指定StatefulSet关联的Service名称为nginx
  replicas: 2             # StatefulSet的副本数为2,即创建2个Pod。
  selector:               
    matchLabels:          # 通过标签选择器来选择要关联的Pod。
      app: nginx
  template:               # StatefulSet创建Pod时的模板   
    metadata:
      labels:             # 设置Pod的标签为app: nginx
        app: nginx
    spec:
      containers:         # 定义Pod中的容器名称和镜像名称
      - name: nginx
        image: nginx

7. DaemonSet

保证在每台 Node 上都运行一个容器实例,供主机上的所有Pod共用。常用来部署一些集群的日志、监控或者其他系统管理应用,如syslog-ng, filebeat等。

apiVersion: apps/v1
kind: DaemonSet

8. ConfigMap

用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。

典型使用场景:

  1. 配置注入:将应用程序的配置信息注入到容器中。通过将ConfigMap挂载到容器的文件系统中,应用程序可以读取ConfigMap中的配置数据并应用到运行时环境中。
  2. 动态配置更新:当应用程序的配置信息发生更改时,可以通过更新ConfigMap来实现动态配置更新。这样,无需重新构建和重新部署应用程序,就可以更新应用程序的配置。
  3. 环境变量注入:通过将ConfigMap的值设置为环境变量,可以将配置信息传递给应用程序作为环境变量。
  4. 共享配置:多个应用程序可以共享同一个ConfigMap,以便它们可以使用相同的配置信息。

创建ConfigMap的配置示例:

apiVersion: v1
kind: ConfigMap             # 创建的资源类型为ConfigMap
metadata:
  name: special-config      # ConfigMap的名称为special-config
  namespace: default        # ConfigMap所属的命名空间为default
data:
  special.how: very         # 定义了一个键值对,键为special.how,值为very
  special.type: charm       # 定义了一个键值对,键为special.type,值为charm。
  game.properties: |        # 定义了一个键值对,键为game.properties,值为多行文本。
    enemies=aliens          # game.properties内部定义一个配置项,键为enemies,值为aliens
    lives=3
    secret.code.allowed=true
    secret.code.lives=30   
  ui.properties: |           # 定义了一个键值对,键为ui.properties,值为多行文本。
    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice

9. HPA

全称为Horizontal Pod Autoscaling,可以根据 CPU 使用率或应用自定义 metrics 自动扩展 Pod 数量。

CA(Cluster AutoScaler)用于提供Node级扩容,支持更高效的扩缩容。

CA可以和 HPA配合使用:
在这里插入图片描述

参考阅读:

  • k8s学习笔记之认识理解篇:https://blog.csdn.net/xiaojia1001/article/details/134221854
  • autoscaler: https://github.com/kubernetes/autoscaler

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

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

相关文章

剖析 Tomcat 线程池与 JDK 线程池的区别和联系

文章目录 引言JDK 线程池Tomcat 线程池Tomcat 连接器Tomcat 的 ExecutorTomcat 线程池配置 区别和联系区别联系 结论 🎉欢迎来到Java面试技巧专栏~剖析 Tomcat 线程池与 JDK 线程池的区别和联系 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页&#xff1a…

qt报错permission denied

写fk项目的时候,报这个错,然后网上查,说的是因为之前运行的qt进程没有关闭,然后我在任务管理器上查看,却没有看见有我正在运行的qt程序,我再出现清除 qmake也不可以,然后我再去删除out目录下的所…

软件提示msvcp110.dll丢失的5个修复方法,快速解决dll丢失问题

你是否曾遇到过msvcp110.dll文件丢失的情况?msvcp110.dll是Microsoft Visual C 2012运行时库中的一个动态链接库文件,它是Visual Studio 2012编译的程序所必需的。它包含了许多C标准库函数的实现,如字符串处理、数学运算等。当我们运行一个程…

C# 文件 文件夹 解除占用

文件/文件夹 解除占用或直接删除。 编程语言:C# 这个就不用过多功能描述了。 注册windows 文件/文件夹 右键菜单。 文件夹解除占用:遍历文件夹所有文件,判断是否被占用,先解除文件占用,后解除文件夹占用&#xff0…

Pikachu(一)

暴力破解 Burte Force(暴力破解)概述 “暴力破解”是一攻击手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。 为了提高…

uni-app学习笔记

目录 一、前期准备 1、项目认识 2、pages.json基本配置 3、创建页面 二、tabBar 1、获取图标 2、代码配置 三、基础认识 1、页面生命周期 2、App.vue应用生命周期 四、基础组件 1、scroll-view可滚动视图区域 2、提示框 3、swiper滑块视图容器 4、form表单组件 一…

第 370 周赛 100112. 平衡子序列的最大和(困难,离散化,权值树状数组)

太难了,看答案理解了半天 题目的要求可以理解为 nums[ij] - ij > nums[ii] - ii ,所以问题化为求序列 bi nums[i] - i 的非递减子序列的最大元素和需要前置知识,离散化,树状数组离散化:将分布大却数量少(即稀疏)的…

【嵌入式框架】搭建调试输出、建立时间系统

一、Zorb简介 Zorb Framework是一个基于面向对象的思想来搭建一个轻量级的嵌入式框架。 搭建Zorb Framework的目的是为在不能运行Linux的芯片上快速开发应用,不用反复造轮子。 Zorb Framework的初步设计功能有: 1、时间系统功能zf_time 2、环形缓冲…

微信小程序获取openid

1.需要小程序中调用 wx.login获取临时code值(每次获取的code值只能用一次) wx.login({success (res) {console.log(res)} }) 打印结果为: 2.调用微信提供的apid接口,获取openid,入参需要三个参数:AppID(小…

SPSS单因素方差分析

前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…

Python 用户输入和字符串格式化指南

Python 允许用户输入数据。这意味着我们可以向用户询问输入。在 Python 3.6 中,使用 input() 方法来获取用户输入。在 Python 2.7 中,使用 raw_input() 方法来获取用户输入。以下示例要求用户输入用户名,并在输入用户名后将其打印在屏幕上&am…

Prometheus接入AlterManager配置企业微信告警(基于K8S环境部署)

文章目录 一、创建企业微信机器人二、配置AlterManager告警发送至企业微信三、Prometheus接入AlterManager配置四、部署PrometheusAlterManager(放到一个Pod中)五、测试告警 注意:请基于 PrometheusGrafana监控K8S集群(基于K8S环境部署)文章之上做本次实验。 一、创…

IDEA快捷键总结+常识积累

&#xff08;一&#xff09;常用快捷键总结 以下快捷键输入完成后按Tab键即可。 1、输入main public static void main(String[] args) {}2、输入sout System.out.println();3、输入fori for (int i 0; i < ; i) {}4、输入foreach&#xff08;增强for循环快捷键&#x…

CMake引用QT、CMake构建一个转换为3d tile的开源代码

在CMake里单独运行一下 find_package(Qt5 REQUIRED COMPONENTS Core Xml Test) ,Core Xml Test 这三个是需要的qt组件; 情况如下;提示找不到QT; 根据资料,cmake引用qt需要3-4个方面, 首先Qt包含三个编译工具:moc、uic、rcc, moc:元对象编译器(Meta O…

翻页电子杂志制作功略,快收藏,保管好用!

翻页电子杂志&#xff0c;我相信这对大家很熟悉吧&#xff0c;大家也都经常看电子杂志吧。它和我们的生活紧密相关&#xff0c;也极大地改变了我们的阅读方式。听到这“翻页电子杂志”&#xff0c;是不是觉得制作起来肯定很难很复杂&#xff0c;需要专业的人才能制作呢&#xf…

2023 年最值得推荐的 10 款 iPhone 数据恢复软件

iPhone 从来都不是一个简单的打电话电话。它就像一台微型电脑&#xff0c;让我们互相联系、拍照、拍视频、发邮件、看文档、看书。然而&#xff0c;随着它成为日常生活的必需品&#xff0c;我们总是容易因各种原因丢失数据&#xff0c;如删除、恢复出厂设置、iOS 错误、文件同步…

python 之softmx 函数

文章目录 总的介绍小应用 总的介绍 Softmax函数是一个常用的激活函数&#xff0c;通常用于多类别分类问题中。它将一个实数向量转换为概率分布。这个函数的输出是一个概率分布&#xff0c;表示输入样本属于每个可能类别的概率。 给定一个具有 (K) 个不同数值的实数向量 z (z1…

从功能测试到测试开发,待遇翻倍,我整理的超全学习指南!

在这个吃技术的IT行业来说&#xff0c;我刚入行的时候每天做的也是最基础的工作&#xff0c;但是随着时间的消磨&#xff0c;我产生了对自我和岗位价值和意义的困惑。 一是感觉自己在浪费时间&#xff0c;另一个就是做了快2年的测试&#xff0c;感觉每天过得浑浑噩噩&#xff…

【Spring Security】Spring Security 认证与授权

在前面的章节中,我们沿用了Spring Security默认的安全机制:仅有一个用户,仅有一种角色。在实际开发中,这自然是无法满足需求的。本章将更加深入地对Spring Security迚行配置,且初步使用授权机制。 3.1 默认数据库模型的认证与授权 3.1.1、资源准备 首先,在controller包…

Linux文件共享的完美助手:深入探索Samba和NFS

1 samba介绍 1.1 samba基本介绍 作用&#xff1a;网络文件共享 smb&#xff08;Server Message Block &#xff09;是 Miscrosoft公司软件。 cifs &#xff08; Common Internet File System &#xff09;是Sum公司开发&#xff0c;是smb的开源版。 1.2 samba基本信息 服务启…