Kubernetes 系列3 基本概念和术语
一.介绍
k8s中的大部分概念如Node,Pod,Replication Controller, Service等都可以被看作一种资源对象,几乎所有资源对象都可以通过k8s提供的kubectl工具(或者api编程调用)执行增、删、改、查等操作并将其保存在etcd中执行化存储。
在声明一个k8s资源对象的时候,需要注意一个关键属性:apiVersion。 以下面的pod声明为例,可以看到pod这种资源对象归属于v1这个核心api。
apiVersion: v1 kind: ReplicationController metadata: name: k8swebapi labels: name: k8swebapi spec: replicas: 2 selector: name: k8swebapi template: metadata: labels: name: k8swebapi spec: containers: - name: k8swebapi image: hushaoren/k8swebapi imagePullPolicy: Always ports: - containerPort: 5000 tolerations: - key: "node-role.kubernetes.io/master" operator: "Equal" value: "" effect: "NoSchedule"
k8s大部分常见的核心资源对象都归属于v1这个核心api, 比如node, pod, service,endpoints,namespace, rc, persistentvolume等。在版本迭代过程中,k8s先后扩展了 extensions/v1beta1, apps/v1beta1, apps/v1beta2等api组,而在1.9版本之后引入了apps/v1这个正式的扩展api组,正式淘汰了extensions/v1beta1, apps/v1beta1, apps/v1beta2这三个api组
v1: 这是Kubernetes API的第一个稳定版本。 它包含许多核心对象。
apps/v1: apps
是Kubernetes中最常见的API组,其中包含许多核心对象和v1。 它包括与在Kubernetes上运行应用程序相关的功能,如Deployments,RollingUpdates和ReplicaSets。
下面介绍kubernetes中重要的资源对象。
二.Master
k8s里的master指的是集群控制节点,在每个k8s集群里都需要有一个master来负责集群的管理和控制,基本上k8s所有控制命令都发给它,它负责具体的执行过程。master通常会占据一个独立的服务器(高可用部署建议用3台服务器),主要原因是它太重要了,是整个集群的首脑,如果它宕机或者不可用,那么对集群内容器应用的管理都将失败。
在master上运行着以下关键进程
1.kube-apiserver:提供了http rest接口的关键服务进程,是k8s里所有资源的增、删、改、查等操作的唯一入口,也是集群控制的入口进程。
2.kube-controller-manager:k8s里所有资源对象的自动化控制中心,可以将其理解为资源对象的“大总管”
3.kue-scheduler:负责资源调度(pod调度)的进程
另外,master上通常还需要部署etcd服务,因为k8s里的所有资源对象的数据都被保存在etcd中。
三.Node
与master一样,node可以是一台物理主机,也可以是一台虚拟机。node是k8s集群中的工作负载节点,每个node都会被master分配一些工作负载(docker容器),某个node宕机时,其上的工作负载会被master自动转移到其他节点上。
在每个node上都运行着以下关键进程:
kubelet:负责Pod对应的容器的创建、启停等任务,同时与master密切协作,实现集群管理的基本功能。
kube-proxy:实现k8s service的通信与负载均衡机制的重要组件。
docker engine: docker引擎,负责本机的容器创建和管理工作.
node可以在运行期间动态增加到k8s集群中,前提是在这个节点上已经正确安装,配置和启动了上述关键进程。默认情况下kubelet会向Master注册自己,这也是k8s推荐的node管理方式。一旦node被纳入集群管理范围,kubectl进程会定时向master汇报自身情况,例如:操作系统,docker版本,机器的cpu和内存情况,以及当前有哪些pod在运行等。
如果node在超过指定时间不上报消息时,会被master判定为“失联”,node的状态被标记为不可用(not ready),随后master会触发“工作负载大转移”的自动流程。
下面在master上查看集群中有多少个node:
[root@k8s-host ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-host Ready master 10d v1.17.3
然后查查看每个node的详细信息:
[root@k8s-host ~]# kubectl describe node k8s-host Name: k8s-host Roles: master Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/arch=amd64 kubernetes.io/hostname=k8s-host kubernetes.io/os=linux node-role.kubernetes.io/master= Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock node.alpha.kubernetes.io/ttl: 0 volumes.kubernetes.io/controller-managed-attach-detach: true CreationTimestamp: Mon, 11 May 2020 14:59:34 +0800 Taints: <none> Unschedulable: false Lease: HolderIdentity: k8s-host AcquireTime: <unset> RenewTime: Fri, 22 May 2020 13:00:14 +0800 Conditions: Type Status LastHeartbeatTime LastTransitionTime Reason Message ---- ------ ----------------- ------------------ ------ ------- MemoryPressure False Fri, 22 May 2020 13:00:19 +0800 Mon, 11 May 2020 14:59:30 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available DiskPressure False Fri, 22 May 2020 13:00:19 +0800 Mon, 11 May 2020 14:59:30 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure PIDPressure False Fri, 22 May 2020 13:00:19 +0800 Mon, 11 May 2020 14:59:30 +0800 KubeletHasSufficientPID kubelet has sufficient PID available Ready True Fri, 22 May 2020 13:00:19 +0800 Mon, 11 May 2020 14:59:41 +0800 KubeletReady kubelet is posting ready status Addresses: InternalIP: 192.168.0.108 Hostname: k8s-host Capacity: cpu: 2 ephemeral-storage: 41152736Ki hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 3879868Ki pods: 110 Allocatable: cpu: 2 ephemeral-storage: 37926361435 hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 3777468Ki pods: 110 System Info: Machine ID: 8f5b018f6eb344909f6cfec5ad0839ef System UUID: D28071E8-8A99-4700-BF59-54912BB14BB4 Boot ID: c62d8678-f7ea-4931-b046-04a4569f59c3 Kernel Version: 3.10.0-1062.12.1.el7.x86_64 OS Image: CentOS Linux 7 (Core) Operating System: linux Architecture: amd64 Container Runtime Version: docker://18.9.1 Kubelet Version: v1.17.3 Kube-Proxy Version: v1.17.3 Non-terminated Pods: (13 in total) Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE --------- ---- ------------ ---------- --------------- ------------- --- default k8swebapi-cgcrq 0 (0%) 0 (0%) 0 (0%) 0 (0%) 41h default k8swebapi-wkv29 0 (0%) 0 (0%) 0 (0%) 0 (0%) 41h default mysql-rc-4cvzg 0 (0%) 0 (0%) 0 (0%) 0 (0%) 5d22h kube-system coredns-7f9c544f75-czbjr 100m (5%) 0 (0%) 70Mi (1%) 170Mi (4%) 10d kube-system coredns-7f9c544f75-hwjtb 100m (5%) 0 (0%) 70Mi (1%) 170Mi (4%) 10d kube-system etcd-k8s-host 0 (0%) 0 (0%) 0 (0%) 0 (0%) 10d kube-system kube-apiserver-k8s-host 250m (12%) 0 (0%) 0 (0%) 0 (0%) 10d kube-system kube-controller-manager-k8s-host 200m (10%) 0 (0%) 0 (0%) 0 (0%) 10d kube-system kube-proxy-ht6sb 0 (0%) 0 (0%) 0 (0%) 0 (0%) 10d kube-system kube-scheduler-k8s-host 100m (5%) 0 (0%) 0 (0%) 0 (0%) 10d kube-system storage-provisioner 0 (0%) 0 (0%) 0 (0%) 0 (0%) 10d kubernetes-dashboard dashboard-metrics-scraper-7b64584c5c-7tx44 0 (0%) 0 (0%) 0 (0%) 0 (0%) 10d kubernetes-dashboard kubernetes-dashboard-79d9cd965-gp7t7 0 (0%) 0 (0%) 0 (0%) 0 (0%) 10d Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 750m (37%) 0 (0%) memory 140Mi (3%) 340Mi (9%) ephemeral-storage 0 (0%) 0 (0%) Events: <none>
上述命令展示了node的如下关键信息:
1. Node的基本信息:name名称, labels标签,CreationTimestamp创建时间
2. node当前的运行状态:node启动后会做一系列的自检工作,比如磁盘空间是否不足(DiskPressure)、内存是否不足(MemoryPressure ),PID资源是否正常(PIDPressure)。在一切正常时设置Node为Ready状态(Ready=true),master将可以在其上调试新的任务了(如启动pod)
3. node的Addresses包括:主机地址和主机名
4.node上的资源数量Capacity:描述node可用的系统资源,包括cpu,内存数量,最大可调度POD数量等
5.node可分配的资源量Allocatable:描述Node当前可用于分配的资源量
6.主机系统信息System Info:包括主机ID、docker版本号,Kubelet和kube-proxy的版本号等
7. 当前运行的pod列表概要信息
8. 已分配的资源使用概要信息Allocated,例如资源申请的最低,最大允许使用理占系统总量的百分比
9. node相关的event信息
四. Pod
pod是k8s最重要的基本概念,如下图所示,我们看到的每个pod都有一个特殊的被称为”根容器“的Pause容器,Pause容器对应的镜像属于k8s平台的一部分,除了pause容器,每个pod还包含了一个或多个紧密相关的用户业务容器。
k8s为每个pod都分配了唯一的ip地址,称之为pod ip,一个pod里的多个容器共享pod ip地址。在k8s里一个pod里的容器与另外主机上的pod容器能够直接通信(这个在前面章节中webapi +mysql有演示)。
pod有两种类型:普通的pod及静态pod(static pod),后者比较特殊,它并没有被存放在k8s的etcd存储里,而是被存放在某个具体的Node上的一个具体文件中,并且只在此Node上启动,运行。普通的Pod则会被存放在k8s的etcd存储,由master调度到某个node上并进行binding,然后该pod被对应的node上的kubelet进程实例化成一组相关的docker容器并启动。
如果pod里的容器停止时,k8s会自动检测到这个问题并且重新启动这个pod(重启Pod里的所有容器),一般场景是一个pod对应一个容器。
如果pod所在的node宕机,就会将这个node上所有的pod重新调度到其他节点上。
五. Label
Label(标签)是k8s系统中另外一个核心概念。一个Label是一个key=value的键值对,其中key与value由用户自己指定。Label可以被附加到各种资源对象上,例如Node,Pod,Service,RC等,一个资源对象可以定义任意数量的Label。label通常是在资源对象定义时确定,也可以在对象创建后动态添加或者删除。
通过给指定资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。
给某个资源对象定义一个label,就相当于给它打了一个标签,随后可以通过label selector(标签选择器)查询和筛选拥有某些Lable的资源对象。
label selector可以被类比为sql语句中的where查询条件,例如: name=mysql 这个label selector作用于pod时,可以被类比为:
select * from pod where pod's name='mysql' 这样的语句
有两种label表达式:基于等式的(equality-based)和基于集合的(set-based)。
1.基于基于等式的例子:
name=mysql :匹配所有具有标签name=mysql的资源对象。
env!=production :匹配所有不具有标签env=production的资源对象。
2. 基于集合的例子:
name in (mysql-master, mysql-slave) :匹配所有具有标签name=mysq-master或者name=mysql-lavel的资源对象。
name not in(php-fronted):匹配所有不具有标签name=php-fronted的资源对象。
结合ymal文件介绍篇一起看。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
2018-12-27 redis 系列27 Cluster高可用 (2)