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

Kubernetes-核心概念

Kubernetes核心概念

核心组件概念

Pod

Pod是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。

Pod就像豌豆荚一样,其中包含着一组(一个或多个)容器;这些容器共享存储、网络、以及怎样运行这些容器的声明。

Pod就像一台物理服务器一样,其中包含一个或多个应用容器,这些容器中运行着用户应用程序。

举例说明:

  • container(容器)— 一颗豌豆

  • Pod(容器组) — 一个豌豆荚

  • Node (节点) — 一根豌豆藤

  • Cluster(集群) — 整个豌豆田

Controller

在 Kubernetes中,用于管理和运行Pod的对象

在 Kubernetes 中,控制器通过监控集群的公共状态,并致力于将当前状态转变为期望的状态

举例说明Controller(控制器)作用:房间里的温度自动调节器

当你设置了温度,告诉了温度自动调节器你的期望状态(Desired state)。房间的实际温度是当前状态(Current state)。 通过对设备的开关控制,温度自动调节器让其当前状态接近期望状态。

一个控制器至少追踪一种类型的 Kubernetes 资源。这些对象有一个代表期望状态的 spec 字段。 该资源的控制器负责确保其当前状态接近期望状态。

  • deployment

    • 部署无状态应用。
    • 部署无状态应用:认为pod 都一样,没有顺序要求,不用考虑在哪个node 运行,随意进行扩展和伸缩。
    • 管理Pod和 ReplicaSet。
    • 部署、滚动升级等。
    • 典型的像web服务、分布式服务等。
  • StatefulSet

    • 部署有状态应用
    • 有状态应用,每个pod 都独立运行,保持pod 启动顺序和唯一性;有唯一的网络标识符,持久存储;有序,比如mysql主从;主机名称固定。 而且其扩容以及升级等操作也是按顺序进行的操作。
  • DaemonSet

    • 部署守护进程
    • Daemonset保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。 新加入的node 也同样运行在一个pod 里面。
  • job

    • 一次性任务
    • job负责批量处理短暂的一次性任务(short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
  • Cronjob

    • 周期性定时任务

Label

概念

Label是附着到object上(例如Pod)的键值对。可以在创建object的时候指定,也可以在obiect创建后随时指定。Labels的值对系统本身并没有什么含义,只是对用户才有意义。

一个Label是一个key=value的键值对,其中key与value由用户自己指定:

Label可以附加到各种资源对象上,例如Node、Pod、Service、RC等,一个资源对象可以定义任意数量的Label.同一个Labelt可以被添加到任意数量的资源对象上去,Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。

可以通过指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便于灵活、方便地进行资源分配、调度、配置、部署等管理工作。例如:部署不同版本的应用到不同的环境中;或者监控和分析应用(日志记录、监控、告警)等。

常用label示例如下所示:

版本标签:"release":"stable","release":"canary"...
环境标签:"environment":"dev","environment":"production"
架构标签:"tier":"frontend","tier":"backend","tier":"middleware'
分区标签:"partition":"customerA","partition":"customerB"...
质量管控标签:"track":"daily","track":"weekly

Label相当于我们熟悉的标签,给某个资源对象定义一个Label,就相当于给它打了一个标签,随后可以通过LabelSelector(标签选择器)查询和筛选拥有某些Label的资源对象,Kubernetes通过这种方式实现了类似SOL的简单又通用的对象查询机制。

语法与字符集
  • Label key的组成:

    • 不得超过63个字符

    • 可以使用前缀,使用/分隔,前缀必须是DNS子域,不得超过253个字符,系统中的自动化组件创建的label必须指定前缀,kubernetes.io/由kubernetes保留

    • 起始必须是字母(大小写都可以)或数字,中间可以有连字符、下划线和点

  • Label value的组成:

    • 不得超过63个字符
    • 起始必须是字母(大小写都可以)或数字,中间可以有连字符、下划线和点

Label Selector

通过label selector,客户端/用户可以指定一个object集合,通过label selector对object的集合进行操作。

Label selector有两种类型:

  • equality-based(基于等式):可以使用=、==、!=操作符,可以使用逗号分隔多个表达式

  • set-based(基于集合):可以使用in、not in、!操作符,另外还可以没有操作符,直接写出某个label的key,表示过滤有某个key的object而不管该key的value是何值,!表示没有该label的object

例如:

Label selector可以被类比为SQL语句中的where查询条件,例如,name=redis-slave这个labelSelector作用于Pod时,可以被类比为select * from pod where pods name ='redis-slave’这样的语句。

Service

将运行在一组 Pods上的应用程序公开为网络服务的抽象方法。

由于Pod是非永久性资源对象,如果使用Controller运行应用程序,可以动态创建和销毁Pod,这样就会导致无法准确访问到所想要访问的Pod

例如:如果一组 Pod(称为“后端”)为集群内的其他Pod(称为“前端”)提供功能, 那么前端如何找出并跟踪要连接的IP 地址,以便前端可以使用提供工作负载的后端部分?

是一组iptables或ipvs规划,通过把客户端的请求转发到服务端(Pod),如有多个Pod情况,亦可实现负载均衡的效果。

例如:一个图片处理后端,它运行了3个副本(Pod)。这些副本是可互换的 – 前端不需要关心它们调用了哪个后端副本。 然而组成这一组后端程序的 Pod 实际上可能会发生变化,前端客户端不应该也没必要知道,而且也不需要跟踪这一组后端的状态。

Endpoint

为Service管理后端Pod,当后端Pod被创建或销毁时,endpoints列表会更新Pod对应的IP地址,以便Service访问请求能够确保被响应。

DNS

为kubernetes集群内资源对象的访问提供名称解析,这样就可以实现通过DNS名称而非IP地址来访问服务。

  • 实现集群内Service名称解析

  • 实现集群内Pod内Container中应用访问互联网提供域名解析

kubernetes核心概念之间的关系

Pod与Controller

pod 是通过 Controller 实现应用的运维,比如伸缩,滚动升级等待。pod 和 controller 通过 label 标签建立关系。

image-20250730153538163

案例:删除其中一个 pod,查看 controller 自动创建新 pod

# 查看副本资源状态
[root@master ~]# kubectl get replicasets
NAME                    DESIRED   CURRENT   READY   AGE
nginx-7854ff8877        3         3         3       29h
tomcat-web-75469fdc74   2         2         2       3h54
# 删除一个容器查看状态
[root@master ~]# kubectl delete pod tomcat-web-75469fdc74-4hvxq 
pod "tomcat-web-75469fdc74-4hvxq" deleted
# 发现删除一个pod后会自动创建一个新pod
[root@master ~]# kubectl get pod
NAME                          READY   STATUS    RESTARTS        AGE
nginx-7854ff8877-7jrpr        1/1     Running   1 (6h59m ago)   29h
nginx-7854ff8877-knj7q        1/1     Running   1 (6h59m ago)   29h
nginx-7854ff8877-n565z        1/1     Running   1 (6h59m ago)   29h
tomcat-web-75469fdc74-9nsq6   1/1     Running   0               3h56m
tomcat-web-75469fdc74-jlqwr   1/1     Running   0               6s

查看控制器管理的标签Selector

# 查看控制器标签
# replicas:控制器会把最大值设置的比期望值高1个,因为版本迭代更新时会先创建一个后再去销毁旧版本
[root@master ~]# kubectl describe replicasets.apps tomcat-web-75469fdc74
Name:           tomcat-web-75469fdc74
Namespace:      default
Selector:       app=tomcat,pod-template-hash=75469fdc74
Labels:         app=tomcatpod-template-hash=75469fdc74
Annotations:    deployment.kubernetes.io/desired-replicas: 2deployment.kubernetes.io/max-replicas: 3deployment.kubernetes.io/revision: 1
Controlled By:  Deployment/tomcat-web
Replicas:       2 current / 2 desired
Pods Status:    2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:Labels:  app=tomcatpod-template-hash=75469fdc74pod-template-hash=75469fdc74Containers:tomcat:Image:        tomcat:9.0.85-jdk11Port:         8080/TCPHost Port:    0/TCPEnvironment:  <none>Mounts:/usr/local/tomcat/webapps/ROOT/index.html from web-content (rw,path="index.html")Volumes:web-content:Type:      ConfigMap (a volume populated by a ConfigMap)Name:      tomcat-web-contentOptional:  false
Events:Type    Reason            Age    From                   Message----    ------            ----   ----                   -------Normal  SuccessfulCreate  9m26s  replicaset-controller  Created pod: tomcat-web-75469fdc74-jlqwr

对应上pod的标签就能进行有效管理

# 查看pod信息
[root@master ~]# kubectl describe pod tomcat-web-75469fdc74-jlqwr 
Name:             tomcat-web-75469fdc74-jlqwr
Namespace:        default
Priority:         0
Service Account:  default
Node:             node2/10.1.8.102
Start Time:       Wed, 30 Jul 2025 15:55:29 +0800
Labels:           app=tomcatpod-template-hash=75469fdc74
......

Pod与Service

service 是为了防止 pod失联,提供的服务发现,类似于微服务的注册中心。定义一组 pod 的访问策略。可以为一组具有相同功能的容器应用提供一个统一的入口地址,并将请求负载分发到后端的各个容器应用上。

service 通过 selector来管控对应的 pod。根据 label 和 selector 建立关联,通过 service 实现 pod 的负载均衡。

image-20250730160948336

# 查看所有service
[root@master ~]# kubectl get service
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP        2d
nginx            NodePort    10.109.39.88     <none>        80:31807/TCP   29h
tomcat-service   NodePort    10.102.196.193   <none>        80:30080/TCP   4h22m# 查看指定tomcat-service的service
[root@master ~]# kubectl describe service tomcat-service 
Name:                     tomcat-service
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=tomcat
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.102.196.193
IPs:                      10.102.196.193
Port:                     <unset>  80/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  30080/TCP
Endpoints:                10.244.104.12:8080,10.244.166.144:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none># 查看endpoints
[root@master ~]# kubectl get endpoints
NAME             ENDPOINTS                                              AGE
kubernetes       10.1.8.100:6443                                        2d1h
nginx            10.244.104.10:80,10.244.166.142:80,10.244.166.143:80   29h
tomcat-service   10.244.104.12:8080,10.244.166.144:8080                 4h29m # 对应的2个pod的IP,pod重启会引起IP变化,会重新添加到此处

Service与DNS

通过DNS实现对Service名称解析,以此达到访问后端Pod目的。

# 查看dns的pod
[root@master ~]# kubectl get pods -n kube-system 
NAME                                       READY   STATUS    RESTARTS        AGE
calico-kube-controllers-658d97c59c-8l8gg   1/1     Running   1 (7h24m ago)   30h
calico-node-btkpt                          1/1     Running   0               31m
calico-node-tvmnq                          1/1     Running   0               31m
calico-node-xxjld                          1/1     Running   0               31m
coredns-66f779496c-hnfmz                   1/1     Running   1 (7h24m ago)   2d1h
coredns-66f779496c-wkr8r                   1/1     Running   1 (7h24m ago)   2d1h
etcd-master                                1/1     Running   3 (7h24m ago)   2d1h
kube-apiserver-master                      1/1     Running   2 (7h24m ago)   2d1h
kube-controller-manager-master             1/1     Running   3 (7h24m ago)   2d1h
kube-proxy-hxdhz                           1/1     Running   2 (7h24m ago)   47h
kube-proxy-rw8jl                           1/1     Running   1 (7h24m ago)   2d
kube-proxy-vslb4                           1/1     Running   2 (7h24m ago)   2d1h
kube-scheduler-master                      1/1     Running   2 (7h24m ago)   2d1h
metrics-server-57999c5cf7-b7cvm            1/1     Running   1 (7h24m ago)   25h# 查看service获取集群IP,dns的地址
[root@master ~]# kubectl get svc -n kube-system 
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
kube-dns         ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   2d1h
metrics-server   ClusterIP   10.98.116.255   <none>        443/TCP                  25h# 解析tomcat-service
[root@master ~]# dig -t a tomcat-service.default.svc.cluster.local. @10.96.0.10; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7 <<>> -t a tomcat-service.default.svc.cluster.local. @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49134
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;tomcat-service.default.svc.cluster.local. IN A;; ANSWER SECTION:
tomcat-service.default.svc.cluster.local. 30 IN	A 10.102.196.193;; Query time: 2 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: 三 730 16:29:18 CST 2025
;; MSG SIZE  rcvd: 125
# 验证解析地址
[root@master ~]# kubectl get svc
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP        2d1h
nginx            NodePort    10.109.39.88     <none>        80:31807/TCP   29h
tomcat-service   NodePort    10.102.196.193   <none>        80:30080/TCP   4h41m

基于 kubernetes 集群容器化应用的微服务

服务部署方式介绍

  • 单体服务架构

    • 所有服务进程运行在同一台主机内
  • 分布式服务架构

    • 服务进程分布于不同的主机,其中一台主机出现故障,不影响其它主机上的服务运行
  • 微服务架构

    • 使用容器化技术把分布式服务架构运行起来,并实现对不同的服务进程的高可用及快速发布等。

微服务架构组件(kubernetes核心概念)之间关系

以在kubernetes集群中运行LNMT(Linux、NGINX、MySQL、Tomcat)应用为例:

把kubernetes集群看做是一个IDC机房,把LNMT的Web架构应用以微服务(kubernetes集群资源对象)的方式部署到kubernetes集群中。

image-20250730170454301

中一台主机出现故障,不影响其它主机上的服务运行

  • 微服务架构
    • 使用容器化技术把分布式服务架构运行起来,并实现对不同的服务进程的高可用及快速发布等。

微服务架构组件(kubernetes核心概念)之间关系

以在kubernetes集群中运行LNMT(Linux、NGINX、MySQL、Tomcat)应用为例:

把kubernetes集群看做是一个IDC机房,把LNMT的Web架构应用以微服务(kubernetes集群资源对象)的方式部署到kubernetes集群中。

[外链图片转存中…(img-KVUlzBv7-1754901448275)]

http://www.dtcms.com/a/325774.html

相关文章:

  • 2438. 二的幂数组中查询范围内的乘积
  • flutter入门
  • 从 Kotlin ViewModel 到 Flutter:完整迁移指南与状态管理实践
  • Flutter Dialog、BottomSheet
  • Python调用C/C++函数库的多种方法与实践指南
  • LCR 120. 寻找文件副本
  • LLM 残差链接是什么
  • TRL - Transformer Reinforcement Learning SFTTrainer 和 SFTConfig
  • docker是什么以及镜像命令详解
  • ROS2学习(1)—基础概念及环境搭建
  • B 树与 B + 树解析与实现
  • 北斗水文环境监测站在水库的应用
  • Linux操作系统从入门到实战(二十)进程优先级
  • 【从零开始java学习|第一篇】java中的名词概念(JDK、JVM、JRE等等)
  • 15. xhr 对象如何发起一个请求
  • VSCode右键菜单消失,修复VSCode右键菜单
  • raid10 允许最多坏几块磁盘,如何修复阵列?
  • lesson35:数据库深度解析:从概念到MySQL实战学习指南
  • 如何使用 Watchtower 实现定时更新 docker 中的镜像并自动更新容器(附 schedule 的参数详细解释)
  • 升级 ChatGPT 提示“您的银行卡被拒绝了”或者“您的信用卡被拒绝了。请尝试用借记卡支付。“如何解决?
  • FPGA+护理:跨学科发展的探索(二)
  • CVPR 2025 | 即插即用,极简数据蒸馏,速度up20倍,GPU占用仅2G
  • 【数字图像处理系列笔记】Ch09:特征提取与表示
  • YOLOv8 训练报错:PyTorch 2.6+ 模型加载兼容性问题解决
  • GPT-5 现已上线 DigitalOcean Gradient™ AI 平台!
  • 数据大集网:精准获客新引擎,助力中小企业突破推广困局
  • UKB-GWAS资源更新
  • C++ 检测 IPv4 和 IPv6 地址合法性
  • 朝花夕拾(一)-------布尔掩码(Boolean Mask)是什么?
  • npm install报错~[master] npm install npm error code ERESOLVE npm err