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

引言

前一篇文章我们介绍了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}}的Podports:                    # 指定服务的端口映射规则- name: serviceport       # 定义了一个名为serviceport的端口映射,将容器内的8081端口映射到服务的端口8081上protocol: TCPport: 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.comhttp:paths:- backend:serviceName: s2servicePort: 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}}的Podtemplate:               # 用于定义Pod的模板metadata:labels:             # 设置Pod的标签k8s-app: {{name}}spec:terminationGracePeriodSeconds: 10  # Pod的优雅终止期限为10秒nodeSelector:k8s-meeting: true # 按需调整volumes:    # 定义了两个存储卷log和conf- name: loghostPath: # 使用主机磁盘路径/var/log/quanshi/{{name}}进行挂载, 类型为目录或创建目录path: /var/log/quanshi/{{name}}type: DirectoryOrCreate- name: confconfigMap:        # 使用名称为{{name}}的ConfigMap配置数据进行挂载name: {{name}}containers:         # 容器定义,名称和镜像均使用占位符表示- name: {{name}}    # 容器名称image: {{image}}  # 容器使用的镜像名称env:              # 注入到系统的环境变量,程序能读到,每个Pod可以不同                 - name: NODE_IPvalueFrom:fieldRef:fieldPath: status.hostIP- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIPresources:limits:      # 指定容器可以使用的最大资源空间cpu: 2000m      # 2个CPU核心memory: 4000Mi  # 4000Mi=4GBrequests:    # 表示容器部署需要的最小资源cpu: 100m       # 占用一个CPU核心的1/10, 1C=1000mmemory: 150Mi   # 150MBsecurityContext:    # 容器特权配置,有一些特殊的场景需要配置,例如syslogprivileged: falsevolumeMounts:       # 指定容器中的挂载卷和挂载路径- 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: 80name: webclusterIP: None  # None表示不分配集群IPselector:        # 选择具有标签app: nginx的Pod与该Service关联app: nginx
---
apiVersion: apps/v1
kind: StatefulSet         # 创建的资源类型为StatefulSet
metadata:name: web
spec:serviceName: "nginx"    # 指定StatefulSet关联的Service名称为nginxreplicas: 2             # StatefulSet的副本数为2,即创建2个Pod。selector:               matchLabels:          # 通过标签选择器来选择要关联的Pod。app: nginxtemplate:               # StatefulSet创建Pod时的模板   metadata:labels:             # 设置Pod的标签为app: nginxapp: nginxspec:containers:         # 定义Pod中的容器名称和镜像名称- name: nginximage: 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-confignamespace: default        # ConfigMap所属的命名空间为default
data:special.how: very         # 定义了一个键值对,键为special.how,值为veryspecial.type: charm       # 定义了一个键值对,键为special.type,值为charm。game.properties: |        # 定义了一个键值对,键为game.properties,值为多行文本。enemies=aliens          # game.properties内部定义一个配置项,键为enemies,值为alienslives=3secret.code.allowed=truesecret.code.lives=30   ui.properties: |           # 定义了一个键值对,键为ui.properties,值为多行文本。color.good=purplecolor.bad=yellowallow.textmode=truehow.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.hqwc.cn/news/161366.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WordPress外链页面安全跳转插件

老白博客我参照csdn和腾讯云的外链跳转页面,写了一个WordPress外链安全跳转插件:给网站所有第三方链接添加nofollow标签和重定向功能,提高网站安全性。插件包括两个样式,由于涉及到的css不太一样,所以分别写了两个版本…

Linux之管道

管道 管道什么是管道匿名管道readpipe 应用有名管道mkfifoopenunlinkcopy on write 管道 什么是管道 管道是Linux中最古老的进程间通信的方式 我们把一个进程连接到另一个进程的一个数据流称作 一个管道 注意:管道只能单向通信 你可以把他看做是一种特殊的文件&…

嵌入式Linux HID多指触控/触摸设备报表描述符

这里只做一下简单记录,更为详细的修改流程后续的文章再介绍。 报表描述符 0x05, 0x0D, // Usage Page (Digitizer) 0x09, 0x04, // Usage (Touch Screen) 0xA1, 0x01, // Collection (Application) 0x85, 0x01, // Report ID (1) 0…

python 命令行界面的用户交互

背景 说一千,道一万,程序是为用户服务的,所以在程序运行过程,与用户交互以获取用户的信息输入和决策确认,是无法避免的编程需要考虑和解决的需求。 一个简单的demo 如下的程序中,程序需要生成一个新的 i…

[LeetCode] 2.两数相加

一、题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个…

FinalCutPro 移动项目的时候,遇到失去连接的文件怎么处理

FinalCutPro 移动项目的时候,遇到失去连接的文件怎么处理 有时候,FinalCutPro 项目在移动之后,一些链接到外面的文件会失去连接,文件虽然还在原有位置,但显示成下面这样: 解决方法 1. 点击菜单【文件】…

Web3时代:探索DAO的未来之路

Web3 的兴起不仅代表着技术进步,更是对人类协作、创新和价值塑造方式的一次重大思考。在 Web3 时代,社区不再仅仅是共同兴趣的聚集点,而变成了一个价值交流和创新的平台。 去中心化:超越技术的革命 去中心化不仅仅是 Web3 的技术…

华为OD机试 - 服务失效判断 - 逻辑分析(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题&a…

C++指针笔记

一.定义 是什么? 指针就是地址,相当于门牌号。通过 0x0000也可以拿到该地址里的数据, 可是如果每创建一个变量都要去记住地址编号不太方便我们使用数据,所以才有变量。作用? 通过指针(地址)间接访问内存。内存的编号…

CVE-2023-21839 weblogic rce漏洞复现

文章目录 一、漏洞影响版本二、漏洞验证三、启动反弹shell监听切换路径到jdk1.8 四、启动ldap服务五、使用CVE-2023-21839工具来进行攻击测试六、反弹shell 一、漏洞影响版本 CVE-2023-21839是Weblogic产品中的远程代码执行漏洞,由于Weblogic IIOP/T3协议存在缺陷&…

NeRF-SLAM部署运行(3060Ti)

记录在部署运行期间遇到的一些问题,分享给大家~ 一、环境 RTX 3060 Ti、8G显存、Ubuntu18.04 二、部署 1. 下载代码 git clone https://github.com/jrpowers/NeRF-SLAM.git --recurse-submodules git submodule update --init --recursive cd thirdparty/insta…