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进行调研。

posted @   张占岭  阅读(910)  评论(1编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
历史上的今天:
2019-08-28 设置Redis的LRU策略
2018-08-28 我的那些年(11)~去一家创业公司做架构师
2017-08-28 DotNetCore跨平台~关于appsettings.json里各种配置项的读取
点击右上角即可分享
微信分享提示