k8s使用kube-router網絡組件並實現網絡隔離

簡介

本文章主要介紹k8s如何使用kube-router實現pod通訊,服務代理,網絡策略隔離等功能node

kube-router是一個新的k8s的網絡插件,使用lvs作服務的代理及負載均衡,使用iptables來作網絡的隔離策略。部署簡單,只須要在每一個節點部署一個daemonset便可,高性能,易維護。支持pod間通訊,以及服務的代理。nginx

環境說明

本實驗在已經安裝配置好k8s集羣基礎之上進行實驗,k8s安裝參考博客其餘文章。git

實驗架構

lab1: master 11.11.11.111
lab2: node 11.11.11.112
lab3: node 11.11.11.113
複製代碼

安裝

# 本次實驗從新建立了集羣,使用以前測試其餘網絡插件的集羣環境沒有成功
# 多是因爲環境干擾,實驗時須要注意

# 建立kube-router目錄下載相關文件
mkdir kube-router && cd kube-router
rm -f generic-kuberouter-all-features.yaml
wget https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/generic-kuberouter-all-features.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.yaml
sed -i "s;%CLUSTERCIDR%;$CLUSTERCIDR;g" generic-kuberouter-all-features.yaml
kubectl apply -f generic-kuberouter-all-features.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

# 清理
kubectl delete svc example-service example-service-nodeport
kubectl delete deploy nginx curl
複製代碼

網絡隔離策略

部署應用

# 建立 production staging 命名空間
kubectl create namespace production
kubectl create namespace staging

# 在每一個命名空間各部署一套服務
cd kube-router
wget https://raw.githubusercontent.com/mgxian/istio-test/master/service/node/v1/node-v1.yml
wget https://raw.githubusercontent.com/mgxian/istio-test/master/service/go/v1/go-v1.yml
kubectl apply -f node-v1.yml -n production
kubectl apply -f go-v1.yml -n production
kubectl apply -f node-v1.yml -n staging
kubectl apply -f go-v1.yml -n staging

# 查看狀態
kubectl get pods --all-namespaces -o wide
複製代碼

測試pod通訊

# 獲取相關POD信息
PRODUCTION_NODE_NAME=$(kubectl get pods -n production | grep Running | grep service-node | awk '{print $1}')
STAGING_NODE_NAME=$(kubectl get pods -n staging | grep Running | grep service-node | awk '{print $1}')
PRODUCTION_GO_IP=$(kubectl get pods -n production -o wide | grep Running | grep service-go | awk '{print $6}')
STAGING_GO_IP=$(kubectl get pods -n staging -o wide | grep Running | grep service-go | awk '{print $6}')
echo $PRODUCTION_NODE_NAME $PRODUCTION_GO_IP
echo $STAGING_NODE_NAME $STAGING_GO_IP


# 同namespace的pod通訊
kubectl exec -it $PRODUCTION_NODE_NAME --namespace=production -- ping -c4 $PRODUCTION_GO_IP 
kubectl exec -it $STAGING_NODE_NAME --namespace=staging -- ping -c4 $STAGING_GO_IP 

# 不一樣namespace的pod通訊
kubectl exec -it $PRODUCTION_NODE_NAME --namespace=production -- ping -c4 $STAGING_GO_IP
kubectl exec -it $STAGING_NODE_NAME --namespace=staging -- ping -c4 $PRODUCTION_GO_IP

# 結論:任何namespace的任何pod間均可以直接通訊
複製代碼

設置默認策略測試

# 設置默認策略爲拒絕全部流量
cat >default-deny.yml<<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector: {}
  policyTypes:
  - Ingress
EOF
kubectl apply -f default-deny.yml -n production
kubectl apply -f default-deny.yml -n staging

# 測試通訊
# 同namespace的pod通訊
kubectl exec -it $PRODUCTION_NODE_NAME --namespace=production -- ping -c4 $PRODUCTION_GO_IP 
kubectl exec -it $STAGING_NODE_NAME --namespace=staging -- ping -c4 $STAGING_GO_IP 

# 不一樣namespace的pod通訊
kubectl exec -it $PRODUCTION_NODE_NAME --namespace=production -- ping -c4 $STAGING_GO_IP
kubectl exec -it $STAGING_NODE_NAME --namespace=staging -- ping -c4 $PRODUCTION_GO_IP

# 結論:全部pod間都不能通訊
複製代碼

設置容許規則

# 設置 service-go 容許從 service-node 訪問
cat >service-go-allow-service-node.yml<<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: service-go-allow-service-node
spec:
  podSelector:
    matchLabels:
      app: service-go
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: service-node
EOF
kubectl apply -f service-go-allow-service-node.yml -n production
kubectl apply -f service-go-allow-service-node.yml -n staging

# 設置 service-node 容許 訪問 tcp 80 端口
cat >service-node-allow-tcp-80.yml<<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: service-node-allow-tcp-80
spec:
  podSelector:
    matchLabels:
      app: service-node
  ingress:
  - from:
    ports:
    - protocol: TCP
      port: 80
EOF
kubectl apply -f service-node-allow-tcp-80.yml -n production
kubectl apply -f service-node-allow-tcp-80.yml -n staging

# 測試通訊
# 同namespace的pod通訊
kubectl exec -it $PRODUCTION_NODE_NAME --namespace=production -- ping -c4 $PRODUCTION_GO_IP 
kubectl exec -it $STAGING_NODE_NAME --namespace=staging -- ping -c4 $STAGING_GO_IP 

# 不一樣namespace的pod通訊
kubectl exec -it $PRODUCTION_NODE_NAME --namespace=production -- ping -c4 $STAGING_GO_IP
kubectl exec -it $STAGING_NODE_NAME --namespace=staging -- ping -c4 $PRODUCTION_GO_IP

# 經過service測試
PRODUCTION_GO_SVC=$(kubectl get svc -n production | grep service-go | awk '{print $3}')
STAGING_GO_SVC=$(kubectl get svc -n staging | grep service-go | awk '{print $3}')
echo $PRODUCTION_GO_SVC $STAGING_GO_SVC
curl $PRODUCTION_GO_SVC
curl $STAGING_GO_SVC

# 結論:同一namespace的pod間能夠通訊,不一樣namespace的pod間不能夠通訊,只容許配置了網絡規則的pod間通訊
# 經過 service 也沒法繞過網絡隔離策略
複製代碼

清理

# 刪除 namespace 自動刪除相關資源
kubectl delete ns production
kubectl delete ns staging
複製代碼

參考文檔

  • https://github.com/cloudnativelabs/kube-router/blob/master/docs/generic.md
  • https://kubernetes.io/docs/concepts/services-networking/network-policies/
  • https://cloudnativelabs.github.io/post/2017-05-1-kube-network-policies/
相關文章
相關標籤/搜索