一 Pod和SVC網路 1.1 實踐準備及原理 Docker實現了不同的網路模式,Kubernetes也以一種不同的方式來解決這些網路模式的挑戰。本完整實驗深入剖析Kubernetes在網路層是如何實現及工作的。 實驗節點架構: 如上圖所示,Kubernetes的網路模型要求每個Node上的容器都可 ...
一 Pod和SVC網路
1.1 實踐準備及原理
Docker實現了不同的網路模式,Kubernetes也以一種不同的方式來解決這些網路模式的挑戰。本完整實驗深入剖析Kubernetes在網路層是如何實現及工作的。 實驗節點架構:![clipboard clipboard](https://img2020.cnblogs.com/blog/680719/202003/680719-20200323152513556-1103462944.png)
![clipboard clipboard](https://img2020.cnblogs.com/blog/680719/202003/680719-20200323152513998-444471118.png)
二 Pod和SVC實驗
2.1 檢查環境
[root@k8smaster02 ~]# ifconfig #node1上檢查網路地址![clipboard clipboard](https://img2020.cnblogs.com/blog/680719/202003/680719-20200323152514389-373982474.png)
2.2 創建RC
[root@k8smaster01 study]# vi frontend-controller.yaml1 apiVersion: v1 2 kind: ReplicationController 3 metadata: 4 name: frontend 5 labels: 6 name: frontend 7 spec: 8 replicas: 1 9 selector: 10 name: frontend 11 template: 12 metadata: 13 labels: 14 name: frontend 15 spec: 16 containers: 17 - name: php-redis 18 image: kubeguide/guestbook-php-frontend 19 env: 20 - name: GET_HOSTS_FROM 21 value: env 22 ports: 23 - containerPort: 80 24 hostPort: 80[root@k8smaster01 study]# kubectl create -f frontend-controller.yaml
2.3 再次檢查網路
[root@k8smaster01 study]# kubectl get pods -o wide![clipboard clipboard](https://img2020.cnblogs.com/blog/680719/202003/680719-20200323152514910-2012271044.png)
![clipboard clipboard](https://img2020.cnblogs.com/blog/680719/202003/680719-20200323152515804-463349081.png)
2.4 網路模型釋義
首先,一個Pod內的所有容器都需要共用同一個IP地址,這就意味著一定要使用網路的容器映射模式。然而,為什麼不能只啟動第1個Pod中的容器,而將第2個Pod中的容器關聯到第1個容器呢? Kubernetes主要基於如下兩個覺得考慮: 首先,如果在Pod內有多個容器的話,則可能很難連接這些容器; 其次,後面的容器還要依賴第1個被關聯的容器,如果第2個容器關聯到第1個容器,且第1個容器異常的話,第2個容器也將異常。 啟動一個基礎容器,然後將Pod內的所有容器都連接到基礎容器相對容易。因為只需要為基礎的這個Google_containers/pause容器執行埠映射規則,這也簡化了埠映射的過程。所以啟動Pod後的網路模型類似下圖:![clipboard clipboard](https://img2020.cnblogs.com/blog/680719/202003/680719-20200323152516161-498417973.png)
2.5 發佈SVC
Service允許我們在多個Pod之間抽象一些服務,而且服務可以通過提供在同一個Service的多個Pod之間的負載均衡機制來支持水平擴展。 [root@k8smaster01 study]# vi frontend-service.yaml1 apiVersion: v1 2 kind: Service 3 metadata: 4 name: frontend 5 labels: 6 name: frontend 7 spec: 8 ports: 9 - port: 80 10 selector: 11 name: frontend[root@k8smaster01 study]# kubectl create -f frontend-service.yaml [root@k8smaster01 study]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend ClusterIP 10.254.176.53 <none> 80/TCP 45s 釋義:如上可知Kubernetes集群已經為這個服務分配了一個虛擬IP地址10.254.176.53,這個IP地址是在Kubernetes的Portal Network中分配的。 而這個Portal Network的地址範圍是我們在Kubmaster上啟動API服務進程時,使用--service-cluster-ip-range=xx命令行參數指定: [root@k8smaster01 study]# cat /etc/systemd/system/kube-apiserver.service | grep 10.254 --service-cluster-ip-range=10.254.0.0/16 \ 註意:這個IP段可以是任何段,只要不和docker0或者物理網路的子網衝突即可。選擇任意其他網段的原因是這個網段將不會在物理網路和docker0網路上進行路由。這個Portal Network針對每一個Node都有局部的特殊性,實際上它存在的意義是讓容器的流量都指向預設網關(也就是docker0網橋)。
2.6 確認驗證
當所有的Pod都運行起來,Service將會把客戶端請求負載分發到包含“name=frontend”標簽的所有Pod上。![clipboard clipboard](https://img2020.cnblogs.com/blog/680719/202003/680719-20200323152516507-1783694357.png)