二進制部署
環境准備:
部署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字節來封裝
查看