1. 程式人生 > 其它 >keycloak~使用JDBC_PING實現k8s裡的高可用

keycloak~使用JDBC_PING實現k8s裡的高可用

對於kc高可用方案有多種,像TCPPING,JDBC_PING,KUBE_PING,DNS_PING等,不過目前我使用JDBC_PING實驗成功了,它會把叢集中節點資訊儲存到資料表裡,然後我們在k8s裡,由於我們為PING開放的是clusterIP的埠7600,所以需要配置podIP,這樣,你的鏈路才是通的。

叢集截圖

k8s三個IP地址

Kubernetes叢集裡有三種IP地址,分別如下:

  • Node IP:Node節點的IP地址,即物理網絡卡的IP地址。
  • Pod IP:Pod的IP地址,即docker容器的IP地址,此為虛擬IP地址。
  • Cluster IP:Service的IP地址,此為虛擬IP地址。

Cluster IP

Cluster IP是一個虛擬的IP,但更像是一個偽造的IP網路,原因有以下幾點

  • Cluster IP僅僅作用於Kubernetes Service這個物件,並由Kubernetes管理和分配P地址
  • Cluster IP無法被ping,他沒有一個“實體網路物件”來響應
  • Cluster IP只能結合Service Port組成一個具體的通訊埠,單獨的Cluster IP不具備通訊的基礎,並且他們屬於Kubernetes叢集這樣一個封閉的空間。
  • 在不同Service下的pod節點在叢集間相互訪問可以通過Cluster IP

Pod IP

一個service可以被部署成多個pod,為了支援更高的負載,這樣做很有必要,每個pod有自己的IP地址(容器的IP),可以通過 kubectl describe pod podName -n=namespace來獲取它的資訊

相關k8s配置(非helm方式)

---
apiVersion: v1
kind: Service
metadata:
  name: keycloak
  namespace: cas
spec:
  selector:
    app: keycloak
  type: NodePort
  publishNotReadyAddresses: true
  ports:
    - name: http
      port: 8080 #clusterIP埠
      protocol: TCP
      nodePort: 32080 #開放宿主機埠
    - name: ping
      port: 7600
      targetPort: 7600
---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: keycloak-deployment
  namespace: cas
spec:
  replicas: 2
  selector:
    matchLabels:
      app: keycloak
  template:
    metadata:
      labels:
        app: keycloak
    spec:
      hostAliases: #容器裡host配置
        - ip: "192.*.*.*"
          hostnames: ["ailiyun"]
      containers:
        - name: keycloak-controller
          image: {{IMAGE_REPOSITORY}}/{{REPOSITORY_NAMESPACE}}/keycloak/phone:{{IMAGE_TAG}}
          ports:
            - containerPort: 8080
              protocol: TCP
            - containerPort: 7600
              protocol: TCP
          env:
            - name: KEYCLOAK_USER
              value: admin
            - name: KEYCLOAK_PASSWORD
              value: admin
    
            - name: JGROUPS_DISCOVERY_PROTOCOL
              value: JDBC_PING
            - name: JGROUPS_DISCOVERY_EXTERNAL_IP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.podIP #使用pod容器的ip地址

我們後期還會繼續對dns_ping進行調研。

作者:倉儲大叔,張佔嶺,
榮譽:微軟MVP
QQ:853066980

支付寶掃一掃,為大叔打賞!