二进制部署
环境准备:
部署etcd集群
etcd是CoreOs团队发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd是go语言编写的。
etcd是服务发现系统,有以下特点:
- 简单:安装配置简单,而且提供了HTTP API 进行交互,使用也很简单
- 安全:支持SSL证书验证
- 快速:单实例支持每秒2k+读操作
- 可靠:采用raft算法,实现分布式系统数据的可用性和一致性
etcd目前默认使用2379端口提供HTTP API服务,2380端口和peer通信,etcd默认使用2379端口对外为客户端提供通讯,使用端口2380来进行服务间内部通讯。etcd在生产环境中一般推荐集群方式部署。由于etcd的leader选举机制,要求至少为3台或以上奇数台。
准备签发证书环境
CFSSL是CloudFlare公司开源的一款PKI/TLS工具。CFSSL包含一个命令行工具和一个用于签名、验证和捆绑TLS证书的HTTP API服务。使用Go语言编写。
CFSSL使用配置文件生成证书,因此自签之前,需要生成它识别的json格式的配置文件,CFSSL提供了方便的命令行生成配置文件。CFSSL用来为etcd提供TLS证书,它支持签三种类型的证书:
- client证书:服务端连接客户端时携带的证书,用于客户端验证服务端身份,如kube-apiserver访问etcd
- server证书:客户端连接服务端时携带证书,用于服务端验证客户端身份,如etcd对外提供服务
- peer证书:相互之间连接时使用的证书,如etcd节点之间进行验证和通信。
在master01节点上操作
下载证书制作工具
创建k8s工作目录
启动etcd服务
进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动
部署docker引擎
所有node节点部署docker引擎
finnel网络配置
k8s中Pod网络通信
①、Pod内容器与容器之间的通信
在同一个Pod内的容器(Pod内的容器是不会跨宿主机的)共享同一个网络命令空间,相当于它们在同一台机器上一样,可以用localhost地址访问彼此的端口。
②、同一个Node内Pod之间的通信
每个Pod都有一个真实的全局IP地址,同一个Node内的不同Pod之间可以直接采用对方Pod的IP地址进行通信,Pod1与Pod2都是通过Veth连接到同一个docker0网桥,网段相同,所以它们之间可以直接通信。
③、不同Node上Pod之间通信
Pod地址与docker0在同一个网段,docker0网段与宿主机网卡是两个不同的网段,且不同Node之间的通信只能通过宿主机的物理网卡进行。要想实现不同Node上Pod之间的通信,就必须想办法通过主机物理网卡IP地址进行寻址和通信。因此要满足两个条件:Pod的IP不能冲突,将Pod的IP所在的Node的IP关联起来,通过这个关联让不同Node上Pod之间直接通过内网IP地址通信
Overlay Network:
叠加网络,在二层或者三层基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路隧道连接起来(类似于VPN)。
VXLAN:
将源数据包封装到UDP中,并使用基础网络的IP/MAC作为外层报文头进行封装,然后再以太网上传输,到达目的地后由隧道端点解封转并将数据发送给目标地址。
Flannel:
Flannel的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
Flannel是Overlay网络的一种,也是将TCP源数据包封装在另外一种网络包里面进行路由转发和通信,目前支持UDP、VXLAN、host-GW3种数据转发方式。
Kubernetes工作流程:
首先运维人员/用户发送请求给APIserver,APIserver把用户的请求信息写入到etcd分布式存储中,然后APIserver找controller-manager创建pod,controller-manager通过etcd读取用户的请求,根据用户的请求来创建pod;controller-manager通过APIserver找到scheduler来调度pod,scheduler会通过两种策略:一种优选策略,一种预算策略筛选出node节点,然后把pod送到对应的node节点上;scheduler通过APIserver找到node对应节点上的kubelet,然后由kubelet创建pod,kubelet会监控node节点上的资源信息(包括pod的状态);监控到的信息也会通过APIserver存储到etcd。如果需要把pod发送出去,通过proxy创建转发规则把服务发布出去供用户来访问。proxy承载service,把用户的请求负载均衡转发给他所关联的pod上。
Flannel工作原理:
数据从源node节点的pod发出后,会经由docker0网卡转发到flannel0网卡,在flannel0网卡有个flanneld服务会把这个数据包封装到udp报文中,然后根据自己在etcd中维护路由表通过物理网卡转发到目标node节点,数据包到达目标node节点后会被flanneld服务解封装,然后经由flannel0网卡和docker0网卡转发到目标pod的容器。
ETCD之Flannel提供说明:
存储管理Flannel可分配的IP地址段资源,监控ETCD中每个Pod的实际地址,并在内存中建立维护Pod节点路由表。
master01节点上操作
添加flannel网络配置信息,写入分配的子网段到etcd中,供flannel使用
查看写入信息
在所有node节点上操作
创建k8s工作目录
启动flannel服务,开启flannel网络功能
这里上面的mtu=1450比别的少了50字节,因为要留给VXLAN50字节来封装
查看