kubernetes (k8s)的二进制部署单节点(etcd和flannel网络)
文章目錄
- 1 常見的k8s部署方式
- 2 環境準備
- 2.1 拓撲
- 2.2 所有主機關閉防火墻,selinux,swap
- 2.3 所有主機配置主機名,并再maser上做主機映射
- 2.4 所有主機將橋接的IPV4流量傳遞到 iptables的鏈
- 2.5 所有主機配置時間同步
- 3 部署etcd集群
- 3.1 etcd簡述
- 3.1.1 什么是etcd
- 3.1.2 etcd的特點
- 3.1.3 etcd的端口和部署要求
- 3.2 準備簽發證書環境
- 3.2.1 在master01上,下載證書制作工具,授予執行權限
- 3.2.2 創建k8s工作目錄,上傳腳本文件到目錄,創建生成證書的目錄,生成證書
- 3.3 啟動etcd服務
- 3.3.1上傳etcd-v3.3.10到/opt/k8s/目錄中,解壓
- 3.3.2 創建用于存放etcd 配置文件,命令文件,證書目錄
- 3.3.3 將etcd相關的證書文件和命令文件拷貝到另外兩個節點
- 3.3.4把etcd服務管理文件拷貝到另外兩個集群節點
- 3.3.5 在所有etcd節點上啟動etcd服務
- 3.4 在master01上檢查集群狀態
- 3.4.1 查看集群狀態
- 3.4.2 切換版本與查看集群節點狀態,成員列表
- 4 給所有node節點安裝docker引擎
- 5 在 master01 上配置flannel 網絡
- 5.1 k8s中pod的網絡通信
- 5.2 Overlay Network 和 Vxlan
- 5.3 flannel的工作原理
- 5.3.1 Flannel
- 5.3.2 flannel 工作原理
- 5.3.3 etcd 在flannel 提供
- 5.4在etcd服務器上,添加 flannel網絡配置信息
- 5.5 在所有node節點上創建k8s工作目錄,啟動flanneld服務,開啟網絡功能
- 5.6 所有node節點配置 docker 連接flannel
- 5.7 測試連通性
1 常見的k8s部署方式
- Minikube
- Minikube是一個工具,可以在本地快速運行一個單節點微型K8S,僅用于學習、預覽k8s的一些特性使用。
- 部署地址:I https://kubernetes.io/docs/setup/minikube
- Kubeadmin
- Kubeadmin也是一個工具,提供kubeadm init和kubeadm join,用于快速部署K8S集群,相對簡單。
- 使用kubadmin 安裝的k8s,其證書有效期只有1年。而k8s組件之間的通信都需要證書。如果證書過期,則k8s集群癱瘓
- https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
- 二進制安裝部署
- 生產首選,從官方下載發行版的二進制包,手動部署每個組件和**自簽TLS證書,**組成k8S集群,新手推薦。
- https://github.com/kubernetes/kubernetes/releases
小結: Kubeadm降低部署門檻,但屏蔽了很多細節,遇到問題很難排查。如果想更容易可控,推薦使用二進制包部署kubernetes集群,雖然手動部署麻煩點,期間可以學習很多工作原理,也利于后期維護。
2 環境準備
2.1 拓撲
| 角色 | ip | 服務 |
| k8s集群master01 | 192.168.23.103 | kube-apiserver;kube-controller-manager; kube-scheduler;etcd |
| k8s集群master02 | 192.168.23.10 | |
| k8s集群node01 | 192.168.23.104 | kubelet; kube-proxy;docker;flannel |
| k8s集群node02 | 192.168.23.105 | |
| etc集群節點1 | 192.168.23.103 | etcd |
| etc集群節點2 | 192.168.23.104 | |
| etc集群節點3 | 192.168.23.105 | |
| 負載均衡Nginx+keepalived01(master) | 192.168.23.11 | |
| 負載均衡Nginx+keepalived02(backup) | 192.168.23.12 | |
| VIP | 192.168.23.18 |
2.2 所有主機關閉防火墻,selinux,swap
#關閉所有主機的firewalld防火墻和開機自啟 systemctl disable firewalld --now systemctl status firewalld#設置selinux為寬松模式,并且下次開機后禁用selinux setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config #關閉swap交互空間,并且取消開機自動掛載 swapoff -a sed -ri 's/.*swap.*/#&/' /etc/fstab2.3 所有主機配置主機名,并再maser上做主機映射
#所有主機修改主機名 hostnamectl set-hostname master01 hostnamectl set-hostname node01 hostnamectl set-hostname node02#在master01主機上配置主機名映射 [root@master01 ~]# cat >> /etc/hosts <<EOF 192.168.23.103 master01 192.168.23.104 node01 192.168.23.105 node02 EOF#ping主機名測試 [root@master01 ~]# ping master01 [root@master01 ~]# ping node01 [root@master01 ~]# ping node022.4 所有主機將橋接的IPV4流量傳遞到 iptables的鏈
cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOFsysctl --system2.5 所有主機配置時間同步
#所有主機配置時間同步yum -y install ntpdatentpdate time.windows.com3 部署etcd集群
3.1 etcd簡述
3.1.1 什么是etcd
etcd是Coreos團隊于2013年6月發起的開源項目,它的目標是構建一個高可用的分布式鍵值(key-value)數據庫。etcd內部采用raft協議作為一致性算法, etcd是go語言編寫的。
3.1.2 etcd的特點
etcd作為服務發現系統,有以下的特點:
- 簡單:安裝配置簡單,而且提供了HTTP API進行交互,使用也很簡單
- 安全:支持SSL證書驗證
- 快速:單實例支持每秒2k+讀操作
- 可靠:采用raft算法,實現分布式系統數據的可用性和一致性
3.1.3 etcd的端口和部署要求
etcd 的端口:
- etcd目前默認使用2379端口提供HTTP API服務,
- 2380端口和peer通信
- 這兩個端口已經被IANA (互聯網數字分配機構)官方預留給etcd 。即etcd默認使用2379端口對外為客戶端提供通訊,使用端口2380來進行服務器間內部通訊。
部署要求:
- etcd在生產環境中一般推薦集群方式部署。
- 由于etcd的leader選舉機制,要求至少為3臺或以上的奇數臺。
3.2 準備簽發證書環境
- 準備簽發證書環境CFSSL是CloudFlare公司開源的一款PKI/TLS工具。CESSL包含一個命令行工具和一個用于簽名、驗證和捆綁TLS證書的 HTTP API服務。使用Go語言編寫。
- CFSSL使用配置文件生成證書,因此自簽之前,需要生成它識別的 json格式的配置文件, CFSSL提供了方便的命令行生成配置文件。
- CFSSL用來為etcd提供TLS證書,它支持簽三種類型的證書:
- client證書,服務端連接客戶端時攜帶的證書,用于客戶端驗證服務端身份,如kube-apiserver訪問etcd;
- server證書,客戶端連接服務端時攜帶的證書,用于服務端驗證客戶端身份,如etcd對外提供服務;
- peer證書,相互之間連接時使用的證書,如etcd節點之間進行驗證和通信。
這里實驗環境全部都使用同一套證書認證。
3.2.1 在master01上,下載證書制作工具,授予執行權限
#在 master01 上下載制作工具 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo 或 curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo#授予執行權限 chmod +x /usr/local/bin/cfssl*cfssl是一個開源的證書管理工具,使用json文件生成證書,比openssl更加方便
cfss1:證書簽發的工具命令
cfssljson:將cfss1生成的證書(json格式)變為文件承載式證書
cfssl-certinfo:驗證證書的信息
cfssl-certinfo -cert <證書名稱> #看證書的信息
3.2.2 創建k8s工作目錄,上傳腳本文件到目錄,創建生成證書的目錄,生成證書
#創建k8s工作目錄 [root@master01 opt]# mkdir /opt/k8s [root@master01 opt]# cd /opt/k8s/#上傳etcd-cert.sh 和 etcd.sh 到/opt/k8s目錄 [root@master01 k8s]# ls etcd-cert.sh etcd.sh etcd-cert.sh etcd.sh#添加x 權限 [root@master01 k8s]# chmod +x etcd-cert.sh etcd.sh#創建用于生成CA證書,etcd服務器證書及私鑰的目錄 [root@master01 k8s]# mkdir /opt/k8s/etcd-cert [root@master01 k8s]# mv etcd-cert.sh etcd-cert [root@master01 k8s]# cd /opt/k8s/etcd-cert/ #注意,看一下腳本,把ip改為自己的 [root@master01 etcd-cert]# vim etcd-cert.sh #!/bin/bash #配置證書生成策略,讓 CA 軟件知道頒發有什么功能的證書,生成用來簽發其他組件證書的根證書 cat > ca-config.json <<EOF {"signing": {"default": {"expiry": "87600h"},"profiles": {"www": {"expiry": "87600h","usages": ["signing","key encipherment","server auth","client auth"]}}} } EOF#ca-config.json:可以定義多個 profiles,分別指定不同的過期時間、使用場景等參數; #后續在簽名證書時會使用某個 profile;此實例只有一個 www 模板。 #expiry:指定了證書的有效期,87600h 為10年,如果用默認值一年的話,證書到期后集群會立即宕掉 #signing:表示該證書可用于簽名其它證書;生成的 ca.pem 證書中 CA=TRUE; #key encipherment:表示使用非對稱密鑰加密,如 RSA 加密; #server auth:表示client可以用該 CA 對 server 提供的證書進行驗證; #client auth:表示server可以用該 CA 對 client 提供的證書進行驗證; #注意標點符號,最后一個字段一般是沒有逗號的。#----------------------- #生成CA證書和私鑰(根證書和私鑰) #特別說明: cfssl和openssl有一些區別,openssl需要先生成私鑰,然后用私鑰生成請求文件,最后生成簽名的證書和私鑰等,但是cfssl可以直接得到請求文件。 cat > ca-csr.json <<EOF {"CN": "etcd","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "Beijing","ST": "Beijing"}] } EOF#CN:Common Name,瀏覽器使用該字段驗證網站或機構是否合法,一般寫的是域名 #key:指定了加密算法,一般使用rsa(size:2048) #C:Country,國家 #ST:State,州,省 #L:Locality,地區,城市 #O: Organization Name,組織名稱,公司名稱 #OU: Organization Unit Name,組織單位名稱,公司部門cfssl gencert -initca ca-csr.json | cfssljson -bare ca#生成的文件: #ca-key.pem:根證書私鑰 #ca.pem:根證書 #ca.csr:根證書簽發請求文件#cfssl gencert -initca <CSRJSON>:使用 CSRJSON 文件生成生成新的證書和私鑰。如果不添加管道符號,會直接把所有證書內容輸出到屏幕。 #注意:CSRJSON 文件用的是相對路徑,所以 cfssl 的時候需要 csr 文件的路徑下執行,也可以指定為絕對路徑。 #cfssljson 將 cfssl 生成的證書(json格式)變為文件承載式證書,-bare 用于命名生成的證書文件。#----------------------- #生成 etcd 服務器證書和私鑰 cat > server-csr.json <<EOF {"CN": "etcd","hosts": ["192.168.23.103","192.168.23.104","192.168.23.105"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "BeiJing","ST": "BeiJing"}] } EOF#hosts:將所有 etcd 集群節點添加到 host 列表,需要指定所有 etcd 集群的節點 ip 或主機名不能使用網段,新增 etcd 服務器需要重新簽發證書。cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server#生成的文件: #server.csr:服務器的證書請求文件 #server-key.pem:服務器的私鑰 #server.pem:服務器的數字簽名證書#-config:引用證書生成策略文件 ca-config.json #-profile:指定證書生成策略文件中的的使用場景,比如 ca-config.json 中的 www #執行腳本,生成CA證書,etcd服務器證書以及私鑰 [root@master01 etcd-cert]# ./etcd-cert.sh[root@master01 etcd-cert]# ls ca-config.json ca-csr.json ca.pem server.csr server-key.pem ca.csr ca-key.pem etcd-cert.sh server-csr.json server.pe3.3 啟動etcd服務
3.3.1上傳etcd-v3.3.10到/opt/k8s/目錄中,解壓
#etcd 二進制包地址: https://github.com/etcd-io/etcd/release#上傳etcd-v3.3.10 包到/opt/k8s目錄中,解壓 [root@master01 k8s]# ls etcd-v3.3.10-linux-amd64.tar.gz etcd-v3.3.10-linux-amd64.tar.gz[root@master01 k8s]# tar xf etcd-v3.3.10-linux-amd64.tar.gz[root@master01 k8s]# ls etcd-v3.3.10-linux-amd64 Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.mdetcd 就是etcd 服務的啟動命令,后面可以跟各種啟動參數
etcdctl 主要為etcd服務提供了命令行操作
3.3.2 創建用于存放etcd 配置文件,命令文件,證書目錄
[root@master01 k8s]# mkdir -p /opt/etcd/{cfg,bin,ssl} [root@master01 k8s]# mv /opt/k8s/etcd-v3.3.10-linux-amd64/etcd /opt/k8s/etcd-v3.3.10-linux-amd64/etcdctl /opt/etcd/bin/ [root@master01 k8s]# cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/[root@master01 k8s]# ls -R /opt/etcd/bin/ /opt/etcd/ssl/ /opt/etcd/bin/: etcd etcdctl/opt/etcd/ssl/: ca-key.pem ca.pem server-key.pem server.pem [root@master01 k8s]# pwd /opt/k8s [root@master01 k8s]# ls etcd.sh etcd.sh [root@master01 k8s]# vim etcd.sh #!/bin/bash # example: ./etcd.sh etcd01 192.168.80.10 etcd02=https://192.168.80.11:2380,etcd03=https://192.168.80.12:2380#創建etcd配置文件/opt/etcd/cfg/etcd ETCD_NAME=$1 ETCD_IP=$2 ETCD_CLUSTER=$3WORK_DIR=/opt/etcdcat > $WORK_DIR/cfg/etcd <<EOF #[Member] ETCD_NAME="${ETCD_NAME}" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://${ETCD_IP}:2380" ETCD_LISTEN_CLIENT_URLS="https://${ETCD_IP}:2379"#[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://${ETCD_IP}:2380" ETCD_ADVERTISE_CLIENT_URLS="https://${ETCD_IP}:2379" ETCD_INITIAL_CLUSTER="etcd01=https://${ETCD_IP}:2380,${ETCD_CLUSTER}" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new" EOF#Member:成員配置 #ETCD_NAME:節點名稱,集群中唯一。成員名字,集群中必須具備唯一性,如etcd01 #ETCD_DATA_DIR:數據目錄。指定節點的數據存儲目錄,這些數據包括節點ID,集群ID,集群初始化配置,Snapshot文件,若未指定-wal-dir,還會存儲WAL文件;如果不指定會用缺省目錄 #ETCD_LISTEN_PEER_URLS:集群通信監聽地址。用于監聽其他member發送信息的地址。ip為全0代表監聽本機所有接口 #ETCD_LISTEN_CLIENT_URLS:客戶端訪問監聽地址。用于監聽etcd客戶發送信息的地址。ip為全0代表監聽本機所有接口#Clustering:集群配置 #ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址。其他member使用,其他member通過該地址與本member交互信息。一定要保證從其他member能可訪問該地址。靜態配置方式下,該參數的value一定要同時在--initial-cluster參數中存在 #ETCD_ADVERTISE_CLIENT_URLS:客戶端通告地址。etcd客戶端使用,客戶端通過該地址與本member交互信息。一定要保證從客戶側能可訪問該地址 #ETCD_INITIAL_CLUSTER:集群節點地址。本member使用。描述集群中所有節點的信息,本member根據此信息去聯系其他member #ETCD_INITIAL_CLUSTER_TOKEN:集群Token。用于區分不同集群。本地如有多個集群要設為不同 #ETCD_INITIAL_CLUSTER_STATE:加入集群的當前狀態,new是新集群,existing表示加入已有集群。#創建etcd.service服務管理文件 cat > /usr/lib/systemd/system/etcd.service <<EOF [Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target[Service] Type=notify EnvironmentFile=${WORK_DIR}/cfg/etcd ExecStart=${WORK_DIR}/bin/etcd \ --name=\${ETCD_NAME} \ --data-dir=\${ETCD_DATA_DIR} \ --listen-peer-urls=\${ETCD_LISTEN_PEER_URLS} \ --listen-client-urls=\${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \ --advertise-client-urls=\${ETCD_ADVERTISE_CLIENT_URLS} \ --initial-advertise-peer-urls=\${ETCD_INITIAL_ADVERTISE_PEER_URLS} \ --initial-cluster=\${ETCD_INITIAL_CLUSTER} \ --initial-cluster-token=\${ETCD_INITIAL_CLUSTER_TOKEN} \ --initial-cluster-state=new \ --cert-file=${WORK_DIR}/ssl/server.pem \ --key-file=${WORK_DIR}/ssl/server-key.pem \ --trusted-ca-file=${WORK_DIR}/ssl/ca.pem \ --peer-cert-file=${WORK_DIR}/ssl/server.pem \ --peer-key-file=${WORK_DIR}/ssl/server-key.pem \ --peer-trusted-ca-file=${WORK_DIR}/ssl/ca.pem Restart=on-failure LimitNOFILE=65536[Install] WantedBy=multi-user.target EOF#--listen-client-urls:用于指定etcd和客戶端的連接端口 #--advertise-client-urls:用于指定etcd服務器之間通訊的端口,etcd有要求,如果--listen-client-urls被設置了,那么就必須同時設置--advertise-client-urls,所以即使設置和默認相同,也必須顯式設置 #--peer開頭的配置項用于指定集群內部TLS相關證書(peer 證書),這里全部都使用同一套證書認證 #不帶--peer開頭的的參數是指定 etcd 服務器TLS相關證書(server 證書),這里全部都使用同一套證書認證systemctl daemon-reload systemctl enable etcd systemctl restart etcd [root@master01 k8s]# ./etcd.sh etcd01 192.168.23.103 etcd02=https://192.168.23.104:2380,etcd03=https://192.168.23.105:2380#新開一個終端查看 [root@master01 k8s]# ps -ef | grep etcd3.3.3 將etcd相關的證書文件和命令文件拷貝到另外兩個節點
[root@master01 k8s]# scp -r /opt/etcd/ 192.168.23.104:/opt/ [root@master01 k8s]# scp -r /opt/etcd/ 192.168.23.105:/opt/#node1修改etcd文件 [root@node01 cfg]# vim /opt/etcd/cfg/etcd #[Member] ETCD_NAME="etcd02 ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://192.168.23.104:2380" ETCD_LISTEN_CLIENT_URLS="https://192.168.23.104:2379"#[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.23.104:2380" ETCD_ADVERTISE_CLIENT_URLS="https://192.168.23.104:2379" ETCD_INITIAL_CLUSTER="etcd01=https://192.168.23.103:2380,etcd02=https://192.168.23.104:2380,etcd03=https://192.168.23.105:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new"#node2修改etcd文件 [root@node02 ~]# vim /opt/etcd/cfg/etcd #[Member] ETCD_NAME="etcd03" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://192.168.23.105:2380" ETCD_LISTEN_CLIENT_URLS="https://192.168.23.105:2379"#[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.23.105:2380" ETCD_ADVERTISE_CLIENT_URLS="https://192.168.23.105:2379" ETCD_INITIAL_CLUSTER="etcd01=https://192.168.23.103:2380,etcd02=https://192.168.23.104:2380,etcd03=https://192.168.23.105:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new"3.3.4把etcd服務管理文件拷貝到另外兩個集群節點
[root@master01 k8s]# cd /usr/lib/systemd/system/ [root@master01 system]# ls etcd.service etcd.service [root@master01 system]# pwd /usr/lib/systemd/system [root@master01 system]# scp etcd.service 192.168.23.104:`pwd` [root@master01 system]# scp etcd.service 192.168.23.105:`pwd`3.3.5 在所有etcd節點上啟動etcd服務
[root@master01 k8s]# systemctl restart etcd [root@master01 k8s]# systemctl enable etcd [root@master01 k8s]# systemctl status etcd[root@node01 cfg]# systemctl daemon-reload [root@node01 cfg]# systemctl start etcd [root@node01 cfg]# systemctl enable etcd [root@node01 cfg]# systemctl status etcd[root@node02 ~]# systemctl daemon-reload [root@node02 ~]# systemctl restart etcd [root@node02 ~]# systemctl enable etcd.service [root@node02 ~]# systemctl status etcd3.4 在master01上檢查集群狀態
3.4.1 查看集群狀態
[root@master01 k8s]# cd /opt/etcd/ssl/ [root@master01 ssl]# /opt/etcd/bin/etcdctl \ --ca-file=ca.pem \ --cert-file=server.pem \ --key-file=server-key.pem \ --endpoints="https://192.168.23.103:2379,https://192.168.23.104:2379,https://192.168.23.105:2379" \ cluster-health–cert-file:識別HTTPS端使用ssL證書文件
–key-file:使用此ssL密鑰文件標識HTTPS客戶端
–ca-file:使用此CA證書驗證啟用https的服務器的證書
**–endpoints:**集群中以逗號分隔的機器地址列表cluster-health:檢查etcd集群的運行狀況
3.4.2 切換版本與查看集群節點狀態,成員列表
切換到etcd3版本查看集群節點狀態和成員列表
默認3.3etcd使用的是v2, 3.4的etcd默認使用的是v3版本。
v2和v3是命令不同。etcd2和etcd3也是不兼容的。默認使用etcd2
4 給所有node節點安裝docker引擎
#所有node幾點都需要安裝docker引擎。安裝docker引擎需要使用在線源 [root@master01 ssl]# cd /etc/yum.repos.d/ [root@master01 yum.repos.d]# ls bak local.repo [root@master01 yum.repos.d]# mv bak/* . [root@master01 yum.repos.d]# ls bak CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo local.repo CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo[root@master01 yum.repos.d]# yum install -y yum-utils device-mapper-persistent-data lvm2 [root@master01 yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo [root@master01 yum.repos.d]#yum install -y docker-ce docker-ce-cli containerd.io#所有node節點啟動docker [root@master01 yum.repos.d]# systemctl enable docker.service --now [root@master01 yum.repos.d]# systemctl is-active docker active5 在 master01 上配置flannel 網絡
5.1 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 地址通信。
5.2 Overlay Network 和 Vxlan
Overlay Network:
疊加網絡,在一層或者三層基礎網絡上疊加的一種虛擬網絡技術模式, 該網絡中的主機通過虛擬鏈路隧道連接起來(類似于VPN)。
VXLAN:
將源數據包封裝到UDP中,并使用基礎網絡的IP/MAC作為外層報文頭進行封裝,然后在以太網上傳輸,到達目的地后由隧道端點解封裝并將數據發送給目標地址。
5.3 flannel的工作原理
5.3.1 Flannel
- Flannel 是一款網絡插件CNI其中有(flannel、calico等),Flannel 的功能是讓集群中的不同節點主機創建的 Docker 容器都具有全集群唯一的虛擬 IP 地址,在K8s中實現跨主機pod相互間通信。
- Flannel 是 Overlay 網絡的一種,也是將 TCP 源數據包封裝在另一種網絡包里面進行路由轉發和通信,目前支持 UDP、VXLAN、host-GW(靜態路由)3種數據轉發方式。
5.3.2 flannel 工作原理
5.3.3 etcd 在flannel 提供
-
存儲管理Flannel可分配的IP地址段資源
-
監控 ETCD 中每個 Pod 節點對應node節點的路由表,并在內存中建立維護 Pod 節點路由表
5.4在etcd服務器上,添加 flannel網絡配置信息
#添加flannel 網絡配置信息,寫入分配的子網段到etcd 中,供flannel使用 [root@master01 yum.repos.d]# cd /opt/etcd/ssl/ [root@master01 ssl]# /opt/etcd/bin/etcdctl \ --ca-file=ca.pem \ --cert-file=server.pem \ --key-file=server-key.pem \ --endpoints="https://192.168.23.103:2379,https://192.168.23.104:2379,https://192.168.23.105:2379" \ set /coreos.com/network/config '{"Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}' ------------------------------------------------- #命令釋義: #使用etcdctl命令,借助ca證書,目標端點(endpoints)為三個ETCD節點IP,端口為2379 #set /coreos.com/network/config 設置網段信息,格式為 set <key> <value>,設置鍵值對 #"Network": "172.17.0.0/16" 設置docker0網段,此網段必須是集合網段(B類地址),而Pod分配的資源必須在此網段中的子網段(C類地址) #"Backend": {"Type": "vxlan"}} 設置flannel使用類型是VXLAN ---------------------------------------------------------------------#查看寫入信息 [root@master01 ssl]# /opt/etcd/bin/etcdctl \ --ca-file=ca.pem \ --cert-file=server.pem \ --key-file=server-key.pem \ --endpoints="https://192.168.23.103:2379,https://192.168.23.104:2379,https://192.168.23.105:2379" \ get /coreos.com/network/config5.5 在所有node節點上創建k8s工作目錄,啟動flanneld服務,開啟網絡功能
#這里操作要在所有的node節點上操作#上傳flannel.sh 和 flannel-v0.10.0-linux.amd64.tar.gz 到/opt目錄中 [root@node01 ~]# cd /opt/ [root@node011 opt]# ls flannel-v0.10.0-linux-amd64.tar.gz flannel.sh flannel.sh flannel-v0.10.0-linux-amd64.tar.gz[root@node01 opt]# ls flanneld mk-docker-opts.sh README.md flanneld mk-docker-opts.sh README.md #flanneld 為主要的執行文件,mk-docker-opts.sh 腳本主要用于生成Docker 啟動參數#創建kubernetes的工作目錄 [root@node01 opt]# mkdir -p /opt/kubernetes/{cfg,bin,ssl}[root@node01 opt]# mv /opt/mk-docker-opts.sh /opt/flanneld /opt/kubernetes/bin/#所有node節點啟動flanneld服務,開啟flannel網絡功能 [root@node01 opt]# cd /opt/ [root@node01 opt]# vim flannel.s #!/bin/bash#定義etcd集群的端點IP地址和對外提供服務的2379端口 #${var:-string}:若變量var為空,則用在命令行中用string來替換;否則變量var不為空時,則用變量var的值來替換,這里的1代表的是位置變量$1 ETCD_ENDPOINTS=${1:-"http://127.0.0.1:2379"}#創建flanneld配置文件 cat > /opt/kubernetes/cfg/flanneld <<EOF FLANNEL_OPTIONS="--etcd-endpoints=${ETCD_ENDPOINTS} \\ -etcd-cafile=/opt/etcd/ssl/ca.pem \\ -etcd-certfile=/opt/etcd/ssl/server.pem \\ -etcd-keyfile=/opt/etcd/ssl/server-key.pem" EOF#flanneld 本應使用 etcd 客戶端TLS相關證書(client 證書),這里全部都使用同一套證書認證。#創建flanneld.service服務管理文件 cat > /usr/lib/systemd/system/flanneld.service <<EOF [Unit] Description=Flanneld overlay address etcd agent After=network-online.target network.target Before=docker.service[Service] Type=notify EnvironmentFile=/opt/kubernetes/cfg/flanneld ExecStart=/opt/kubernetes/bin/flanneld --ip-masq \$FLANNEL_OPTIONS ExecStartPost=/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env Restart=on-failure[Install] WantedBy=multi-user.targetEOF#flanneld啟動后會使用 mk-docker-opts.sh 腳本生成 docker 網絡相關配置信息 #mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS:將組合選項鍵設置為環境變量DOCKER_NETWORK_OPTIONS,docker啟動時將使用此變量 #mk-docker-opts.sh -d /run/flannel/subnet.env:指定要生成的docker網絡相關信息配置文件的路徑,docker啟動時候引用此配置systemctl daemon-reload systemctl enable flanneld systemctl restart flanneld [root@node01 opt]# chmod +x flannel.sh #腳本后指定etcd集群位置 [root@node01 opt]# ./flannel.sh https://192.168.23.103:2379,https://192.168.23.104:2379,https://192.168.23.105:2379#flannel啟動后,會生成一個docker網絡相關信息配置文件/run/flannel/subnet.env, #包含了docker要使用flannel通訊的相關參數 [root@node01 opt]# cat /run/flannel/subnet.env DOCKER_OPT_BIP="--bip=172.17.4.1/24" DOCKER_OPT_IPMASQ="--ip-masq=false" DOCKER_OPT_MTU="--mtu=1450" DOCKER_NETWORK_OPTIONS=" --bip=172.17.4.1/24 --ip-masq=false --mtu=1450"[root@node01 opt]# systemctl status flanneld.service------------------ #--bip:指定docker 啟動時的子網 #--ip-masq:設置 ipmasq=false 關閉snat 偽裝策略 #--mtu=1450: 需要留出50字節給外層的vxlan封包額外開銷使用5.6 所有node節點配置 docker 連接flannel
[root@node01 opt]# vim /usr/lib/systemd/system/docker.service -----12行添加--- EnvironmentFile=/run/flannel/subnet.env -----13行修改(添加參數$DOCKER_NETWORK_OPTIONS) ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS -H fd:// --containerd=/run/containerd/containerd.sock[root@node01 opt]# systemctl daemon-reload [root@node01 opt]# systemctl restart docker5.7 測試連通性
#兩個node節點分別查看docker 0網卡和 flannel網卡 [root@node01 opt]# ifconfig#指定使用docker0 網卡的ip進行ping測試 [root@node01 opt]# ping -I 172.17.4.1 172.17.25.1總結
以上是生活随笔為你收集整理的kubernetes (k8s)的二进制部署单节点(etcd和flannel网络)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: k8s单节点部署(master ,nod
- 下一篇: k8s多节点(接单节点继续)