k8s是谷歌以Borg为前身,基于谷歌15年生产环境经验的基础上开源的一个项目。
k8s致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台。
k8s集群包含master节点和node节点,是一个主从架构,通常我们会用3台服务器已高可用的形式作为主节点,不进行业务部署(可以设置要不要在主节点上部署应用);从节点作为工作节点。
以下为集群组件及功能:
master节点:集群的控制中枢
kube-apiserver:集群的控制中枢,各模块间信息交互需要经过kube-apiserver,同时它也是集群管理、资源配置、集群安全机制的入口。
controller-manager:集群的状态管理器,保证pod等资源始终达到一个期望的效果,需要和apiserver进行通信,在需要的时候创建、更新或删除所管理的资源。
scheduler:集群的调度中心,他会根据指定的一系列条件选择最佳节点部署pod;就是说如果我们有5个node节点,当我们创建一个pod时候,是由scheduler决定这个pod部署在哪个节点上。
etcd cluster:键值数据库,存放集群信息;生产环境中最好etcd与集群分离,建议3个以上节点(奇数),使用ssd硬盘安装。
node节点:工作节点,也叫worker节点
kubelet:负责监听节点上pod状态,同时负责上报节点与节点上pod状态,负责与master节点通信,并管理pod。
kube-proxy:负责pod之间的通信和负载均衡,将指定的流量分发到后端机器上。
查看kube-proxy工作模式:
curl 127.0.0.1:10249/proxyMode
我使用的是ipvs。
ipvs:监听master节点增加和删除service以及endpoint的消息,调用netlink接口创建相应对的ipvs规则。通过ipvs规则,将流量转发至相应的pod上。
iptables:监听master节点增加和删除service以及endpoint的消息,对于每一个service,他都会创建一个iptables规则,并将service的clusterIP代理到后端相应的pod。
kube-system命名空间:系统组件pod
calico:符合CNI标准的网络插件,给每个pod生成一个唯一额IP地址,并且将每个节点当做一个路由器(实现或节点通信)。
coreDNS:用于k8s集群内部service解析,可以让pod把service名称解析为IP地址,然后通过service的IP地址进行连接到对应应用上。
docker:容器引擎,负责对容器的管理
metrics-server:查看pod占用资源情况