第四階段
時 ?間:2023年8月14日
參加人:全班人員
內 ?容:
Kubernetes網絡組件詳解
目錄
一、Kubernetes網絡組件
(一)Flannel網絡組件
(二)Calico 網絡插件
(1)Calico 網絡模型工作組件
(2)Calico 網絡 Node 之間兩種網絡
二、安裝部署Calico 網絡
(一)環境準備
(二)部署docker環境
(三)部署kubernetes集群
(四)部署Calico網絡插件
?
一、Kubernetes網絡組件
????????隨著 Docker 容器化興起,云計算面對的挑戰越來越大,例如:網絡管理、存儲管理等。一個數據中心中基本上都有成百上千個容器,這么多的容器需要運維人員集中管理。而在云計算的世界中,計算是最基礎的,存儲是最重要的,網絡則是最復雜的。Kubernetes 網絡的實現不是集群內部自己實現,而是依賴于第三方網絡插件。本次主要介紹 Kubernetes網絡組件中的一個重要成員——Calico。
(一)Flannel網絡組件
????????Flannel 是 CoreOS 團隊針對 Kubernetes 設計的一個網絡規劃服務。它的功能是讓集群中的不同節點主機創建的 Docker 容器都具有全集群唯一的虛擬 IP 地址。在默認的 Docker 配置中,每個節點上的 Docker 服務會分別負責所在節點容器的 IP 分配。這樣導致的問題是,不同節點上容器可能獲得相同的內網 IP 地址。
????????Flannel 的設計目的就是為集群中的所有節點重新規劃 IP 地址的使用規則,從而使得不同節點上的容器能夠獲得“同屬一個內網”且”不重復的”IP 地址,并讓屬于不同節點上的容器能夠直接通過內網 IP 地址通信。
????????Flannel 實質上是一種“覆蓋網絡(overlay network)”,也就是將 TCP 數據包裝在另一種網絡包里面進行路由轉發和通信,目前已經支持 UDP、VxLAN、AWS VPC 和 GCE 路由等數據轉發方式,默認的節點間數據通信方式是 UDP 轉發。
?
????????數據從源容器中發出后,經由所在主機的 docker0 虛擬網卡轉發到 flannel0 虛擬網卡,
????????這是個 P2P 的虛擬網卡,flanneld 服務監聽在網卡的另外一端。
????????Flannel 通過 Etcd 服務維護了一張節點間的路由表。源主機的 flanneld 服務將原本的數據內容 UDP 封裝后根據自己的路由表投遞給目的節點的 flanneld 服務,數據到達以后被解包,然后直接進入目的節點的 flannel0 虛擬網卡,之后被轉發到目的主機的 docker0 虛擬網卡,最后就像本機容器通信一下的有 docker0 路由到達目標容器。
(二)Calico 網絡插件
????????Calico 是一種基于 BGP 的、純三層的、容器間互通的網絡方案。與 OpenStack、Kubenetes、AWS、GCE 等云平臺都能夠良好的集成。在虛擬化平臺中,如 OpenStack、Docker 等都需要實現 workloads 之間互連,但同時也需要對容器做隔離控制,就像在Internet 中的服務僅開放 80 端口、公有云的多租戶一樣,提供隔離和管控機制。
????????而在多數的虛擬化平臺實現中,通常使用二層隔離技術來實現容器的網絡,這些二層技術有一些弊端,比如需要依賴 VLAN、bridge 和隧道等技術。其中 bridge 帶來了復雜性,vlan 隔離和 tunnel 隧道則消耗更多的資源并對物理環境有要求,隨著網絡規模的增大,整體會變得越加復雜。我們嘗試把 Host 當作 Internet 中的路由器,同樣使用 BGP 同步路由,并使用 Iptables 來做安全訪問策略,最終設計出了 Calico 方案。
?
(1)Calico 網絡模型工作組件
Felix:運行在每一臺 Host 的 agent 進程,主要負責網絡接口管理和監聽、路由、ARP管理、ACL 管理和同步、狀態上報等。
etcd:分布式鍵值存儲,主要負責網絡元數據一致性,確保 Calico 網絡狀態的準確性,可以與 kubernetes 共用;
BGP Client(BIRD):Calico 為每一臺 Host 部署一個 BGP Client,使用 BIRD 實現。BIRD 是一個單獨的持續發展的項目,實現了眾多動態路由協議比如 BGP、OSPF、RIP 等。在 Calico 的角色是監聽 Host 上由 Felix 注入的路由信息,然后通過 BGP 協議廣播告訴剩余 Host 節點,從而實現網絡互通。
BGP Route Reflector:在大型網絡規模中,如果僅僅使用 BGP client 形成 mesh 全網互聯的方案就會導致規模限制,因為所有節點之間倆倆互聯,需要 N^2 個連接,為了解決這個規模問題,可以采用 BGP 的 Router Reflector 的方法,使所有 BGP Client僅與特定 RR 節點互聯并做路由同步,從而大大減少連接數。
CalicoCtl:Calico 命令行管理工具。
(2)Calico 網絡 Node 之間兩種網絡
IPIP
從字面來理解,就是把一個 IP 數據包又套在一個 IP 包里,即把 IP 層封裝到 IP 層的一個 tunnel。它的作用相當于一個基于 IP 層的網橋。一般來說,普通的網橋是基于 mac 層的,根本不需 IP,而這個 ipip 則是通過兩端的路由做一個 tunnel,把兩個本來不通的網絡通過點對點連接起來。
BGP
邊界網關協議(Border Gateway Protocol, BGP)是互聯網上一個核心的去中心化自治路由協議。它通過維護 IP 路由表或‘前綴’表來實現自治系統(AS)之間的可達性,屬于矢量路由協議。BGP 不使用傳統的內部網關協議(IGP)的指標,而使用基于路徑、網絡策略或規則集來決定路由。因此,它更適合被稱為矢量性協議,而不是路由協議。BGP通俗的講就是講接入到機房的多條線路(如電信、聯通、移動等)融合為一體,實現多線單 IP,BGP 機房的優點:服務器只需要設置一個 IP 地址,最佳訪問路由是由網絡上的骨干路由器根據路由跳數與其它技術指標來確定的,不會占用服務器的任何系統。
二、安裝部署Calico 網絡
(一)環境準備
IP地址 | 主機名 | 組件 |
192.168.100.131 | k8s-master | kubeadm、kubelet、kubectl、docker-ce |
192.168.100.132 | k8s-node01 | kubeadm、kubelet、kubectl、docker-ce |
192.168.100.133 | k8s-node02 | kubeadm、kubelet、kubectl、docker-ce |
注意:所有主機配置推薦CPU:2C+ ?Memory:2G+
1、主機初始化配置
所有主機配置禁用防火墻和selinux
[root@localhost ~]# setenforce 0
[root@localhost ~]# iptables -F
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# systemctl stop NetworkManager
[root@localhost ~]# systemctl disable NetworkManager
[root@localhost ~]# sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
?
配置主機名并綁定hosts,不同主機名稱不同
[root@localhost ~]# hostname k8s-master[root@k8s-master ~]# cat << EOF >> /etc/hosts192.168.100.131 k8s-master192.168.100.132 k8s-node01192.168.100.133 k8s-node02EOF
[root@localhost ~]# hostname k8s-node01
[root@localhost ~]# hostname k8s-node02
?
所有主機配置初始化
[root@k8s-master ~]# yum -y install vim wget net-tools lrzsz[root@k8s-master ~]# swapoff -a[root@k8s-master ~]# sed -i '/swap/s/^/#/' /etc/fstab[root@k8s-master ~]# cat << EOF >> /etc/sysctl.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF[root@k8s-master ~]# modprobe br_netfilter[root@k8s-master ~]# sysctl -p
?
(二)部署docker環境
????????三臺主機上分別部署 Docker 環境,因為 Kubernetes 對容器的編排需要 Docker 的支持。
[root@k8s-master ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo[root@k8s-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2使用 YUM 方式安裝 Docker 時,推薦使用阿里的 YUM 源。[root@k8s-master ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo[root@k8s-master ~]# yum clean all && yum makecache fast[root@k8s-master ~]# yum -y install docker-ce[root@k8s-master ~]# systemctl start docker[root@k8s-master ~]# systemctl enable docker鏡像加速器(所有主機配置)[root@k8s-master ~]# cat << END > /etc/docker/daemon.json{"registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]}END[root@k8s-master ~]# systemctl daemon-reload[root@k8s-master ~]# systemctl restart docker
?
(三)部署kubernetes集群
1)組件介紹
三個節點都需要安裝下面三個組件
kubeadm:安裝工具,使所有的組件都會以容器的方式運行
kubectl:客戶端連接K8S API工具
kubelet:運行在node節點,用來啟動容器的工具
2)配置阿里云yum源
使用 YUM 方式安裝 Kubernetes時,推薦使用阿里的 YUM 源。
準備好基礎環境和 Docker 環境,下面就開始通過 Kubeadm 來部署 Kubernetes 集群。首先,安裝 Kubelet、Kubeadm 和 Kubectl。
[root@k8s-master ~]# ls /etc/yum.repos.d/
[root@k8s-master ~]#
cat /etc/yum.repos.d/kubernetes.repo
?
3)安裝kubelet kubeadm kubectl
所有主機配置
[root@k8s-master ~]# yum install -y kubelet kubeadm kubectl
[root@k8s-master ~]# systemctl enable kubelet
????????kubelet 剛安裝完成后,通過 systemctl start kubelet 方式是無法啟動的,需要加入節點或初始化為 master 后才可啟動成功。
4)配置init-config.yaml
????????Kubeadm 提供了很多配置項,Kubeadm 配置在 Kubernetes 集群中是存儲在ConfigMap 中的,也可將這些配置寫入配置文件,方便管理復雜的配置項。Kubeadm 配內容是通過 kubeadm config 命令寫入配置文件的。
????????在master節點安裝,master 定于為192.168.200.111,通過如下指令創建默認的init-config.yaml文件:
[root@k8s-master ~]# kubeadm config print init-defaults > init-config.yaml
init-config.yaml配置如下:
?
5)安裝master節點
拉取所需鏡像
[root@k8s-master ~]# kubeadm config images list --config init-config.yaml
[root@k8s-master ~]# kubeadm config images pull --config init-config.yaml
?
安裝matser節點
[root@k8s-master ~]# kubeadm init --config=init-config.yaml //初始化安裝K8S
?
根據提示操作
kubectl 默認會在執行的用戶家目錄下面的.kube 目錄下尋找config 文件。這里是將在初始化時[kubeconfig]步驟生成的admin.conf 拷貝到.kube/config
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# chown $(id -u):$(id -g) $HOME/.kube/config
????????Kubeadm 通過初始化安裝是不包括網絡插件的,也就是說初始化之后是不具備相關網絡功能的,比如 k8s-master 節點上查看節點信息都是“Not Ready”狀態、Pod 的 CoreDNS無法提供服務等。
6)安裝node節點
根據master安裝時的提示信息
[root@k8s-node01 ~]# kubeadm join
[root@k8s-node02 ~]# kubeadm join
[root@k8s-master ~]# kubectl get nodes
????????前面已經提到,在初始化 k8s-master 時并沒有網絡相關配置,所以無法跟 node 節點通信,因此狀態都是“NotReady”。但是通過 kubeadm join 加入的 node 節點已經在k8s-master 上可以看到。
(四)部署Calico網絡插件
1、安裝 Calico 網絡插件
[root@k8s-master ~]# kubectl apply -f calico.yaml
2、查看node節點狀態。
[root@k8s-master ~]# kubectl get nodes
?
3、查看所有pod狀態
[root@k8s-master ~]# kubectl get pod --all-namespaces
?
4、查看所有system狀態
[root@k8s-master ~]# kubectl get pod -n kube-system
?
5、查看所有docker鏡像
[root@k8s-master ~]# docker images
?
6、查看master以及node 的ifconfig信息
Master:
Node01:
Node02:
?