keycloak~使用JDBC_PING實現(xiàn)k8s里的高可用
對于kc高可用方案有多種,像TCPPING,JDBC_PING,KUBE_PING,DNS_PING等,不過目前我使用JDBC_PING實驗成功了,它會把集群中節(jié)點信息存儲到數(shù)據(jù)表里,然后我們在k8s里,由于我們?yōu)镻ING開放的是clusterIP的端口7600,所以需要配置podIP,這樣,你的鏈路才是通的。
集群截圖

k8s三個IP地址
Kubernetes集群里有三種IP地址,分別如下:
- Node IP:Node節(jié)點的IP地址,即物理網(wǎng)卡的IP地址。
- Pod IP:Pod的IP地址,即docker容器的IP地址,此為虛擬IP地址。
- Cluster IP:Service的IP地址,此為虛擬IP地址。
Cluster IP
Cluster IP是一個虛擬的IP,但更像是一個偽造的IP網(wǎng)絡(luò),原因有以下幾點
- Cluster IP僅僅作用于Kubernetes Service這個對象,并由Kubernetes管理和分配P地址
- Cluster IP無法被ping,他沒有一個“實體網(wǎng)絡(luò)對象”來響應(yīng)
- Cluster IP只能結(jié)合Service Port組成一個具體的通信端口,單獨的Cluster IP不具備通信的基礎(chǔ),并且他們屬于Kubernetes集群這樣一個封閉的空間。
- 在不同Service下的pod節(jié)點在集群間相互訪問可以通過Cluster IP

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

相關(guān)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地址
我們后期還會繼續(xù)對dns_ping進行調(diào)研。
浙公網(wǎng)安備 33010602011771號