Kubernetes基础
一.Kubernetes基本概念
1.裸容器的问题
宿主机宕机容器无法自动恢复
程序级健康检查依旧不到位
程序的扩容部署回滚和更新依旧不够灵活
端口问题并未得到解决
2.容器编排应特点
轻松管理成千上万的业务容器
全自动容灾机制
全自动扩容、回滚
原生支持服务发现和负载均衡
更加灵活方便地健康检查
一时间想不起来的优点
3.Kubernetes概念
Kubernetes是谷歌以Borg为前身,基于谷歌15年生产环境经验的基础上开源的一个项目,Kubernetes致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台。
Kubernetes也叫k8s:它提供了资源调度、扩容缩容、服务发现、储存编排、自动部署和回滚,并且天生高可用、负载均衡、故障自动恢复等功能“生态系统”,目前已成为云原生领域的标准。
4.架构
etcd最好用独立的磁盘和SSD,最好部署3个,奇数台。 master主节点高可用最好用3台,奇数台,预防脑裂。 工作node节点可以弹性扩容 kubectl:通过一个config文件验证,是个控制管理工具,可以控制k8s集群,一般装在其中一台主节点上或者装在另外一台机器上(生产环境)。
二.master主节点
整个集群的控制中枢
Kube-APIServer
简介:kube-apiserver: 核心组件,每个模块都要经过,集群安全机制的入口。 是整个集群的控制中枢,提供集群中各个模块之间的数据交换,并将集群状态和信息存储到分布式键值储存系统Etcd集群中。同时它也是集群管理、资源配额、提供完备的集群安全机制的入口,为集群各类资源对象提供增删改查以及watch的REST API接口。 kube-apiserver是无状态的节点。
Controller-Manager
简介:状态管理器,控制pod数量、状态。 保证pod或者其它资源打到期望值,当集群中某个pod的副本数或者其它资源因为故障和错误导致无法正常运行,没有达到设定的值时,Controller manager会尝试自动修复并使其达到期望状态。 scheduler是有状态的组件,同时工作的只有一个。(1.20版本以下查询:kubectl get leases -n kube-system)
Scheduler
简介:集群的调度中心,创建pod的任务,控制pod部署在最佳的节点上。 主要是通过调度算法将POS分配到最佳的Node节点,它通关APIServer监听所有POD状态,一旦发现新的未被调度到任何Node节点的Pod(podspec.nodeName为空),将会根据一系列策略选择最佳节点进行调度。 scheduler是有状态的组件,同时工作的只有一个。
Etcd
键值数据库,节点间的服务发现和配置共享,用来保存集群的信息。 用于可靠地存储集群的配置数据,是一种持久性、轻量型、分布式的键值数据储存,作为kubernetes集群的持久化储存系统。 ,一般生产环境中建议部署三个以上节点(奇数个)。
三.Node工作节点
Worker、node节点、minion节点
Kubelet
负责监听、管理Pod状态,与master通信 负责和Master通信协作,管理该节点上的Pod,对容器进行健康检查及监控,同时负责上报节点和节点上面Pod的状态。
Kube-proxy
负责Pod之间的通信和负载均衡,将指定的流量分发到后端正确的机器上。 查看Kube-proxy工作模式:curl 127.0.0.1:10249/proxyMode
Ipvs
监听Master节点增加和删除service以及endpoint的消息,调用Netlink接口创建相应的IPVS规则。通过IPVS规则,将流量转发至相应的Pod上。
Iptables
监听Master节点增加和删除service以及endpoint的消息,对于每一个Service,他都会场景一个iptables规则,将service的clusterIP代理到后端对应的Pod。
Calico
符合CNI标准的网络插件,给每个Pod生成一个唯一的IP地址,并且把每个节点当做一个路由器。
CoreDNS
用于Kubernetes集群内部Service的解析,可以让Pod把Service名称解析成IP地址,然后通过Service的IP地址进行连接到对应的应用上。
Docker
容器引擎,负责对容器的管理。
四.pod的通信
1.同一个 Pod 中 容器通信:
容器中 pod 共享同一个 IP 地址。故同一个 Pod 中 Container 可以做到直接通过 localhost 直接通信。
2.同一个节点多个 Pod 之间通信
pause 容器启动之前,会为容器创建虚拟一对 ethernet 接口,一个保留在宿主机 vethxxx(插在网桥上),一个保留在容器网络命名空间内,并重命名为eth0。两个虚拟接口的两端,从一端进入,另一端出来。任何 Pod 连接到该网桥的 Pod 都可以收发数据。
3.跨节点的pod通信
节点 Pod 通信,相当于创建一个整个集群公用的【 网桥 】然后把集群中所有的 Pod 连接起来,就可以通信了。
其中跨整个集群的 Pod ip 是唯一的,当报文从一个节点转发到另外一个节点时,报文首先通过 veth,然后通过网桥,转发到物理适配器网卡,最后转发到其它节点的虚拟网桥,进而到达 veth 目标容器。其实现方式有 Flannel、calico、weave 等。