連接上文
notready是因?yàn)闆](méi)有網(wǎng)絡(luò),因此無(wú)法創(chuàng)建pod
?k8s的CNI網(wǎng)絡(luò)插件模式
1.pod內(nèi)部,容器與容器之間的通信。
在同一個(gè)pod中的容器共享資源和網(wǎng)絡(luò),使用同一個(gè)網(wǎng)絡(luò)命名空間。
2.同一個(gè)node節(jié)點(diǎn)之內(nèi),不同pod之間的通信。
每個(gè)pod都有一個(gè)全局的真實(shí)IP地址,同一個(gè)node之間的不同pod可以直接使用對(duì)方pod的ip地址進(jìn)行通信。
pod1和pod2是通過(guò)docker0的網(wǎng)橋來(lái)進(jìn)行通信。
3.不同node節(jié)點(diǎn)的pod如何通信。
Pod 地址與 docker0 在同一網(wǎng)段,docker0 網(wǎng)段與宿主機(jī)網(wǎng)卡是兩個(gè)不同的網(wǎng)段,且不同 Node 之間的通信只能通過(guò)宿主機(jī)的物理網(wǎng)卡進(jìn)行。
要想實(shí)現(xiàn)不同 Node 上 Pod 之間的通信,就必須想辦法通過(guò)主機(jī)的物理網(wǎng)卡 IP 地址進(jìn)行尋址和通信。因此要滿(mǎn)足兩個(gè)條件:Pod 的 IP 不能沖突;將 Pod 的 IP 和所在的 Node 的 IP 關(guān)聯(lián)起來(lái),通過(guò)這個(gè)關(guān)聯(lián)讓不同 Node 上 Pod 之間直接通過(guò)內(nèi)網(wǎng) IP 地址通信。
?
cni插件
cni是一個(gè)標(biāo)準(zhǔn)接口,用于容器運(yùn)行時(shí)調(diào)用網(wǎng)絡(luò)插件,配置容器網(wǎng)絡(luò),復(fù)制設(shè)置容器的網(wǎng)絡(luò)命名空間,IP地址,路由等參數(shù)
flannel:
功能就是讓集群之中不同節(jié)點(diǎn)的docker容器具有全集群唯一的虛擬IP地址。
overlay網(wǎng)絡(luò)
在底層物理網(wǎng)絡(luò)的基礎(chǔ)之上,創(chuàng)建一個(gè)邏輯的網(wǎng)絡(luò)層。二層+三層的集合 二層是物理網(wǎng)絡(luò),三層是邏輯上的網(wǎng)絡(luò)層
overlay網(wǎng)絡(luò)也是一種網(wǎng)絡(luò)虛擬化的技術(shù)。
flannel支持的數(shù)據(jù)轉(zhuǎn)發(fā)方式:
1.UDP模式(flannel1.0):
默認(rèn)模式,應(yīng)用轉(zhuǎn)發(fā),配置簡(jiǎn)單,但是性能最差。
基于應(yīng)用層,用戶(hù)態(tài)
工作流程圖:
2.vxlan(flannel1.1):
基于內(nèi)核轉(zhuǎn)發(fā),也是最常用的網(wǎng)絡(luò)類(lèi)型(小集群都是用這個(gè))
根據(jù)vni來(lái)解析IP地址
3.host-gw(性能最好,但是配置麻煩)
Calico網(wǎng)絡(luò)插件
flannel:每個(gè)發(fā)向容器的數(shù)據(jù)包進(jìn)行封裝,vxlan通過(guò)vtep打包數(shù)據(jù),由內(nèi)核封裝數(shù)據(jù)包----》再轉(zhuǎn)發(fā)到目標(biāo)node節(jié)點(diǎn)。還有一個(gè)解封裝的過(guò)程。再發(fā)送到目標(biāo)pod。性能是有一定影響的。
Calico:采用直接路由的方式。BGP路由。不需要修改報(bào)文,同意直接通過(guò)路由表轉(zhuǎn)發(fā),路由表會(huì)相當(dāng)復(fù)雜,運(yùn)行維護(hù)的要求比較高。
BGP模式的特點(diǎn):交換路由信息的外部網(wǎng)關(guān)協(xié)議,可以連接不同的節(jié)點(diǎn)。node節(jié)點(diǎn)可能不是一個(gè)網(wǎng)段,BGP實(shí)現(xiàn)可靠的,最佳的,動(dòng)態(tài)的路由選擇。自動(dòng)識(shí)別相鄰的路由設(shè)備
calico 不使用 overlay,也不需要交換,直接通過(guò)虛擬路由實(shí)現(xiàn),每一臺(tái)虛擬路由都通過(guò)BGP轉(zhuǎn)發(fā)。
核心組件:
felix:也是運(yùn)行在主機(jī)上的一個(gè)個(gè)pod,一個(gè)進(jìn)程,k8s daemonset的方式部署pod.
daemont set 會(huì)在每個(gè)節(jié)點(diǎn)部署相同的Pod,后臺(tái)的運(yùn)行方式。
負(fù)責(zé)宿主機(jī)上插入路由規(guī)則,維護(hù)calico需要的網(wǎng)絡(luò)設(shè)備。網(wǎng)絡(luò)接口管理,監(jiān)聽(tīng),路由等等。
BGP Client:bird BGP的客戶(hù)端,專(zhuān)門(mén)負(fù)責(zé)在集群中分發(fā)路由規(guī)則的信息。每一個(gè)節(jié)點(diǎn)都會(huì)有一個(gè)BGP Client。
BGP協(xié)議廣播方式通知其他節(jié)點(diǎn)的,分發(fā)路由的規(guī)則。實(shí)現(xiàn)網(wǎng)絡(luò)互通。
etcd:保存路由信息,負(fù)責(zé)網(wǎng)絡(luò)元數(shù)據(jù)的一致性。保證網(wǎng)絡(luò)狀態(tài)的一致和準(zhǔn)確。
calico的工作原理(路由轉(zhuǎn)發(fā)):
路由表來(lái)維護(hù)每個(gè)pod之間的通信。
創(chuàng)建好pod之后,添加一個(gè)設(shè)備cali veth pair設(shè)備。
虛擬網(wǎng)卡: veth pair是一對(duì)設(shè)備,虛擬的以太網(wǎng)設(shè)備。
一頭連接在容器的網(wǎng)絡(luò)命名空間
另一頭連接宿主機(jī)的網(wǎng)絡(luò)命名空間 cali
ip地址分配: veth pair連接容器的部分給容器分配一個(gè)IP地址,這個(gè)IP地址是唯一標(biāo)識(shí),宿主機(jī)也會(huì)被veth pair分配一個(gè)calico網(wǎng)絡(luò)的內(nèi)部IP地址。和其他節(jié)點(diǎn)上的容器進(jìn)行通信。
veth設(shè)備:容器發(fā)出的IP通過(guò)veth pair設(shè)備到宿主機(jī),宿主機(jī)根據(jù)路由規(guī)則的下一跳地址,發(fā)送到網(wǎng)關(guān)(目標(biāo)宿主機(jī))。數(shù)據(jù)包到達(dá)目標(biāo)宿主機(jī),veth pair設(shè)備,目標(biāo)宿主機(jī)也是根據(jù)路由規(guī)則,下一跳地址,轉(zhuǎn)發(fā)到目標(biāo)容器。
ipip模式:會(huì)生成一個(gè)tunnel,數(shù)據(jù)包都在tunnel內(nèi)部打包。封裝:宿主機(jī)ip 容器內(nèi)部的IP
常用的有flannel和calico
flannel的特點(diǎn):配置簡(jiǎn)單,功能簡(jiǎn)單,基于overlay疊加網(wǎng)絡(luò)實(shí)現(xiàn),在物理層的網(wǎng)絡(luò)層上再封裝一個(gè)網(wǎng)絡(luò)層
vxlan:是虛擬三層網(wǎng)絡(luò)。最多的模式。vni+ip進(jìn)行轉(zhuǎn)發(fā),flannel提供路由表,內(nèi)核來(lái)封裝和解封裝。
host-gw():
由于封裝和解封裝的過(guò)程,對(duì)數(shù)據(jù)傳輸?shù)男阅軙?huì)有影響。沒(méi)有網(wǎng)絡(luò)策略配置的能力。
udp:是默認(rèn)模式
calico:功能強(qiáng)大,基于路由表進(jìn)行轉(zhuǎn)發(fā),沒(méi)有封裝和解封裝的過(guò)程。具備網(wǎng)絡(luò)策略的配置能力。但是路由表維護(hù)起來(lái)復(fù)雜。
模式:ipip BGP
BGP:通過(guò)為ip路由表的前綴來(lái)實(shí)現(xiàn)目標(biāo)主機(jī)的可達(dá)性。對(duì)比ipip模式,BGP模式?jīng)]有隧道,BGP模式下,POD的數(shù)據(jù)包直接通過(guò)網(wǎng)卡發(fā)送到目的地。
ipip的隧道:隧道進(jìn)行數(shù)據(jù)包的封裝 ipv4----ipv4.
簡(jiǎn)單的小集群:flannel
擴(kuò)容,配置網(wǎng)絡(luò)策略:calico
部署coreDNS
//在所有 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 STA
TUS RESTARTS AGE
coredns-5ffbfd976d-j6shb 1/1 Running 0 32s
#DNS 解析測(cè)試
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
kubectl run -it --rm dns-test --image=busybox:1.28.4 sh
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes
Server: 10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local
Name: kubernetes
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local
exit
---------- master02 節(jié)點(diǎn)部署 ----------
//從 master01 節(jié)點(diǎn)上拷貝證書(shū)文件、各master組件的配置文件和服務(wù)管理文件到 master02 節(jié)點(diǎn)
scp -r /opt/etcd/ root@20.0.0.62:/opt/
scp -r /opt/kubernetes/ root@20.0.0.62:/opt
scp -r /root/.kube root@20.0.0.62:/root
scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@20.0.0.62:/usr/lib/systemd/system/
//修改配置文件kube-apiserver中的IP
vim /opt/kubernetes/cfg/kube-apiserver
KUBE_APISERVER_OPTS="--logtostderr=true \
--v=4 \
--etcd-servers=https://192.168.233.91:2379,https://192.168.233.93:2379,https://192.168.233.94:2379 \
--bind-address=192.168.233.92 \ #修改
--secure-port=6443 \
--advertise-address=192.168.233.92 \ #修改
......
//在 master02 節(jié)點(diǎn)上啟動(dòng)各服務(wù)并設(shè)置開(kāi)機(jī)自啟
systemctl start kube-apiserver.service
systemctl enable kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl enable kube-controller-manager.service
systemctl start kube-scheduler.service
systemctl enable kube-scheduler.service
//查看node節(jié)點(diǎn)狀態(tài)
ln -s /opt/kubernetes/bin/* /usr/local/bin/
kubectl get nodes
kubectl get nodes -o wide #-o=wide:輸出額外信息;對(duì)于Pod,將輸出Pod所在的Node名
//此時(shí)在master02節(jié)點(diǎn)查到的node節(jié)點(diǎn)狀態(tài)僅是從etcd查詢(xún)到的信息,
而此時(shí)node節(jié)點(diǎn)實(shí)際上并未與master02節(jié)點(diǎn)建立通信連接,因此需要使用一個(gè)VIP把node節(jié)點(diǎn)與master節(jié)點(diǎn)都關(guān)聯(lián)起來(lái)
部署flannel
//在 node01 節(jié)點(diǎn)上操作
#上傳 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 目錄中
cd /opt/
docker load -i flannel.tar
mkdir -p /opt/cni/bin
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin
//在 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 -n kube-system
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-hjtc7 1/1 Running 0 7s
kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.80.11 Ready <none> 81m v1.20.11
部署負(fù)載均衡
---------- master02 節(jié)點(diǎn)部署 ----------
//從 master01 節(jié)點(diǎn)上拷貝證書(shū)文件、各master組件的配置文件和服務(wù)管理文件到 master02 節(jié)點(diǎn)
scp -r /opt/etcd/ root@20.0.0.62:/opt/
scp -r /opt/kubernetes/ root@20.0.0.62:/opt
scp -r /root/.kube root@20.0.0.62:/root
scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@20.0.0.62:/usr/lib/systemd/system/
//修改配置文件kube-apiserver中的IP
vim /opt/kubernetes/cfg/kube-apiserver
KUBE_APISERVER_OPTS="--logtostderr=true \
--v=4 \
--etcd-servers=https://192.168.233.91:2379,https://192.168.233.93:2379,https://192.168.233.94:2379 \
--bind-address=192.168.233.92 \ #修改
--secure-port=6443 \
--advertise-address=192.168.233.92 \ #修改
......
//在 master02 節(jié)點(diǎn)上啟動(dòng)各服務(wù)并設(shè)置開(kāi)機(jī)自啟
systemctl start kube-apiserver.service
systemctl enable kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl enable kube-controller-manager.service
systemctl start kube-scheduler.service
systemctl enable kube-scheduler.service
//查看node節(jié)點(diǎn)狀態(tài)
ln -s /opt/kubernetes/bin/* /usr/local/bin/
kubectl get nodes
kubectl get nodes -o wide #-o=wide:輸出額外信息;對(duì)于Pod,將輸出Pod所在的Node名
//此時(shí)在master02節(jié)點(diǎn)查到的node節(jié)點(diǎn)狀態(tài)僅是從etcd查詢(xún)到的信息,
而此時(shí)node節(jié)點(diǎn)實(shí)際上并未與master02節(jié)點(diǎn)建立通信連接,因此需要使用一個(gè)VIP把node節(jié)點(diǎn)與master節(jié)點(diǎn)都關(guān)聯(lián)起來(lái)
------------------------------ 負(fù)載均衡部署 ------------------------------
//配置load balancer集群雙機(jī)熱備負(fù)載均衡(nginx實(shí)現(xiàn)負(fù)載均衡,keepalived實(shí)現(xiàn)雙機(jī)熱備)
##### 在lb01、lb02節(jié)點(diǎn)上操作 #####
//配置nginx的官方在線(xiàn)yum源,配置本地nginx的yum源
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
EOF
yum install nginx -y
//修改nginx配置文件,配置四層反向代理負(fù)載均衡,指定k8s群集2臺(tái)master的節(jié)點(diǎn)ip和6443端口
vim /etc/nginx/nginx.conf
events {
worker_connections 1024;
}
#添加
stream {
log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
#日志記錄格式
#$remote_addr: 客戶(hù)端的 IP 地址。
#$upstream_addr: 上游服務(wù)器的地址。
#[$time_local]: 訪(fǎng)問(wèn)時(shí)間,使用本地時(shí)間。
#$status: HTTP 響應(yīng)狀態(tài)碼。
#$upstream_bytes_sent: 從上游服務(wù)器發(fā)送到客戶(hù)端的字節(jié)數(shù)。
access_log /var/log/nginx/k8s-access.log main;
upstream k8s-apiserver {
server 20.0.0.61:6443;
server 20.0.0.62:6443;
}
server {
listen 6443;
proxy_pass k8s-apiserver;
}
}
http {
......
//檢查配置文件語(yǔ)法
nginx -t
//啟動(dòng)nginx服務(wù),查看已監(jiān)聽(tīng)6443端口
systemctl start nginx
systemctl enable nginx
netstat -natp | grep nginx
//部署keepalived服務(wù)
yum install keepalived -y
//修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
# 接收郵件地址
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
# 郵件發(fā)送地址
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER #lb01節(jié)點(diǎn)的為 NGINX_MASTER,lb02節(jié)點(diǎn)的為 NGINX_BACKUP
#vrrp_strict #注釋掉
}
#添加一個(gè)周期性執(zhí)行的腳本
vrrp_script check_nginx {
script "/etc/nginx/check_nginx.sh" #指定檢查nginx存活的腳本路徑
}
vrrp_instance VI_1 {
state MASTER #lb01節(jié)點(diǎn)的為 MASTER,lb02節(jié)點(diǎn)的為 BACKUP
interface ens33 #指定網(wǎng)卡名稱(chēng) ens33
virtual_router_id 51 #指定vrid,兩個(gè)節(jié)點(diǎn)要一致
priority 100 #lb01節(jié)點(diǎn)的為 100,lb02節(jié)點(diǎn)的為 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.233.100/24 #指定 VIP
}
track_script {
check_nginx #指定vrrp_script配置的腳本
}
}
//創(chuàng)建nginx狀態(tài)檢查腳本
vim /etc/nginx/check_nginx.sh
#!/bin/bash
/usr/bin/curl -I http://localhost &>/dev/null
if [ $? -ne 0 ];then
# /etc/init.d/keepalived stop
systemctl stop keepalived
fi
chmod +x /etc/nginx/check_nginx.sh
//啟動(dòng)keepalived服務(wù)(一定要先啟動(dòng)了nginx服務(wù),再啟動(dòng)keepalived服務(wù))
systemctl start keepalived
systemctl enable keepalived
ip a #查看VIP是否生成
//修改node節(jié)點(diǎn)上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件為VIP
cd /opt/kubernetes/cfg/
vim bootstrap.kubeconfig
server: https://192.168.233.100:6443
vim kubelet.kubeconfig
server: https://192.168.233.100:6443
vim kube-proxy.kubeconfig
server: https://192.168.233.100:6443
//重啟kubelet和kube-proxy服務(wù)
systemctl restart kubelet.service
systemctl restart kube-proxy.service
//在 lb01 上查看 nginx 和 node 、 master 節(jié)點(diǎn)的連接狀態(tài)
netstat -natp | grep nginx
tcp 0 0 0.0.0.0:6443 0.0.0.0:* LISTEN 44904/nginx: master
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 44904/nginx: master
tcp 0 0 192.168.80.100:6443 192.168.80.12:46954 ESTABLISHED 44905/nginx: worker
tcp 0 0 192.168.80.14:45074 192.168.80.10:6443 ESTABLISHED 44905/nginx: worker
tcp 0 0 192.168.80.14:53308 192.168.80.20:6443 ESTABLISHED 44905/nginx: worker
tcp 0 0 192.168.80.14:53316 192.168.80.20:6443 ESTABLISHED 44905/nginx: worker
tcp 0 0 192.168.80.100:6443 192.168.80.11:48784 ESTABLISHED 44905/nginx: worker
tcp 0 0 192.168.80.14:45070 192.168.80.10:6443 ESTABLISHED 44905/nginx: worker
tcp 0 0 192.168.80.100:6443 192.168.80.11:48794 ESTABLISHED 44905/nginx: worker
tcp 0 0 192.168.80.100:6443 192.168.80.12:46968 ESTABLISHED 44905/nginx: worker
##### 在 master01 節(jié)點(diǎn)上操作 #####
//測(cè)試創(chuàng)建pod
kubectl run nginx --image=nginx
//查看Pod的狀態(tài)信息
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-dbddb74b8-nf9sk 0/1 ContainerCreating 0 33s #正在創(chuàng)建中
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-dbddb74b8-nf9sk 1/1 Running 0 80s #創(chuàng)建完成,運(yùn)行中
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
nginx-dbddb74b8-26r9l 1/1 Running 0 10m 172.17.36.2 192.168.80.15 <none>
//READY為1/1,表示這個(gè)Pod中有1個(gè)容器
//在對(duì)應(yīng)網(wǎng)段的node節(jié)點(diǎn)上操作,可以直接使用瀏覽器或者curl命令訪(fǎng)問(wèn)
curl 172.17.36.2
kubectl exec -it nginx bash
//這時(shí)在master01節(jié)點(diǎn)上查看nginx日志
kubectl logs nginx-dbddb74b8-nf9sk
?部署 Dashboard
------------------------------ 部署 Dashboard ------------------------------
//在 master01 節(jié)點(diǎn)上操作
#上傳 recommended.yaml 文件到 /opt/k8s 目錄中
cd /opt/k8s
vim recommended.yaml
#默認(rèn)Dashboard只能集群內(nèi)部訪(fǎng)問(wèn),修改Service為NodePort類(lèi)型,暴露到外部:
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30001 #添加
type: NodePort #添加
selector:
k8s-app: kubernetes-dashboard
kubectl apply -f recommended.yaml
#創(chuàng)建service account并綁定默認(rèn)cluster-admin管理員集群角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
#獲取token值
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
#使用輸出的token登錄Dashboard
https://20.0.0.63:30001
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-776250.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-776250.html
到了這里,關(guān)于k8s二進(jìn)制部署--部署高可用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!