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

本文轉自掘金-k8s使用kube-router構建高可用可擴展ingress
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章