Java 獲取時間日期
一.pod存在的意義
kubernetes中一個應用服務會有一個或多個示例(Pod,PodK可以通過rs進行多副本建立),每個例項的ip地址由網路外掛動態隨機分配(pod重啟ip地址會改變)。
為遮蔽這些後端例項的動態變化和對多例項的負載均衡,引入了Service這個資源物件
- 防止pod失聯,準備找到提供同一個服務的pod,即服務發現
- 定義一組pod的訪問策略(負載均衡)
二.Pod與Service的關係
- Service通過標籤關聯一組pod
- Service使用iptables或者ipvs為一組pod提供負載均衡的能力
三.Service的定義與建立
建立service: kubectl apply-f service.yaml 檢視service: kubectl get service
apiVersion: v1 kind: Service metadata: name: web-nginx # service的name namespace: web # 所屬哪個名稱空間,一般和pod放在一個同一個名稱空間下 spec: ports: - port: 8080 # service埠 protocol: TCP # 協議 targetPort: 80 # 容器埠 selector: # 標籤選擇器 app: nginx # 指定關聯Pod的標籤 type: ClusterIP # 服務型別
# selector:指定關聯的pod標籤
標籤獲取方式:
通過yaml檔案獲取
kubectl get svc --show-labels
四.Service三種常用型別
1.ClusterIP
預設型別,分配一個穩定的ip地址,即VIP。只能在叢集內部訪問
spec: ports: - port: 8080 # service埠 protocol: TCP # 協議 targetPort: 80 # 容器埠 selector: # 標籤選擇器 app: nginx # 指定關聯Pod的標籤 type: ClusterIP # 服務型別
#########################################################
[root@k8s-master yaml]# kubectl get svc -o wide -n web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
web-nginx ClusterIP 10.107.185.146 <none> 8080/TCP 13m app=nginx
#此service只能通過10.107.185.146:8080來訪問
2.NodePort
在每個節點啟用一個埠來暴露服務,可以在叢集外部訪問。也會分配一個穩定的叢集ip地址 外部訪問:任意nodeip:NodePort 埠範圍:30000-32767
apiVersion: v1 kind: Service metadata: name: web-nginx # service的name namespace: web # 所屬哪個名稱空間,一般和pod放在一個同一個名稱空間下 spec: ports: - port: 8080 # service埠 protocol: TCP # 協議 targetPort: 80 # 容器埠 nodePort: 30008 # NodePort的埠 selector: # 標籤選擇器 app: nginx # 指定關聯Pod的標籤 type: NodePort # 服務型別
###########################################################################################
[root@k8s-master yaml]# kubectl get svc -n web -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
web-nginx NodePort 10.107.185.146 <none> 8080:30008/TCP 25m app=nginx
叢集外部可以通過nodeip:30008來訪問
[root@k8s-master yaml]# curl -I http://192.168.11.134:30008
HTTP/1.1 200 OK
3.LoadBalancer
LoadBalancer:與NodePort類似,在每個節點上啟用一個埠來暴
露服務。除此之外,Kubernetes會請求底層雲平臺(例如阿里雲、騰
訊雲、AWS等)上的負載均衡器,將每個Node
([NodeIP]:[NodePort])作為後端新增進去。
五.Service代理模式之iptables實現
叢集外部訪問service的30008埠,iptables是怎麼實現的
以叢集中的一個node分析 1.入口規則匹配 -A KUBE-NODEPORTS -p tcp -m comment --comment "web/web-nginx" -m tcp --dport 30008 -j KUBE-SVC-DGUGPUBGLFKE4V6A # 進入30008的資料包被重定向到KUBE-SVC-DGUGPUBGLFKE4V6A這個鏈
2. 實現負載均衡器(一組規則,有幾個pod就建立幾條)
A KUBE-SVC-DGUGPUBGLFKE4V6A -m comment --comment "web/web-nginx" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-4Q7O3SKSDAWOI3U5
-A KUBE-SVC-DGUGPUBGLFKE4V6A -m comment --comment "web/web-nginx" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-L4IK2ED63YY2WA7E
-A KUBE-SVC-DGUGPUBGLFKE4V6A -m comment --comment "web/web-nginx" -j KUBE-SEP-Q42CSEQQKNK3LVBU
###--probability順序匹配,有33%的概率進入到KUBE-SEP-4Q7O3SKSDAWOI3U5鏈,有50%的概率進入到KUBE-SEP-L4IK2ED63YY2WA7E鏈,100%的概率進入到KUBE-SEP-Q42CSEQQKNK3LVBU鏈,實現了類似輪訓的機制 每個鏈對應一個pod
3.使用DNAT轉發到具體的pod上
-A KUBE-SEP-4Q7O3SKSDAWOI3U5 -p tcp -m comment --comment "web/web-nginx" -m tcp -j DNAT --to-destination 10.244.169.186:80
-A KUBE-SEP-L4IK2ED63YY2WA7E -p tcp -m comment --comment "web/web-nginx" -m tcp -j DNAT --to-destination 10.244.36.95:80
-A KUBE-SEP-Q42CSEQQKNK3LVBU -p tcp -m comment --comment "web/web-nginx" -m tcp -j DNAT --to-destination 10.244.36.99:80
4.由具體的pod將資料原路返回客戶端
叢集內部通過ClusterIP的方式8080請求pod資源,iptables怎麼實現的
1.入口匹配 -A KUBE-SERVICES -d 10.100.184.209/32 -p tcp -m comment --comment "web/web-nginx cluster IP" -m tcp --dport 8080 -j KUBE-SVC-DGUGPUBGLFKE4V6A #轉發到KUBE-SVC-DGUGPUBGLFKE4V6A鏈 2.負載均衡實現和nodeport一樣 -A KUBE-SVC-DGUGPUBGLFKE4V6A -m comment --comment "web/web-nginx" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-4Q7O3SKSDAWOI3U5 -A KUBE-SVC-DGUGPUBGLFKE4V6A -m comment --comment "web/web-nginx" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-L4IK2ED63YY2WA7E -A KUBE-SVC-DGUGPUBGLFKE4V6A -m comment --comment "web/web-nginx" -j KUBE-SEP-Q42CSEQQKNK3LVBU 3. DNAT轉發到對應pod上 -A KUBE-SEP-4Q7O3SKSDAWOI3U5 -p tcp -m comment --comment "web/web-nginx" -m tcp -j DNAT --to-destination 10.244.169.186:80 -A KUBE-SEP-L4IK2ED63YY2WA7E -p tcp -m comment --comment "web/web-nginx" -m tcp -j DNAT --to-destination 10.244.36.95:80 -A KUBE-SEP-Q42CSEQQKNK3LVBU -p tcp -m comment --comment "web/web-nginx" -m tcp -j DNAT --to-destination 10.244.36.99:80 4.由pod將資源原路返回給客戶端
六.Service代理模式之ipvs實現
kubeadm方式修改ipvs模式: [root@k8s-master yaml]# kubectl get configmap -n kube-system NAME DATA AGE calico-config 4 12d coredns 1 12d extension-apiserver-authentication 6 12d kube-proxy 2 12d kubeadm-config 2 12d kubelet-config-1.19 1 12d kubectl edit configmap kube-proxy -n kube-system ... mode: “ipvs“ ... #### 1.kube-proxy配置檔案是以configmap方式儲存 2.如果讓所有節點生效,需要重建所有節點的kube-proxy pod
二進位制方式修改ipvs模式: # vi kube-proxy-config.yml mode: ipvs ipvs: scheduler: "rr“ # systemctl restart kube-proxy 注:參考不同資料,檔名可能不同。
ipvs修改已生效
[root@k8s-master yaml]# kubectl logs kube-proxy-ww79n Error from server (NotFound): pods "kube-proxy-ww79n" not found [root@k8s-master yaml]# kubectl logs kube-proxy-ww79n -n kube-system I1130 09:46:32.359435 1 node.go:136] Successfully retrieved node IP: 192.168.11.134 I1130 09:46:32.359667 1 server_others.go:111] kube-proxy node IP is an IPv4 address (192.168.11.134), assume IPv4 operation I1130 09:46:32.435474 1 server_others.go:259] Using ipvs Proxier.
節點上檢視ipvs規則,需要安裝:yum install ipvsadm -y
[root@k8s-node1 ~]# ipvsadm -L IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP k8s-node1:30008 rr -> 10.244.36.95:http Masq 1 0 0 -> 10.244.36.99:http Masq 1 0 0 -> 10.244.169.186:http Masq 1 0 0 TCP k8s-node1:pago-services1 rr -> 10.244.36.109:pcsync-https Masq 1 0 0 TCP k8s-node1:30008 rr -> 10.244.36.95:http Masq 1 1 0 -> 10.244.36.99:http Masq 1 1 0 -> 10.244.169.186:http Masq 1 1 0 .............
service代理流程圖解