k8s使用kube-router構建高可用可擴充套件ingress
簡介
使用kube-router
實現k8s叢集的ingress
功能,高可用易擴充套件
環境說明
本實驗在已經安裝配置好k8s叢集基礎之上進行實驗,k8s安裝參考部落格其他文章。lab4作為一個路由器,轉發lab5的請求
實驗架構
lab1: master 11.11.11.111 lab2: node 11.11.11.112 lab3: node 11.11.11.113 lab4: router 11.11.11.114 lab5: client 11.11.11.115 複製程式碼
安裝
# 本次實驗重新建立了叢集,使用之前測試其他網路外掛的叢集環境沒有成功 # 可能是由於環境干擾,實驗時需要注意 # 建立kube-router目錄下載相關檔案 mkdir kube-router && cd kube-router rm -f generic-kuberouter-all-features-dsr.yaml wget https://raw.githubusercontent.com/mgxian/kube-router/master/generic-kuberouter-all-features-dsr.yaml # 啟用pod網路通訊,網路隔離策略,服務代理所有功能 # CLUSTERCIDR kube-controller-manager 啟動引數 --cluster-cidr 的值 # APISERVER kube-apiserver 啟動引數 --advertise-address 值 CLUSTERCIDR='10.244.0.0/16' APISERVER='https://11.11.11.111:6443' sed -i "s;%APISERVER%;$APISERVER;g" generic-kuberouter-all-features-dsr.yaml sed -i "s;%CLUSTERCIDR%;$CLUSTERCIDR;g" generic-kuberouter-all-features-dsr.yaml # 修改配置 containers: - name: kube-router image: cloudnativelabs/kube-router imagePullPolicy: Always args: ... - --peer-router-ips=11.11.11.114 - --peer-router-asns=64513 - --cluster-asn=64512 - --advertise-external-ip=true ... # 部署 kubectl apply -f generic-kuberouter-all-features-dsr.yaml # 刪除kube-proxy kubectl -n kube-system delete ds kube-proxy # 在每個節點上執行 # 如果是二進位制安裝使用如下命令 systemctl stop kube-proxy # 在每個節點上執行 # 清理kube-proxy留下的規則 docker run --privileged --net=host registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy-amd64:v1.10.2 kube-proxy --cleanup # 檢視 kubectl get pods -n kube-system kubectl get svc -n kube-system 複製程式碼
測試
# 測試之前請先安裝配置好kube-dns或者coredns # 啟動用於測試的deployment kubectl run nginx --replicas=2 --image=nginx:alpine --port=80 kubectl expose deployment nginx --type=NodePort --name=example-service-nodeport kubectl expose deployment nginx --name=example-service # 檢視 kubectl get pods -o wide kubectl get svc -o wide # dns及訪問測試 kubectl run curl --image=radial/busyboxplus:curl -i --tty nslookup kubernetes nslookup example-service curl example-service 複製程式碼
在lab4配置quagga
# 安裝 yum install -y quagga # 配置 cat >/etc/quagga/bgpd.conf<<EOF ! -*- bgp -*- ! ! BGPd sample configuratin file ! ! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $ ! hostname lab4 password password ! router bgp 64513 bgp router-id 11.11.11.114 maximum-paths 4 neighbor 11.11.11.111 remote-as 64512 neighbor 11.11.11.112 remote-as 64512 neighbor 11.11.11.113 remote-as 64512 log stdout EOF # 啟動 systemctl start bgpd systemctl status bgpd systemctl enable bgpd # 檢視路由資訊 ip route 複製程式碼
在lab4測試
# 在lab1上修改 example-service 配置 external ip kubectl edit svc example-service ... spec: clusterIP: 10.111.34.147 externalIPs: - 11.11.111.111 ... # 在lab1上檢視svc資訊 # 可以看到 example-service 有了 external ip kubectl get svc # 檢視lab4路由 # 可以看到有 11.11.111.111 相關的路由 ip route # 在lab4上訪問測試 curl 11.11.111.111 複製程式碼
在lab5測試
# 在lab5新增路由 ip route add 11.11.111.111 via 11.11.11.114 ip route # 在lab5訪問測試 curl 11.11.111.111 # 在lab1檢視ipvs ipvsadm -L -n 複製程式碼
使用DSR
# DSR實驗沒有成功,實驗環境是vagrant配合virtualbox # 在lab1設定 example-service 使用 DSR 模式 # 服務的響應直接傳送到客戶端不經過lvs中轉 kubectl annotate svc example-service "kube-router.io/service.dsr=tunnel" # 在lab1檢視ipvs # 可以看到 Tunnel 轉發型別 ipvsadm -L -n # 在lab5訪問測試 curl 11.11.111.111 # 在叢集中的節點抓包分析 tcpdump -i kube-bridge proto 4 複製程式碼
清理
# 清理 kubectl delete svc example-service example-service-nodeport kubectl delete deploy nginx curl 複製程式碼
參考文件
- https://cloudnativelabs.github.io/post/2017-11-01-kube-high-available-ingress/
- https://github.com/cloudnativelabs/kube-router/blob/master/docs/generic.md
本文轉自掘金-ofollow,noindex">k8s使用kube-router構建高可用可擴充套件ingress