写在前面
本文一起看下k8s基本架构。
1:Kubernetes的基本架构
k8s本身也是一种分布式架构,也需要在多台机器(实体机或虚拟机无差别)部署,部署的机器我们叫做节点,其中节点分为Master node即主节点,worker node即工作节点,master node是k8s的大脑,worker node主要部署k8s的其他组件,以及执行业务功能的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核心组件如下图:
功能如下:
api server:k8s集群对外的唯一入口,暴露了一组restful api,不管是kubectl还是worker node想要和master node通信都必须通过api server
etcd:注册中心,集群信息存储于此,只有api server能够访问
kube scheduler:负责容器编排,根据各个worker node的资源情况分配pod,相当于是部署人员
controller manager:负责系统状态的监控,故障转移,动态伸缩等功能,相当于是系统运维人员
这四个组件都是必须有的,不然k8s集群将无法正常启动,另外这4个组件都以容器的形式来运行,如下图:
-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核心组件如下图:
功能如下:
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
主要看下kubelet
和kube 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集群能用的基础上,使之变得更好用
,如下可以查看支持的插件列表:
其中比较常用的有DNS和dashboard,其中DNS允许通过域名的方式来访问服务,这是负载均衡和服务发现的基础,dashboard可以认为kubectl的界面版,可通过UI来管理k8s集群,有时候看信息更加直观,通过minikube dashboard
就可以启动,界面如下:
写在后面
小结
本文我们一起学习了k8s的工作机制,其中节点类型分为master node和worker node,master node的组件包括apiserver,etcd,scheduler,controller manager,worker node的组件包括kubelet,kube-proxy,container runtime,并了解了插件相关的内容。详细如下图:
多知道一点
devops
devops是相对于常规的开发流程来说的,常规的开发流程是开发人员进行开发,我们可以叫做是dev,而运维人员部署运维的过程我们可以叫做ops,而对于基于k8s的开发就没有这么明显的划分了,开发和运维可以是一拨人,所以就叫做是devops,该词的中文意思也正是开发运维,即是开发,也是运维。所以devops的意思就是基于k8s进行开发部署运维的模式。
参考文章列表
k8s之搭建单机集群