k8s概念整合

Kubernetes的概念和基本原理繁杂。本文对个人的疑难混乱概念做了整理

学习路线:Kubernetes 学习路径

  • 初步了解,在这个阶段需要对 Kubernetes 有个大体了解,知道一些 Kubernetes 中的一些基本概念和基本的使用方法。
  • 整体学习,在这个阶段需要对 Kubernetes 有整体全面的了解,知道 Kubernetes 所有核心组件的工作原理。
  • 加深学习,在这个阶段需要对 Kubernetes 的拓展生态进行了解,包括与 Kubernetes 相关的一些开源组件、持续关注 Kubernetes 社区与 CNCF 社区等。

1.基本概念

pods

  • 即容器组,是 Kubernetes 集群中最小的操作单元,如创建、调度、管理、销毁等
    一个 Pod 包含一个或多个紧密相关的容器,并共享命名空间、网络和存储卷等
  • 隔离container
  • 每个 Pod 都有一个独立IP
  • img

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 的可用性。

img

NameSpace

在Kubernetes中,Namespace(命名空间)是用于隔离和管理Kubernetes资源的一种机制。它可以将Kubernetes集群划分为多个虚拟的集群,每个Namespace中的资源互相隔离,从而实现多租户和多组织之间的资源共享和管理。

Namespace的主要作用包括:

  1. 隔离资源:不同Namespace中的资源相互隔离,避免资源冲突和影响。例如,在同一个集群中,可以将开发、测试和生产环境的资源分别放在不同的Namespace中,从而避免互相干扰和影响。
  2. 管理访问控制:通过Namespace可以实现资源的访问控制和权限管理。管理员可以为每个Namespace分配不同的角色和权限,使得不同的团队和用户拥有不同的访问权限和操作权限。
  3. 管理资源配额:通过Namespace可以限制资源的使用量和配额,从而避免资源滥用和浪费。管理员可以为每个Namespace设置不同的资源配额和限制,例如CPU、内存和存储资源等。
  4. 简化部署和管理:通过Namespace可以将相关的资源组织到一起,从而简化资源的部署和管理。管理员可以通过Namespace来自动部署和管理相关的应用程序和服务,使得资源的管理更加高效和可靠。

需要注意的是,不同的Namespace中的资源可以通过Service和Ingress等对象进行访问和通信。同时,Kubernetes中还有一些默认的Namespace,例如default、kube-system和kube-public等,分别用于存储默认的资源和集群级别的资源。

2.k8s架构

image-20230630142727042

3.yaml文件例

以部署一个Pod的yaml文件为例,简单介绍部署所需的关键信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
namespace: mem-example
spec:
containers:
- name: memory-demo-ctr
image: polinux/stress
resources:
limits:
memory: "200Mi"
requests:
memory: "100Mi"
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
volumeMounts:
- name: redis-storage
mountPath: /data/redis
volumes:
- name: redis-storage
emptyDir: {}
  • 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

img

Cluster的访问权限image-20230705114203865

不同Port的类型

img

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的可维护性和可扩展性,并提高应用程序的可靠性和性能。
查看评论