0%

k8s初学笔记

k8s 组件

一个k8s集群(cluster)由一组被称为节点(node)的机器组成,这些节点上运行k8s所管理的容器化应用,一个集群至少拥有一个节点

控制面板组件

控制面板组件对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的replicas时,启动新的pod)。

控制面板组件可以在集群中的任何节点上运行,然后,为了简单起见,通常会在同一个计算机上启动所有控制面板组件,并且不会在此计算机上运行用户容器。

kube-apiserver

api server组件实现了Kubernetes API供外部调用

etcd

etcd是兼具一致性和高可用性的键值数据库,可以作为保存kubernetes所有集群数据的后台数据库,这个数据库是给k8s自己使用的。

kube-scheduler

该组件负责监控新创建的、并未pods分配运行的节点。

kube-controller-manager

对控制器进行管理的组件,kubernetes有如下控制器

  • 节点控制器(Node Controller):负责节点出现故障时进行通知和响应

  • 任务控制器(Job Controller):检测代表一次性任务的job对象,然后创建pods来运行这些任务直至这些任务运行完成

  • 端点控制器(Endpoints Controller): 填充端点对象(即加入service和pod)

  • 服务账号和令牌控制器(Service Account & Token Controller):为新的命名空间创建默认账户和API访问令牌

cloud-controller-manager

云控制管理器使得你可以将你的集群连接到云服务商提供的API之上,并将与该云平台交互的组件同与你的集群交互的组件分离开来。cloud-controller-manager仅运行于云平台的控制回路。如果你在自己的环境中运行kubernetes,或者在本地计算机运行学习环境,所部署的环境中不需要云控制器管理器。下面的控制器包含对云平台驱动的依赖:

  • 节点控制器(Node Controller):用于在节点终止响应后检查云提供商以确定节点是否已被删除

  • 路由控制器(Route Controller):用于在底层云基础架构中设置路由

  • 服务控制器(Server Controller):用于创建、更新和删除云服务商提供负载均衡器

node组件

节点组件用于维护运行pod并提供kubernetes运行环境

kubelet

一个在集群中每个节点(node)上运行的代理,它的主要任务有如下几点:

  • pod管理:kubelet定期从所监听的数据源获取节点上pod/container的期望状态(运行容器、运行的副本数量、网络或者存储如何配置等等),并调用对应的容器平台接口达到这个状态。

  • 容器健康检查:kubelet创建了容器之后还要检查容器是否正常运行,如果容器运行出错,就要根据pod设置的重启策略进行处理

  • 容器监控:kubelet会监控所在节点的资源使用情况,并是定时向master报告

kube-proxy

kube-proxy是集群中每个节点(node)上运行的网络代理,kube-proxy维护节点上的网络规则(例如iptable和ipvs规则),这些网络规则允许从集群内部或外部的网络会话与pod进行网络通信。

容器运行时(Container Runtime)

容器运行环境时负责运行容器的软件,kubernetes支持多个容器允许环境:Docker、contrainerd、CRI-O以及任何实现Kubernetes CRI(容器运行环境接口)的容器。

节点(Node)

kubernetes通过将容器放入在节点(Node)上运行的Pod来执行你的工作负载。节点可以是一个虚拟机或者物理机器。通常一个集群会有会有若干个节点。节点上的组件包括:kubelet、容器运行时以及kube-proxy。

节点状态

一个节点的状态包含一下信息

  • 地址

    • HostName:由节点的内核设置,可以通过kubelet的--hostname-override参数进行覆盖

    • ExternalIP:通常是节点的可从集群外访问的IP地址

    • InternalIP:通常是节点的仅可在集群内部访问的IP地址

  • 状态

    • Ready:如节点是健康的并已准备好接收Pod则为True;False表示节点不健康而且不能接收Pod;Unknown表示节点控制器在最近的node-monitor-grace-period期间(默认40秒)没有收到节点的消息

    • DiskPressure:Ture表示节点存在磁盘空间压力,否则为False

    • MemoryPressure:Ture表示节点存在内存压力,即节点内存可用量低,否则为False

    • PIDPressure:True表示接单存在进程压力,即节点上进程过多,否则为False

    • NetworkUnavailable:True表示节点网络配置不正确,否则为False

  • 容量与可分配:CPU、内存和可以调度到节点上的Pod的个数上限

    • capacity:标示节点拥有的资源总量

    • allocatable:标示节点上可供普通Pod消耗的资源量

  • 信息:描述节点的一般信息,如内核版本、Kubernetes版本(kubelet和kube-proxy版本)、容器运行时详细信息,已经节点使用的操作系统。kubelet从节点收集这些信息并将其发送到Kubernetes API

k8s Namespace

集群内的虚拟概念,类似于资源池的概念,一个资源池里可以有各种资源类型,绝大多数的资源都必须属于某一个namespace。一个集群初始化安装好后,会默认有如下几个namespace

  • default

  • kube-node-release

  • kube-public

  • kube-system

  • kubenetes-dashboard

可以使用kubectl get namespaces来获取当前有哪些命名空间。在k8s中,不是所有的资源都必须归属于一个命名空间,可以使用kubectl api-resources命令来查看哪些资源需要归属到一个namespace下。另外可以使用kubectl create namespace xxx来创建namespace。

k8s常见的工作流程(以创建新pod为例)

  1. 用户准备一个配置文件,通过调用API向api server发起请求创建调用

  2. api server写etcd,并将api response返回给用户

  3. 同时scheduler持续监听api server(轮训?),获取是否有需要进行pod调度,则通过调度算法,计算出最适合该pod运行的节点,同时调用api将信息更新到etcd中

  4. kubelet同样持续监听api server,判断是否有新的pod需要创建到本节点,如果有新pod需要创建,创建pod,并调用api将相关信息写入etcd