在 k8s 集群上部署 Keycloak

Keycloak 是一种开源身份和访问管理工具,只需很少的代码甚至无需代码即可轻松保护应用程序和服务的安全。

部署 postgresql

添加 helm 仓库

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

创建 keycloak 命名空间

kubectl create ns keycloak

安装 postgresql

helm install keycloak-db bitnami/postgresql -n keycloak --set global.storageClass=nfs-client

nfs-client 的来源请参考 使用 NFS 作为容器存储插件

部署 keycloak

编写 keycloak.yaml 清单文件如下:

# keycloak/keycloak.yaml
apiVersion: v1
kind: Service
metadata:
  name: keycloak
  labels:
    app: keycloak
spec:
  ports:
    - name: http
      port: 80
      targetPort: 8080
  selector:
    app: keycloak
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: keycloak
  labels:
    app: keycloak
spec:
  replicas: 1
  selector:
    matchLabels:
      app: keycloak
  template:
    metadata:
      labels:
        app: keycloak
    spec:
      containers:
        - name: keycloak
          image: quay.io/keycloak/keycloak:21.1.2
          args: ['start', '--cache-stack=kubernetes']
          env:
            - name: KEYCLOAK_ADMIN
              value: 'admin'
            - name: KEYCLOAK_ADMIN_PASSWORD
              value: 'admin'
            - name: KC_HEALTH_ENABLED
              value: 'true'
            - name: KC_METRICS_ENABLED
              value: 'true'
            - name: KC_HOSTNAME
              value: keycloak.todoit.tech
            - name: KC_PROXY
              value: 'edge'
            - name: KC_DB
              value: postgres
            - name: KC_DB_URL
              # keycloak-db-postgresql 这个 service 由 helm 安装 postgresql 时创建
              value: 'jdbc:postgresql://keycloak-db-postgresql/postgres'
            - name: KC_DB_USERNAME
              value: 'postgres'
            - name: KC_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  # keycloak-db-postgresql 这个 secret 由 helm 安装 postgresql 时创建
                  name: keycloak-db-postgresql
                  key: postgres-password
            - name: jgroups.dns.query
              value: keycloak
          ports:
            - name: jgroups
              containerPort: 7600
            - name: http
              containerPort: 8080
          readinessProbe:
            httpGet:
              scheme: HTTP
              path: /health/ready
              port: 8080

核验后部署

kubectl apply -f keycloak.yaml

配置域名和证书

kubectl apply -f ingress.yaml
# keycloak/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: keycloak-ingress
  namespace: keycloak
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-dns01 # 配置自动生成 https 证书
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: 'true'
    nginx.ingress.kubernetes.io/proxy-body-size: '0'
spec:
  tls:
    - hosts:
        - 'keycloak.todoit.tech'
      secretName: keycloak-letsencrypt-tls
  rules:
    - host: keycloak.todoit.tech
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: keycloak
                port:
                  number: 8080

使用 SwitchHostsopen in new window 来做域名映射:

README-2023-07-04-18-37-42

等待证书生成后,就可以通过 keycloak.todoit.techopen in new window 访问 keycloak 了。

kubectl get certificate -w -n keycloak

# NAME                       READY   SECRET                     AGE
# keycloak-letsencrypt-tls   True    keycloak-letsencrypt-tls   18s

从 keycloak.yaml 清单文件可知,keycloak 的管理员账号密码是 admin/admin。

README-2023-08-03-16-37-50


参考

上次更新: