k8s的二进制部署
master01:192.168.233.10 kube-apiserver kube-controller-manager kube-scheduler etcd
master02:192.168.233.20 kube-apiserver kube-controller-manager kube-scheduler
node01:192.168.233.30 kubelet kube-proxy etcd
node02:192.168.233.40 kubelet kube-proxy etcd
负载均衡:nginx+keepalive
master:192.168.233.50
backup:192.168.233.60
[root@10 ~]# systemctl stop firewalld
[root@10 ~]# setenforce 0
[root@10 ~]# iptables -t nat -F
[root@10 ~]# iptables -t mangle -F
[root@10 ~]# iptables -X
[root@10 ~]# swapoff -a
[root@10 ~]# free -h
total used free shared buff/cache available
Mem: 7.6G 302M 7.0G 9.1M 379M 7.0G
Swap: 0B 0B 0B
k8s在设计时,为了提升性能,默认是不使用swap交换分区,kubenetes在初始化时,会检测swap是否关闭
[root@10 ~]# hostnamectl set-hostname master01
[root@10 ~]# su
[root@master01 ~]# vim /etc/hosts
[root@master01 ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
[root@master01 ~]# sysctl --system
部署第一个组件
存储k8s的集群信息和用户配置组件etcd
etcd是一个高可用---分布式的键值存储数据库
采用raft算法,保证节点信息一致性。etcd时go语言写的
etcd的端口:2379(提供API服务,api接口。对外为客户端提供通信) 2380(内部服务的通信端口)
etcd一般是集群部署,由于etcd有选举leader的机制,至少要3台或者奇数台
k8s的内部通信依靠证书认证、密钥认证
证书的签发环境:
cfssl:证书签发的命令工具
cfssl-certinfo:查看证书信息的工具
cfssljson: 把证书的格式转化成json格式,变成文件的承载式证书
ca-config.ison 证书颁发机构的配置文件,定义了证书生成的策略,默认的过期时间和模版
ca-csr.ison 签名的请求文件,包括一些组织信息和加密方式
ca.pem 根证书文件,用于给其他组件签发证书
server.csr etcd的服务器签发证书的请求文件
server-key.pem etcd服务器的私钥文件
ca.csr 根证书签发请求文件
ca-key.pem 根证书的私钥文件
etcd- cert.sh 用于通过服务器验证客户端
server-csr.ison 用于生成etcd的服务器证书和私钥签名文件
server.pem etcd服务器的证书文件,用于加密和认证etcd节点之间的通信
kubectl config set-context default \
--cluster=kubernetes \
--user=cluster-admin
-kubeconfig=$KUBE CONFIG)kubect! config use-context default --kubeconfig=$(KUBE CONFIG)
context 上下文:
定义连接到哪个k8s集群,以及使用哪个用户的身份来进行操作,上下文包含了集群、用户和可选命名空间的信息
在k8s的集群中
kubectl create clusterrolebinding kubelet-bootstrap -clusterrole-system:node-bootstrapper --user-kubelet-bootstrap
RBAC授权,生成和赋权用户kubelet-bootstrap,发起node节点的请求认证,通过CSR加密认证实现NODEK节点加入到集群当中。
kubelet获取master的验证信息和获取API-server接口的通信认证。
k8s网络类型
k8s中的通信模式:
1、pod内部之间容器与容器之间的通信
在同一个pod中的容器共享资源和网络,使用同一个网络命名空间。他们可以直接通信
2、同一个node节点之内,不同pod之间的通信
每个pod都有一个全局的真实的IP地址。同一个node之间的不同pod可以直接使用对方pod的ip地址进行通信
pod1和pod2是通过doker0的网桥来进行通信。
3、不同node节点上的pod之间如何进行通信
cni插件:cni是一个标准接口,用于容器运行时调用网络插件,配置容器网络,负责设置容器的网络命名空间,ip地址,路由等等参数
插件①:Flannel
Flannel 的功能是让集群中的不同Docker 容器都具有全集群唯一的虚拟IP地址。
Flannel 是 Overlay 网络的一种,在底层物理网络的基础之上,创建一个逻辑的网络层。二层+三层集合。二层是网络层,三层是逻辑上的网络层。Overlay网络也是一种网络虚拟化的技术
Flannel支持的数据转发方式:①UDP(默认模式。应用转发,配置简单,性能最差。一般不用); ②VXLAN(基于内核转发。也是最常用的网络类型(小集群都用这个),用的最多); ③Host-gw(性能最好,但是配置很麻烦,用的比较少)
UDP的工作模式:基于应用转发,Flannel提供路由表,Fannel封装数据包、解封装
node都会有一个fannel的虚拟网卡
数据流向
VXLAN的工作模式:使用的就是Overlay的虚拟隧道通信技术。二层+三层的模式。
UDP基于应用层用户态,
VXLAN:fannel提供给路由表,内核封装、解封装
flannel1.1接口
数据流向
根据vni+IP地址来寻找目标节点的通信地址
flannel:每个发向容器的数据包进行封装,vxlan通过vtep打包数据,然后由内核封装成数据包,再转发到目标node节点。到了目标节点,还有个解封装过程,再发送目标pod,性能有一定影响
插件②:Calico(直接路由,性能最好)
calico:采用直接路由的方式(BGP动态路由)。不需要修改报文,统一直接通过路由表转发,路由表会很复杂,运行维护的要求比较高
BGP模式的特点:交换路由信息的外部网关协议,可以连接不同的节点。node节点可能不是一个网段,BGP实现可靠的、最佳的、动态的路由选择。自动识别相邻的路由设备。
calico不使用overlay,也不需要交换,直接通过虚拟路由实现,每一台虚拟路由都通过BGP转发
核心组件:
1、felix 也是运行在主机的一个个pod,一个进程,k8s daemonset的方式部署(后台部署)的pod
daemonset会在每个node节点部男相同的pod.后台的运行方式
负责在宿主机上插入路由规则,维护calico需要的网络设备。网络接口管理、监听、路由等等
2、BGP Client(bird) BGP的客户端,专门负责在集群中分发路由规则的信息。每一个节点都会有一个BGP Client
BGP协议用广播的方式通知其他节点的分发路由的规则,实现网络互通
etcd:保存路由信息;负责整个网络元数据的一致性(保证整个网络状态的一致和准确)
Calico的工作原理:
路由表来维护每个pod之间的通信
创建好pod之后,添加一个设备cali veth pair设备
虚拟网卡: veth pair是一对设备,虚拟的以太网设备
一头连接在容器的网络命名空间 eth0
另一头连接宿主机的网络命名空间 cali
IP地址分配:veth pair连接容器的部分给容器分配IP地址,这个IP地址是唯一标识,宿主机也会被veth pair分配一个calico网络的内部IP地址。和其他节点上的容器进行通信
veth设备:容器发出的IP地址通过veth pair设备到宿主机,宿主机就根据路由规则的下一跳地址发送到网关(目标宿主机,目标节点),数据包到达目标宿主机,veth pari设备,目标宿主机也是根据路由规则,下一跳地址,转发到目标容器
数据流向
ipip模式:会生成一个tunnel隧道.数据包都是在tunnel内部打包 封装:宿主机IP、容器内部的IP地址
常用的网络插件类型:flannel和calico
flannel特点:配置简单,功能简单,基于overlay叠加网络实现,在物理层的网络上再封装一个虚拟的网络。
vxlan是虚拟三层网络。UDP是默认模式。host-gw模式。
vxlan:最多的模式,vni+IP进行转发,flannel提供路由表,内核封装和解封装
由于封装和解封装的过程,对数据传输的性能会有影响,没有网络策略配置的能力UDP协议
默认网段:10.244.0.0/16
calico特点:功能强大,基于路由表进行转发,没有封装和解封装的过程。具备网络策略的配置能力。但是路由表维护起来复杂
模式:ipip BGP
BGP:通过为IP路由表的前缀来实现目标主机的可达性
对比ipip模式,BGP模式没有隧道,BGP模式下,pod的数据包直接通过网卡发送到目的地
ipip的隧道:在隧道进行数据包的封装ipv4 --- ipv4
简单的小集群:flannel
扩容、配置网络策略:calico
coredns:可以为集群当中的service资源创建一个域名和IP进行对应解析的关系
service是对外提供访问的地址,现在加入DNS机制之后,可以直接访问服务名