在 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
使用 SwitchHosts 来做域名映射:
等待证书生成后,就可以通过 keycloak.todoit.tech 访问 keycloak 了。
kubectl get certificate -w -n keycloak
# NAME READY SECRET AGE
# keycloak-letsencrypt-tls True keycloak-letsencrypt-tls 18s
从 keycloak.yaml 清单文件可知,keycloak 的管理员账号密码是 admin/admin。
参考