1. 程式人生 > 實用技巧 >Java 獲取時間日期

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代理流程圖解