kubernetes组件

一个kubernetes集群主要是由**控制节点(master)工作节点(node)**构成,每个节点上都会安装不同的组件。

master:集群的控制平面,负责集群的决策 ( 管理 )

ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制; 客户端与k8s群集及K8s内部组件的通信,都要通过Api Server这个组件;
Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上。(算哪个节点)
ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等(部署和维护的)
Etcd/节点信息存储 :负责存储集群中各种资源对象的信息

**node:集群的数据平面,负责为容器提供运行环境 ( 干活 ) **

Kubelet : 负责维护容器的生命周期,即通过控制docker/containerd,来创建、更新、销毁容器
KubeProxy : 负责提供集群内部的服务发现和负载均衡

部署流程

下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:

  • 首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd/(其他存储)数据库中

  • 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件

  • apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上, 在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer

  • apiServer调用controller-manager去调度Node节点安装nginx服务

  • kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod, pod是kubernetes的最小操作单元,容器必须跑在pod中

  • 至此,一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理

访问流程

NodePort的工作原理与ClusterIP大致相同,发送到某个NodeIP:NodePort的请求,通过iptables重定向到kube-proxy对应的端口(Node上的随机端口)上,然后由kube-proxy再将请求发送到其中的一个Pod:TargetPort。

这里,假如Node的ip为10.0.0.5,则对应的iptables如下:

1
2
3
4
5
6
$ sudo iptables -S -t nat
...
-A KUBE-NODEPORT-CONTAINER -p tcp -m comment --comment "default/ssh-service1:" -m tcp --dport 30239 -j REDIRECT --to-ports 36463
-A KUBE-NODEPORT-HOST -p tcp -m comment --comment "default/ssh-service1:" -m tcp --dport 30239 -j DNAT --to-destination 10.0.0.5:36463
-A KUBE-PORTALS-CONTAINER -d 10.254.132.107/32 -p tcp -m comment --comment "default/ssh-service1:" -m tcp --dport 2222 -j REDIRECT --to-ports 36463
-A KUBE-PORTALS-HOST -d 10.254.132.107/32 -p tcp -m comment --comment "default/ssh-service1:" -m tcp --dport 2222 -j DNAT --to-destination 10.0.0.5:36463

可见:访问10.0.0.5:30239端口会被转发到node上的36463端口(随机监听端口)。而且在访问clusterIP 10.254.132.107的2222端口时,也会把请求转发到本地的36463端口。 36463端口实际被kube-proxy所监听,将流量进行导向到后端的pod上。

kubernetes概念

Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控

Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行

Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器

Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等(控制器在k8s中是一类概念,有很多控制器)

Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod。如通过service访问多个tomcat

Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签(service怎么判断应该给哪个pod,如下面3个都是tomcat,只有一个tom,所以没选它)

NameSpace:命名空间,用来隔离pod的运行环境(同个命名空间里的pod可以相互访问)