写在前面

本文一起看下k8s基本架构。

1:Kubernetes的基本架构

k8s本身也是一种分布式架构,也需要在多台机器(实体机或虚拟机无差别)部署,部署的机器我们叫做节点,其中节点分为Master node即主节点,worker node即工作节点,master node是k8s的大脑,worker node主要部署k8s的其他组件,以及执行业务功能的pod,如下图:

k8s StatefulSet 固定节点 k8s worker节点_pod

可以看到上图有一个Master Node和2个worker node,我们在k8s之搭建单机集群 文章中准备的单机环境中查看node信息如下:

dongyunqi@dongyunqi-virtual-machine:~$ kubectl get node
NAME       STATUS   ROLES                  AGE   VERSION
minikube   Ready    control-plane,master   22h   v1.23.3

可以看到只有一个节点,并且其角色是master,也就是我们说到的master node,并没有worker node,这是因为我们只有一台机器,此时master node也承担了worker node的功能,所以此节点既是master node也是worker node,但首先是master node。实际上这种架构方式就是典型的控制面/数据面(Control Plane/Data Plane)架构,集群里的计算机被称为“节点”(Node),可以是实机也可以是虚机,少量的节点用作控制面来执行集群的管理维护工作,其他的大部分节点都被划归数据面,用来跑业务应用。在k8s架构里控制面就是master node,数据面就是worker node。

1.1:master node的核心组件

master node核心组件如下图:

k8s StatefulSet 固定节点 k8s worker节点_pod_02

功能如下:

api server:k8s集群对外的唯一入口,暴露了一组restful api,不管是kubectl还是worker node想要和master node通信都必须通过api server
etcd:注册中心,集群信息存储于此,只有api server能够访问
kube scheduler:负责容器编排,根据各个worker node的资源情况分配pod,相当于是部署人员
controller manager:负责系统状态的监控,故障转移,动态伸缩等功能,相当于是系统运维人员

这四个组件都是必须有的,不然k8s集群将无法正常启动,另外这4个组件都以容器的形式来运行,如下图:

k8s StatefulSet 固定节点 k8s worker节点_kubernetes_03

-n kube-system 参数,表示检查“kube-system”名字空间里的Pod,什么是命名空间我也还不知道。

既然运行的是容器,我们自然也是可以通过docker ps来看下的,不过注意不是在我们的宿主机,而是在k8s虚拟出来的机器里,所以我们需要先通过minikube ssh连接到虚机,如下:

dongyunqi@dongyunqi-virtual-machine:~$ minikube ssh
Last login: Wed Jan  4 03:05:54 2023 from 192.168.49.1
docker@minikube:~$

然后就可以通过docker ps查看四个组件对应的容器了:

# 以下是在k8s的虚拟机里操作
docker@minikube:~$ docker ps | egrep "etcd"
4e5413c6c68d   25f8c7f3da61                   "etcd --advertise-cl…"   23 hours ago   Up 23 hours             k8s_etcd_etcd-minikube_kube-system_9d3d310935e5fabe942511eec3e2cd0c_0
...
docker@minikube:~$ docker ps | egrep "controller"
0a5fd910b564   b07520cd7ab7                   "kube-controller-man…"   23 hours ago   Up 23 hours             k8s_kube-controller-manager_kube-controller-manager-minikube_kube-system_b965983ec05322d0973594a01d5e8245_0
...
docker@minikube:~$ docker ps | egrep "scheduler"
83eecf84c9b4   99a3486be4f2                   "kube-scheduler --au…"   23 hours ago   Up 23 hours             k8s_kube-scheduler_kube-scheduler-minikube_kube-system_be132fe5c6572cb34d93f5e05ce2a540_0
docker@minikube:~$ docker ps | egrep "apiserver"
0119a15c6fa2   f40be0088a83                   "kube-apiserver --ad…"   23 hours ago   Up 23 hours             k8s_kube-apiserver_kube-apiserver-minikube_kube-system_cd6e47233d36a9715b0ab9632f871843_0
...

