一、安裝K8S
1、單Master集群架構(gòu)
k8s集群master01:192.168.154.10 kube-apiserver kube-controller-manager kube-scheduler etcd
k8s集群node01:192.168.154.11 kubelet kube-proxy docker
k8s集群node02:192.168.154.12
etcd集群節(jié)點(diǎn)1:192.168.154.10 etcd
2、操作系統(tǒng)初始化配置
#所有節(jié)點(diǎn),關(guān)閉防火墻規(guī)則,關(guān)閉selinux,關(guān)閉swap交換
#關(guān)閉防火墻
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
#關(guān)閉selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
#關(guān)閉swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
#根據(jù)規(guī)劃設(shè)置主機(jī)名
hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02
#在master添加hosts
cat >> /etc/hosts << EOF
192.168.154.10 master01
192.168.154.11 node01
192.168.154.12 node02
EOF
#調(diào)整內(nèi)核參數(shù)
cat > /etc/sysctl.d/k8s.conf << EOF
#開啟網(wǎng)橋模式,可將網(wǎng)橋的流量傳遞給iptables鏈
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#關(guān)閉ipv6協(xié)議
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
#生效參數(shù)
sysctl --system
#時(shí)間同步
yum install ntpdate -y
ntpdate time.windows.com
3、部署docker引擎
#所有節(jié)點(diǎn)安裝docker
#安裝依賴包
yum install -y yum-utils device-mapper-persistent-data lvm2
--------------------------------------------------------------------------------------------
yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux內(nèi)核中支持邏輯卷管理的通用設(shè)備映射機(jī)制,它為實(shí)現(xiàn)用于存儲(chǔ)資源管理的塊設(shè)備驅(qū)動(dòng)提供了一個(gè)高度模塊化的內(nèi)核架構(gòu)。
device mapper存儲(chǔ)驅(qū)動(dòng)程序需要 device-mapper-persistent-data 和 lvm2。
--------------------------------------------------------------------------------------------
#設(shè)置阿里云鏡像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安裝 Docker-CE并設(shè)置為開機(jī)自動(dòng)啟動(dòng)
yum install -y docker-ce docker-ce-cli containerd.io
cd /etc/docker/
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "500m","max-file": "3"
}
}
EOF
systemctl start docker.service
systemctl enable docker.service
4、部署 etcd 集群
etcd是CoreOS團(tuán)隊(duì)于2013年6月發(fā)起的開源項(xiàng)目,它的目標(biāo)是構(gòu)建一個(gè)高可用的分布式鍵值(key-value)數(shù)據(jù)庫。etcd內(nèi)部采用raft協(xié)議作為一致性算法,etcd是go語言編寫的。
etcd 作為服務(wù)發(fā)現(xiàn)系統(tǒng),有以下的特點(diǎn):
簡(jiǎn)單:安裝配置簡(jiǎn)單,而且提供了HTTP API進(jìn)行交互,使用也很簡(jiǎn)單
安全:支持SSL證書驗(yàn)證
快速:?jiǎn)螌?shí)例支持每秒2k+讀操作
可靠:采用raft算法,實(shí)現(xiàn)分布式系統(tǒng)數(shù)據(jù)的可用性和一致性
etcd 目前默認(rèn)使用2379
端口提供HTTP API服務(wù), 2380端口和peer通信(這兩個(gè)端口已經(jīng)被IANA(互聯(lián)網(wǎng)數(shù)字分配機(jī)構(gòu))官方預(yù)留給etcd)。 即etcd默認(rèn)使用2379
端口對(duì)外為客戶端提供通訊,使用端口2380
來進(jìn)行服務(wù)器間內(nèi)部通訊。
etcd 在生產(chǎn)環(huán)境中一般推薦集群方式部署。由于etcd 的leader選舉機(jī)制,要求至少為3臺(tái)或以上的奇數(shù)臺(tái)。
//在 master01 節(jié)點(diǎn)上操作
#準(zhǔn)備cfssl證書生成工具
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
chmod +x /usr/local/bin/cfssl*
------------------------------------------------------------------------------------------
cfssl:證書簽發(fā)的工具命令
cfssljson:將 cfssl 生成的證書(json格式)變?yōu)槲募休d式證書
cfssl-certinfo:驗(yàn)證證書的信息
cfssl-certinfo -cert <證書名稱> #查看證書的信息
------------------------------------------------------------------------------------------
### 生成Etcd證書 ###
mkdir /opt/k8s
cd /opt/k8s/
#上傳 etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目錄中
chmod +x etcd-cert.sh etcd.sh
#創(chuàng)建用于生成CA證書、etcd 服務(wù)器證書以及私鑰的目錄
mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/
./etcd-cert.sh #生成CA證書、etcd 服務(wù)器證書以及私鑰
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.pem
#上傳 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目錄中,啟動(dòng)etcd服務(wù)
cd /opt/k8s/
tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
ls etcd-v3.4.9-linux-amd64
Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
------------------------------------------------------------------------------------------
etcd就是etcd 服務(wù)的啟動(dòng)命令,后面可跟各種啟動(dòng)參數(shù)
etcdctl主要為etcd 服務(wù)提供了命令行操作
------------------------------------------------------------------------------------------
#創(chuàng)建用于存放 etcd 配置文件,命令文件,證書的目錄
mkdir -p /opt/etcd/{cfg,bin,ssl}
cd /opt/k8s/etcd-v3.4.9-linux-amd64/
mv etcd etcdctl /opt/etcd/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
cd /opt/k8s/
./etcd.sh etcd01 192.168.154.10 etcd02=https://192.168.154.11:2380,etcd03=https://192.168.154.12:2380
#進(jìn)入卡住狀態(tài)等待其他節(jié)點(diǎn)加入,這里需要三臺(tái)etcd服務(wù)同時(shí)啟動(dòng),如果只啟動(dòng)其中一臺(tái)后,服務(wù)會(huì)卡在那里,直到集群中所有etcd節(jié)點(diǎn)都已啟動(dòng),可忽略這個(gè)情況
#可另外打開一個(gè)窗口查看etcd進(jìn)程是否正常
ps -ef | grep etcd
#把etcd相關(guān)證書文件、命令文件和服務(wù)管理文件全部拷貝到另外兩個(gè)etcd集群節(jié)點(diǎn)
scp -r /opt/etcd/ root@192.168.154.11:/opt/
scp -r /opt/etcd/ root@192.168.154.12:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.154.11:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.154.12:/usr/lib/systemd/system/
//在 master01 節(jié)點(diǎn)上操作
cd /opt
ls -R etcd/
scp -r etcd/ node01:/opt
scp -r etcd/ node02:/opt
cd /usr/lib/systemd/system
ls etcd.service
scp etcd.service node01:`pwd`
scp etcd.service node02:`pwd`
在node01節(jié)點(diǎn)上操作
cd /opt/etcd/cfg
vim etcd
#[Member]
ETCD_NAME="etcd02"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.154.11:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.154.11:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.154.11:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.154.11:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.154.10:2380,etcd02=https://192.168.154.11:2380,etcd03=https://192.168.154.12:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
#啟動(dòng)etcd服務(wù)
systemctl daemon-reload
systemctl enable --now etcd.service
systemctl status etcd.service
在node02節(jié)點(diǎn)上操作
cd /opt/etcd/cfg
vim etcd
#[Member]
ETCD_NAME="etcd03"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.154.12:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.154.12:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.154.12:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.154.12:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.154.10:2380,etcd02=https://192.168.154.11:2380,etcd03=https://192.168.154.12:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
#啟動(dòng)etcd服務(wù)
systemctl daemon-reload
systemctl enable --now etcd.service
systemctl status etcd.service
#檢查etcd群集狀態(tài)
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.154.10:2379,https://192.168.154.11:2379,https://192.168.154.12:2379" endpoint health --write-out=table
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.154.10:2379,https://192.168.154.11:2379,https://192.168.154.12:2379" --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --write-out=table endpoint status
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.154.10:2379,https://192.168.154.11:2379,https://192.168.154.12:2379" --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --write-out=table member list
實(shí)現(xiàn)etcd的備份操作
cd
mkdir etcd/backup -p
cd etcd/
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.154.10:2379" --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem snapshot save /root/etcd-snapshot.db
恢復(fù)etcd的操作
//查看etcd-snapshot.db的文件
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.154.10:2379" --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem snapshot status ./etcd-snapshot.db --write-out=table
//恢復(fù)etcd
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.154.10:2379" --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem snapshot restore ./etcd-snapshot.db
5、部署 Master 組件
//在 master01 節(jié)點(diǎn)上操作
#上傳 master.zip 和 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s 目錄中,解壓 master.zip 壓縮包
cd /opt/k8s/
unzip master.zip
chmod +x *.sh
#創(chuàng)建kubernetes工作目錄
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
#創(chuàng)建用于生成CA證書、相關(guān)組件的證書和私鑰的目錄
mkdir /opt/k8s/k8s-cert
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
cd /opt/k8s/k8s-cert/
vim k8s-cert.sh #改地址
./k8s-cert.sh #生成CA證書、相關(guān)組件的證書和私鑰
ls *pem
admin-key.pem apiserver-key.pem ca-key.pem kube-proxy-key.pem
admin.pem apiserver.pem ca.pem kube-proxy.pem
#復(fù)制CA證書、apiserver相關(guān)證書和私鑰到 kubernetes工作目錄的 ssl 子目錄中
cp kube-apiserver kube-controller-manager kube-scheduler kubectl /opt/kubernetes/bin/
#上傳 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 kubernetes 壓縮包
cd /opt/k8s/
tar zxvf kubernetes-server-linux-amd64.tar.gz
#復(fù)制master組件的關(guān)鍵命令文件到 kubernetes工作目錄的 bin 子目錄中
cd /opt/k8s/kubernetes/server/bin
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
ln -s /opt/kubernetes/bin/* /usr/local/bin/
#創(chuàng)建 bootstrap token 認(rèn)證文件,apiserver 啟動(dòng)時(shí)會(huì)調(diào)用,然后就相當(dāng)于在集群內(nèi)創(chuàng)建了一個(gè)這個(gè)用戶,接下來就可以用 RBAC 給他授權(quán)
cd /opt/k8s/
vim token.csv
cfe2bd4ece1251173600ff7fd6b02410,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
mv token.csv /opt/kubernetes/cfg/
chmod +x *.sh
vim apiserver.sh
./apiserver.sh 192.168.154.10 https://192.168.154.10:2379,https://192.168.154.11:2379,https://192.168.154.12:2379
#檢查進(jìn)程是否啟動(dòng)成功
ps aux | grep kube-apiserver
netstat -natp | grep 6443 #安全端口6443用于接收HTTPS請(qǐng)求,用于基于Token文件或客戶端證書等認(rèn)證
#啟動(dòng) controller-manager 服務(wù)
./controller-manager.sh
ps aux | grep kube-controller-manager
#啟動(dòng) scheduler 服務(wù)
cd /opt/k8s/
./scheduler.sh
ps aux | grep kube-scheduler
#生成kubectl連接集群的kubeconfig文件
./admin.sh
#綁定默認(rèn)cluster-admin管理員集群角色,授權(quán)kubectl訪問集群
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
#通過kubectl工具查看當(dāng)前集群組件狀態(tài)
kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-2 Healthy {"health":"true"}
etcd-1 Healthy {"health":"true"}
etcd-0 Healthy {"health":"true"}
#查看版本信息
kubectl version
6、部署 Worker Node 組件
//在所有 node 節(jié)點(diǎn)上操作
#創(chuàng)建kubernetes工作目錄
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
#上傳 node.zip 到 /opt 目錄中,解壓 node.zip 壓縮包,獲得kubelet.sh、proxy.sh
cd /opt/
unzip node.zip
chmod +x kubelet.sh proxy.sh
//在 master01 節(jié)點(diǎn)上操作
#把 kubelet、kube-proxy 拷貝到 node 節(jié)點(diǎn)
cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@192.168.154.11:/opt/kubernetes/bin/
scp kubelet kube-proxy root@192.168.154.12:/opt/kubernetes/bin/
#上傳kubeconfig.sh文件到/opt/k8s/kubeconfig目錄中,生成kubelet初次加入集群引導(dǎo)kubeconfig文件和kube-proxy.kubeconfig文件
#kubeconfig 文件包含集群參數(shù)(CA 證書、API Server 地址),客戶端參數(shù)(上面生成的證書和私鑰),集群 context 上下文參數(shù)(集群名稱、用戶名)。Kubenetes 組件(如 kubelet、kube-proxy)通過啟動(dòng)時(shí)指定不同的 kubeconfig 文件可以切換到不同的集群,連接到 apiserver。
mkdir /opt/k8s/kubeconfig
cd /opt/k8s/kubeconfig
chmod +x kubeconfig.sh
./kubeconfig.sh 192.168.154.10 /opt/k8s/k8s-cert/
#把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節(jié)點(diǎn)
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.154.11:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.154.12:/opt/kubernetes/cfg/
#RBAC授權(quán),使用戶 kubelet-bootstrap 能夠有權(quán)限發(fā)起 CSR 請(qǐng)求證書
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
------------------------------------------------------------------------------------------
kubelet 采用 TLS Bootstrapping 機(jī)制,自動(dòng)完成到 kube-apiserver 的注冊(cè),在 node 節(jié)點(diǎn)量較大或者后期自動(dòng)擴(kuò)容時(shí)非常有用。
Master apiserver 啟用 TLS 認(rèn)證后,node 節(jié)點(diǎn) kubelet 組件想要加入集群,必須使用CA簽發(fā)的有效證書才能與 apiserver 通信,當(dāng) node 節(jié)點(diǎn)很多時(shí),簽署證書是一件很繁瑣的事情。因此 Kubernetes 引入了 TLS bootstraping 機(jī)制來自動(dòng)頒發(fā)客戶端證書,kubelet 會(huì)以一個(gè)低權(quán)限用戶自動(dòng)向 apiserver 申請(qǐng)證書,kubelet 的證書由 apiserver 動(dòng)態(tài)簽署。
kubelet 首次啟動(dòng)通過加載 bootstrap.kubeconfig 中的用戶 Token 和 apiserver CA 證書發(fā)起首次 CSR 請(qǐng)求,這個(gè) Token 被預(yù)先內(nèi)置在 apiserver 節(jié)點(diǎn)的 token.csv 中,其身份為 kubelet-bootstrap 用戶和 system:kubelet-bootstrap 用戶組;想要首次 CSR 請(qǐng)求能成功(即不會(huì)被 apiserver 401 拒絕),則需要先創(chuàng)建一個(gè) ClusterRoleBinding,將 kubelet-bootstrap 用戶和 system:node-bootstrapper 內(nèi)置 ClusterRole 綁定(通過 kubectl get clusterroles 可查詢),使其能夠發(fā)起 CSR 認(rèn)證請(qǐng)求。
TLS bootstrapping 時(shí)的證書實(shí)際是由 kube-controller-manager 組件來簽署的,也就是說證書有效期是 kube-controller-manager 組件控制的;kube-controller-manager 組件提供了一個(gè) --experimental-cluster-signing-duration 參數(shù)來設(shè)置簽署的證書有效時(shí)間;默認(rèn)為 8760h0m0s,將其改為 87600h0m0s,即 10 年后再進(jìn)行 TLS bootstrapping 簽署證書即可。
也就是說 kubelet 首次訪問 API Server 時(shí),是使用 token 做認(rèn)證,通過后,Controller Manager 會(huì)為 kubelet 生成一個(gè)證書,以后的訪問都是用證書做認(rèn)證了。
TLS bootstrapping 機(jī)制
有master的組件自動(dòng)給kubelet簽發(fā)證書
1)kubelet首次訪問apiserver,是通過bootstrap.kubeconfig的token來認(rèn)證的
2)kubelet會(huì)以一個(gè)低權(quán)限用戶(token.csv里的kubelet-bootstrap)向apiserver發(fā)起CSR請(qǐng)求申請(qǐng)證書
3)如果apiserver通過CSR請(qǐng)求后,會(huì)由controller-manager根據(jù)配置文件生成證書,并通過apiserver發(fā)給kubelet
4) kubelet以后再訪問apiserver就會(huì)使用簽發(fā)的證書來做認(rèn)證
------------------------------------------------------------------------------------------
//在 node01 節(jié)點(diǎn)上操作
//啟動(dòng) kubelet 服務(wù)
cd /opt/
./kubelet.sh 192.168.154.11
ps aux | grep kubelet
//在 master01 節(jié)點(diǎn)上操作,通過 CSR 請(qǐng)求
//檢查到 node01 節(jié)點(diǎn)的 kubelet 發(fā)起的 CSR 請(qǐng)求,Pending 表示等待集群給該節(jié)點(diǎn)簽發(fā)證書
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-x-o7xwAYtP0-Cxemis_3WpGD5DFOadHldFQTK4UegTw 50s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
//通過 CSR 請(qǐng)求
kubectl certificate approve node-csr-x-o7xwAYtP0-Cxemis_3WpGD5DFOadHldFQTK4UegTw
//Approved,Issued 表示已授權(quán) CSR 請(qǐng)求并簽發(fā)證書
kubectl get csr
//查看節(jié)點(diǎn),由于網(wǎng)絡(luò)插件還沒有部署,節(jié)點(diǎn)會(huì)沒有準(zhǔn)備就緒 NotReady
kubectl get nodes
//在 node01 節(jié)點(diǎn)上操作
//加載 ip_vs 模塊
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
//啟動(dòng)proxy服務(wù)
cd /opt/
./proxy.sh 192.168.154.11
ps aux | grep kube-proxy
ls kubernetes/ssl/
//自動(dòng)批準(zhǔn) CSR 請(qǐng)求
//在Master01主節(jié)點(diǎn)
kubectl create clusterrolebinding node-autoapprove-bootstrap --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --user=kubelet-bootstrap
kubectl create clusterrolebinding node-autoapprove-certificate-rotation --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient --user=kubelet-bootstrap
//在node01節(jié)點(diǎn)
cd /opt
scp kubelet.sh proxy.sh 192.168.154.12:/opt
//在node01節(jié)點(diǎn)
cd /opt
./kubelet.sh 192.168.154.12
ps aux | grep kubelet
ls kubernetes/ssl/
再回Master主節(jié)點(diǎn)查看
kubectl get nodes
在這里插入圖片描述
7、部署 CNI 網(wǎng)絡(luò)組件
7.1 部署 flannel
K8S 中 Pod 網(wǎng)絡(luò)通信:
●Pod 內(nèi)容器與容器之間的通信
在同一個(gè) Pod 內(nèi)的容器(Pod 內(nèi)的容器是不會(huì)跨宿主機(jī)的)共享同一個(gè)網(wǎng)絡(luò)命令空間,相當(dāng)于它們?cè)谕慌_(tái)機(jī)器上一樣,可以用 localhost 地址訪問彼此的端口。
●同一個(gè) Node 內(nèi) Pod 之間的通信
每個(gè) Pod 都有一個(gè)真實(shí)的全局 IP 地址,同一個(gè) Node 內(nèi)的不同 Pod 之間可以直接采用對(duì)方 Pod 的 IP 地址進(jìn)行通信,Pod1 與 Pod2 都是通過 Veth 連接到同一個(gè) docker0 網(wǎng)橋,網(wǎng)段相同,所以它們之間可以直接通信。
●不同 Node 上 Pod 之間的通信
Pod 地址與 docker0 在同一網(wǎng)段,docker0 網(wǎng)段與宿主機(jī)網(wǎng)卡是兩個(gè)不同的網(wǎng)段,且不同 Node 之間的通信只能通過宿主機(jī)的物理網(wǎng)卡進(jìn)行。
要想實(shí)現(xiàn)不同 Node 上 Pod 之間的通信,就必須想辦法通過主機(jī)的物理網(wǎng)卡 IP 地址進(jìn)行尋址和通信。因此要滿足兩個(gè)條件:Pod 的 IP 不能沖突;將 Pod 的 IP 和所在的 Node 的 IP 關(guān)聯(lián)起來,通過這個(gè)關(guān)聯(lián)讓不同 Node 上 Pod 之間直接通過內(nèi)網(wǎng) IP 地址通信。
Overlay Network:
疊加網(wǎng)絡(luò),在二層或者三層基礎(chǔ)網(wǎng)絡(luò)上疊加的一種虛擬網(wǎng)絡(luò)技術(shù)模式,該網(wǎng)絡(luò)中的主機(jī)通過虛擬鏈路隧道連接起來(類似于VPN)。
VXLAN:
將源數(shù)據(jù)包封裝到UDP中,并使用基礎(chǔ)網(wǎng)絡(luò)的IP/MAC作為外層報(bào)文頭進(jìn)行封裝,然后在以太網(wǎng)上傳輸,到達(dá)目的地后由隧道端點(diǎn)解封裝并將數(shù)據(jù)發(fā)送給目標(biāo)地址。
Flannel:
Flannel 的功能是讓集群中的不同節(jié)點(diǎn)主機(jī)創(chuàng)建的 Docker 容器都具有全集群唯一的虛擬 IP 地址。
Flannel 是 Overlay 網(wǎng)絡(luò)的一種,也是將 TCP 源數(shù)據(jù)包封裝在另一種網(wǎng)絡(luò)包里面進(jìn)行路由轉(zhuǎn)發(fā)和通信,目前支持 udp、vxlan、 host-GW 3種數(shù)據(jù)轉(zhuǎn)發(fā)方式。
7.2 Flannel udp 模式的工作原理
1、數(shù)據(jù)從主機(jī)A 上的 Pod 的源容器中發(fā)出后,經(jīng)由所在主機(jī)的 cni0/docker0 (安裝了網(wǎng)絡(luò)插件后就不在是docker0而是cni0網(wǎng)卡)網(wǎng)橋轉(zhuǎn)發(fā)到 flannel0 接口,flanneld 服務(wù)監(jiān)聽在 flannel0 接口的另外一端。
2、發(fā)送給 flannel0 接口的IP 包信息將被 flanneld 進(jìn)程接收,flanneld 進(jìn)程接收 IP 包后在原有的基礎(chǔ)上進(jìn)行 UDP 封包(UDP報(bào)文里包含源Pod的數(shù)據(jù)包)
3、Flannel 通過 etcd(包含所有的Pod的ip以及所對(duì)應(yīng)的node主機(jī)的地址) 服務(wù)維護(hù)了一張節(jié)點(diǎn)間的路由表。目標(biāo)容器所在宿主機(jī)(node節(jié)點(diǎn))的 IP 地址,flanneld 通過查詢 etcd 很容易就能得到
4、flanneld 將封裝好的 UDP 報(bào)文通過物理網(wǎng)卡轉(zhuǎn)發(fā)出去,主機(jī)B 收到 UDP 報(bào)文后,Linux 內(nèi)核通過 8285 端口將包交給正在監(jiān)聽的 flanneld 進(jìn)程
5、運(yùn)行在主機(jī)B 上的 flanneld 將 UDP 包解包后得到的原始 IP 包,內(nèi)核通過查詢本機(jī)路由表將該 IP 包轉(zhuǎn)發(fā)給 cni0 網(wǎng)橋
6、cni0 網(wǎng)橋?qū)?IP 包轉(zhuǎn)發(fā)給連接在網(wǎng)橋上的目標(biāo)Pod。至此整個(gè)流程結(jié)束。回程報(bào)文將按照上面的數(shù)據(jù)流原路返回
ETCD 之 Flannel 提供說明:
存儲(chǔ)管理Flannel可分配的IP地址段資源
監(jiān)控 ETCD 中每個(gè) Pod 的實(shí)際地址,并在內(nèi)存中建立維護(hù) Pod 節(jié)點(diǎn)路由表
由于 udp 模式是在用戶態(tài)做轉(zhuǎn)發(fā),會(huì)多一次報(bào)文隧道封裝,因此性能上會(huì)比在內(nèi)核態(tài)做轉(zhuǎn)發(fā)的 vxlan 模式差。
vxlan 模式:
vxlan 是一種overlay(虛擬隧道通信)技術(shù),通過三層網(wǎng)絡(luò)搭建虛擬的二層網(wǎng)絡(luò),跟 udp 模式具體實(shí)現(xiàn)不太一樣:
(1)udp模式是在用戶態(tài)實(shí)現(xiàn)的,數(shù)據(jù)會(huì)先經(jīng)過tun網(wǎng)卡,到應(yīng)用程序,應(yīng)用程序再做隧道封裝,再進(jìn)一次內(nèi)核協(xié)議棧,而vxlan是在內(nèi)核當(dāng)中實(shí)現(xiàn)的,只經(jīng)過一次協(xié)議棧,在協(xié)議棧內(nèi)就把vxlan包組裝好
(2)udp模式的tun網(wǎng)卡是三層轉(zhuǎn)發(fā),使用tun是在物理網(wǎng)絡(luò)之上構(gòu)建三層網(wǎng)絡(luò),屬于ip in udp,vxlan模式是二層實(shí)現(xiàn), overlay是二層幀,屬于mac in udp
(3)vxlan由于采用mac in udp的方式,所以實(shí)現(xiàn)起來會(huì)涉及mac地址學(xué)習(xí),arp廣播等二層知識(shí),udp模式主要關(guān)注路由
7.3 Flannel vxlan 模式的工作原理
1、數(shù)據(jù)幀從主機(jī)A 上 Pod 的源容器中發(fā)出后,經(jīng)由所在主機(jī)的 cin0 網(wǎng)絡(luò)接口轉(zhuǎn)發(fā)到 flannel.1 接口
2、flannel.1 收到數(shù)據(jù)幀后添加 VXLAN 頭部,封裝成 VXLAN UDP 報(bào)文
3、主機(jī)A 通過物理網(wǎng)卡發(fā)送封包到主機(jī)B 的物理網(wǎng)卡中
4、通過 VXLAN 8472 端口, VXLAN 包被轉(zhuǎn)發(fā)到 flannel.1 接口進(jìn)行解封裝
5、根據(jù)解包后得到原始報(bào)文中的目的IP,內(nèi)核將原始報(bào)文發(fā)送給 cni0,最后由 cni0 發(fā)送給連接在此接口上的 PodB
//在 node01 節(jié)點(diǎn)上操作
//上傳 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 目錄中
cd /opt/
mkdir flannel
mv flannel-v0.21.5.zip flannel/
cd flannel/
unzip flannel-v0.21.5.zip
docker load -i flannel.tar
docker load -i flannel-cni-plugin.tar
cd /opt
mkdir -p /opt/cni/bin
cd flannel/
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin
cd /opt
scp -r cni/ flannel/ 192.168.154.12:/opt
//node2節(jié)點(diǎn)上操作
cd /opt
cd flannel/
docker load -i flannel.tar
docker load -i flannel-cni-plugin.tar
//在node01節(jié)點(diǎn)上操作
cd /opt/flannel/
scp kube-flannel.yml 192.168.154.10:/opt/k8s
//在 master01 節(jié)點(diǎn)上操作
//上傳 kube-flannel.yml 文件到 /opt/k8s 目錄中,部署 CNI 網(wǎng)絡(luò)
cd /opt/k8s
kubectl apply -f kube-flannel.yml
kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-6md78 1/1 Running 0 3s
kube-flannel kube-flannel-ds-mbsvh 1/1 Running 0 3s
kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.154.11 Ready <none> 46h v1.20.15
192.168.154.12 Ready <none> 46h v1.20.15
8、部署 CoreDNS
coreDNS: CoreDNS是 Kbernetes 的默認(rèn) DNS 實(shí)現(xiàn)。可以為集群中的 service 資源創(chuàng)建一個(gè)資源名稱 與 CLusterIP 的對(duì)應(yīng)關(guān)系解析
Kubernetes 可以選擇使用 DNS 水避免將服務(wù)的集群 IP 地址硬編碼到您的應(yīng)用程序中。
//在所有 node 節(jié)點(diǎn)上操作
//上傳 coredns.tar 到 /opt 目錄中
cd /opt
docker load -i coredns.tar
//在 master01 節(jié)點(diǎn)上操作
//上傳 coredns.yaml 文件到 /opt/k8s 目錄中,部署 CoreDNS
cd /opt/k8s
kubectl apply -f coredns.yaml
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-5ffbfd976d-j6shb 1/1 Running 0 32s
//在 master01 節(jié)點(diǎn)上操作
cd /opt/k8s
vim test.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
kubectl apply -f test.yaml
//DNS 解析測(cè)試
kubectl run -it --rm dns-test --image=busybox:1.28.4 sh
If you don't see a command prompt, try pressing enter.
/ # vi /etc/resolv.conf
復(fù)制default.svc.cluster.local
/ # nslookup my-service.default.svc.cluster.local
Name: kubernetes
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local
文章來源:http://www.zghlxwxcb.cn/news/detail-497703.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-497703.html
到了這里,關(guān)于二進(jìn)制安裝K8S(單Master集群架構(gòu))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!