日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

kubernetes (k8s)的二进制部署单节点(etcd和flannel网络)

發布時間:2024/9/3 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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集群master01192.168.23.103kube-apiserver;kube-controller-manager; kube-scheduler;etcd
k8s集群master02192.168.23.10
k8s集群node01192.168.23.104kubelet; kube-proxy;docker;flannel
k8s集群node02192.168.23.105
etc集群節點1192.168.23.103etcd
etc集群節點2192.168.23.104
etc集群節點3192.168.23.105
負載均衡Nginx+keepalived01(master)192.168.23.11
負載均衡Nginx+keepalived02(backup)192.168.23.12
VIP192.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/fstab

2.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 node02

2.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 --system

2.5 所有主機配置時間同步

#所有主機配置時間同步yum -y install ntpdatentpdate time.windows.com

3 部署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.pe

3.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.md

etcd 就是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 etcd

3.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 etcd

3.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

#切換到使用版本3 [root@master01 k8s]# export ETCDCTL_API=3 [root@master01 k8s]# env | grep 'ETCDCTL_API' ETCDCTL_API=3 #版本3的查看 etcd版本的命令(v2使用則會報錯) [root@master01 k8s]# /opt/etcd/bin/etcdctl version etcdctl version: 3.3.10 API version: 3.3#使用版本2 [root@master01 k8s]# export ETCDCTL_API=2 [root@master01 k8s]# env | grep 'ETCDCTL_API' ETCDCTL_API=2 #版本2使用版本3的查看etcd版本的命令則會報錯 [root@master01 k8s]# /opt/etcd/bin/etcdctl version No help topic for 'version' #版本2的查看版本信息的命令 [root@master01 k8s]# /opt/etcd/bin/etcdctl -v etcdctl version: 3.3.10 API version: 2#臨時使用版本3去執行命令,執行完畢會回到當前版本 [root@master01 k8s]# ETCDCTL_API=3 /opt/etcd/bin/etcdctl version etcdctl version: 3.3.10 API version: 3.3 #當前版本為版本2 [root@master01 k8s]# env | grep 'ETCDCTL_API' ETCDCTL_API=2#臨時使用版本3環境,查看端點信息 [root@master01 ssl]# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --write-out=table endpoint status +----------------+------------------+---------+---------+-----------+-----------+------------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX | +----------------+------------------+---------+---------+-----------+-----------+------------+ | 127.0.0.1:2379 | 26a98cce76a3a470 | 3.3.10 | 20 kB | true | 1729 | 24 | +----------------+------------------+---------+---------+-----------+-----------+------------+#臨時使用版本3環境,查看成員列表 [root@master01 ssl]# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --write-out=table member list +------------------+---------+--------+-----------------------------+-----------------------------+ | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | +------------------+---------+--------+-----------------------------+-----------------------------+ | 71ab4d4ee785a5e | started | etcd03 | https://192.168.23.105:2380 | https://192.168.23.105:2379 | | 26a98cce76a3a470 | started | etcd01 | https://192.168.23.103:2380 | https://192.168.23.103:2379 | | c6880eee6e195aa6 | started | etcd02 | https://192.168.23.104:2380 | https://192.168.23.104:2379 | +------------------+---------+--------+-----------------------------+-----------------------------+ [root@master01 ssl]#

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 active

5 在 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 工作原理

  • 數據從源node節點的pod發出后,會經由docker0 網卡 轉發到flannel 網卡
  • 在flannel 網卡有個flanneld服務,其監聽flannel網卡。會把這個 數據包封裝到UDP報文中
  • 然后根據自己在etcd中維護的路由表,通過物理網卡轉發到目標node節點。
  • 數據包到達目標node節點后,會被flanneld服務解封裝
  • 之后數據包經由flannel網卡和 docker0網卡,轉發到目標pod的容器
  • 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/config

    5.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 docker

    5.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网络)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。