k8s概念整合
Kubernetes的概念和基本原理繁杂。本文对部分个人的疑难混乱概念做了整理
学习路线:Kubernetes 学习路径
- 初步了解,在这个阶段需要对 Kubernetes 有个大体了解,知道一些 Kubernetes 中的一些基本概念和基本的使用方法。
- 整体学习,在这个阶段需要对 Kubernetes 有整体全面的了解,知道 Kubernetes 所有核心组件的工作原理。
- 加深学习,在这个阶段需要对 Kubernetes 的拓展生态进行了解,包括与 Kubernetes 相关的一些开源组件、持续关注 Kubernetes 社区与 CNCF 社区等。
1.基本概念
pods
- 即容器组,是 Kubernetes 集群中最小的操作单元,如创建、调度、管理、销毁等
一个 Pod 包含一个或多个紧密相关的容器,并共享命名空间、网络和存储卷等 - 隔离container
- 每个 Pod 都有一个独立IP
Node
Node即节点,对应一个物理节点(物理机或者虚拟机),运行和管理Pod的生命周期,以及其他属于节点上的资源对象。
Volume 数据卷
K8S 支持很多类型的 volume 数据卷挂载,具体请参见**K8S 卷。前文就“如何理解 volume”提到:“需要手动 mount 的磁盘”,此外,有一点可以帮助理解:数据卷 volume 是 Pod 内部的磁盘资源**。
volume 是 K8S 的对象,对应一个实体的数据卷;而 volumeMounts 只是 container 的挂载点,对应 container 的其中一个参数。但是,volumeMounts 依赖于 volume,只有当 Pod 内有 volume 资源的时候,该 Pod 内部的 container 才可能有 volumeMounts。
Container 容器
本文中提到的镜像 Image、容器 Container,都指代了 Pod 下的一个container
。关于 K8S 中的容器,在 2.1Pod 章节都已经交代了,这里无非再啰嗦一句:一个 Pod 内可以有多个容器 container。
在 Pod 中,容器也有分类,对这个感兴趣的同学欢迎自行阅读更多资料:
- 标准容器 Application Container。
- 初始化容器 Init Container。
- 边车容器 Sidecar Container。
- 临时容器 Ephemeral Container。
一般来说,我们部署的大多是标准容器( Application Container)。
Deployment
作用是管理和控制 Pod 和 ReplicaSet,管控它们运行在用户期望的状态中。哎,打个形象的比喻,Deployment 就是包工头,主要负责监督底下的工人 Pod 干活,确保每时每刻有用户要求数量的 Pod 在工作。如果一旦发现某个工人 Pod 不行了,就赶紧新拉一个 Pod 过来替换它。
ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。
NameSpace
在Kubernetes中,Namespace(命名空间)是用于隔离和管理Kubernetes资源的一种机制。它可以将Kubernetes集群划分为多个虚拟的集群,每个Namespace中的资源互相隔离,从而实现多租户和多组织之间的资源共享和管理。
Namespace的主要作用包括:
- 隔离资源:不同Namespace中的资源相互隔离,避免资源冲突和影响。例如,在同一个集群中,可以将开发、测试和生产环境的资源分别放在不同的Namespace中,从而避免互相干扰和影响。
- 管理访问控制:通过Namespace可以实现资源的访问控制和权限管理。管理员可以为每个Namespace分配不同的角色和权限,使得不同的团队和用户拥有不同的访问权限和操作权限。
- 管理资源配额:通过Namespace可以限制资源的使用量和配额,从而避免资源滥用和浪费。管理员可以为每个Namespace设置不同的资源配额和限制,例如CPU、内存和存储资源等。
- 简化部署和管理:通过Namespace可以将相关的资源组织到一起,从而简化资源的部署和管理。管理员可以通过Namespace来自动部署和管理相关的应用程序和服务,使得资源的管理更加高效和可靠。
需要注意的是,不同的Namespace中的资源可以通过Service和Ingress等对象进行访问和通信。同时,Kubernetes中还有一些默认的Namespace,例如default、kube-system和kube-public等,分别用于存储默认的资源和集群级别的资源。
2.k8s架构
3.yaml文件例
以部署一个Pod的yaml文件为例,简单介绍部署所需的关键信息
1 |
|
apiVersion
记录 K8S 的 API Server 版本,现在看到的都是v1
,用户不用管。kind
记录该 yaml 的对象,比如这是一份 Pod 的 yaml 配置文件,那么值内容就是Pod
。metadata
记录了 Pod 自身的元数据,比如这个 Pod 的名字、这个 Pod 属于哪个 namespace(命名空间的概念,后文会详述,暂时理解为“同一个命名空间内的对象互相可见”)。spec
记录了 Pod 内部所有的资源的详细信息,看懂这个很重要:containers
记录了 Pod 内的容器信息,containers
包括了:name
容器名,image
容器的镜像地址,resources
容器需要的 CPU、内存、GPU 等资源,command
容器的入口命令,args
容器的入口参数,volumeMounts
容器要挂载的 Pod 数据卷等。可以看到,上述这些信息都是启动容器的必要和必需的信息。volumes
记录了 Pod 内的数据卷信息,后文会详细介绍 Pod 的数据卷。
4.其他混乱概念
Service和Deployment
- Service监控某一Deployment(并转发其中的端口),进而监控Deployment内部的Container
Cluster的访问权限
不同Port的类型
port
- nodePort: 使用nodeIp:nodePort 从外部访问请求某个service
- Port: k8s 集群内部访问service端口, 通过clusterip:port 请求某个service
- targetPort:是pod的端口,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器
- containerPort:是pod内部容器的端口,targetPort映射到containerPort
pod和Container的关系
- Pod是Kubernetes中最小的可部署对象,它可以理解为一个逻辑主机,可以包含一个或多个Container,以及共享的网络和存储资源。容器是运行应用程序的实际载体,它们可以在同一个Pod中协同工作,或者在不同的Pod中独立运行,从而实现更灵活的应用程序部署和管理。
- 需要注意的是,在设计Pod时,应该避免将多个不相关的容器放在同一个Pod中。通常情况下,一个Pod应该只包含一个主要容器,例如应用程序容器,以及一些辅助容器,例如日志收集器和监控代理等。这样可以确保Pod的可维护性和可扩展性,并提高应用程序的可靠性和性能。