1.2:worker node的核心组件

worker node核心组件如下图:

k8s StatefulSet 固定节点 k8s worker节点_k8s etcd_04


功能如下:

kubelet:负责上报节点状态到master node 的apiserver,以及接收来自master node的apiserver的各种指令
kube proxy:代理pod收发数据包
container runtime:就是实际使用镜像以及创建容器的“劳动者”,是”伟大的底层劳动人民“

container runtime使用的容器技术并不一定非得是docker,只要是符合容器标准的都可以在此使用,如containerd、CRI-O等,这点需要清楚。

接下来我们看下各个组件的部署情况,对于container runtime就是我们的业务镜像运行的容器,是与业务相关的,如下我们运行的NGINX容器就是其中可能的一个:

docker@minikube:~$ docker ps | grep nginx 
69a398fd5dd0   nginx                          "/docker-entrypoint.…"   22 hours ago   Up 22 hours             k8s_ngx_ngx_default_e8b78e57-cea0-4ef1-9616-249680d39368_0

主要看下kubeletkube proxy

docker@minikube:~$ docker ps | grep kube-proxy
\5340eab00da5   9b7cc9982109                   "/usr/local/bin/kube…"   23 hours ago   Up 23 hours             k8s_kube-proxy_kube-proxy-4pqb8_kube-system_b0e109a8-4e48-440d-b85f-8793fa9b1bf5_0
docker@minikube:~$ docker ps | grep kubelet   
docker@minikube:~$

很奇怪的是,kubelet并没有对应的运行中的容器,这是因为kubelet并没有以容器的形式运行(容器运行不方便管理pod),而是以独立进程方式运行,所以我们需要使用ps命令来查看,如下:

docker@minikube:~$ ps -ef | grep kubelet
...
root        1721       1  1 Jan03 ?        00:24:26 /var/lib/minikube/binaries/v1.23.3/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --config=/var/lib/kubelet/config.yaml --container-runtime=docker --hostname-override=minikube --kubeconfig=/etc/kubernetes/kubelet.conf --node-ip=192.168.49.2
...

1.3:核心组件基本工作流程

1:worker node的kubelet上报node状态到apiserver,apiserver将数据状态存储到etcd
2:controller manager从apiserver获取各个worker node的状态,进行监控,故障转移,动态伸缩等操作
3:kube proxy代理外部访问,使得容器能够对外提供服务
4:scheduler从apiserver获取节点状态,调度pod,通过apiserver下发指令给worker node,kubelet调用container runtime启动容器

1.4:插件

k8s还提供了插件(addons)的功能,不同于组件出现问题或者是缺失时k8s集群将无法正常启动,插件并非必不可少,插件的作用是在k8s集群能用的基础上,使之变得更好用,如下可以查看支持的插件列表:

k8s StatefulSet 固定节点 k8s worker节点_docker_05

其中比较常用的有DNS和dashboard,其中DNS允许通过域名的方式来访问服务,这是负载均衡和服务发现的基础,dashboard可以认为kubectl的界面版,可通过UI来管理k8s集群,有时候看信息更加直观,通过minikube dashboard就可以启动,界面如下:

k8s StatefulSet 固定节点 k8s worker节点_apiserver_06

写在后面

小结

本文我们一起学习了k8s的工作机制,其中节点类型分为master node和worker node,master node的组件包括apiserver,etcd,scheduler,controller manager,worker node的组件包括kubelet,kube-proxy,container runtime,并了解了插件相关的内容。详细如下图:

k8s StatefulSet 固定节点 k8s worker节点_apiserver_07

多知道一点

devops

devops是相对于常规的开发流程来说的,常规的开发流程是开发人员进行开发,我们可以叫做是dev,而运维人员部署运维的过程我们可以叫做ops,而对于基于k8s的开发就没有这么明显的划分了,开发和运维可以是一拨人,所以就叫做是devops,该词的中文意思也正是开发运维,即是开发,也是运维。所以devops的意思就是基于k8s进行开发部署运维的模式。