Hướng dẫn cài đặt Keycloak trên K8s cung cấp dịch vụ SSO

Hướng dẫn cài đặt Keycloak trên K8s cung cấp dịch vụ SSO

Keycloak là một phần mềm nguồn mở cung cấp việc quản lý truy cập và phân quyền.

Trang chủ https://www.keycloak.org

Các giao thức quản lý truy cập, phân quyền đang hỗ trợ bao gồm: OpenID Connect, OAuth 2.0 và SAML.

Trong bài viết này sẽ hướng dẫn cài đặt Keycloak với Data Base là Postgres

Cài đặt theo phương thức sử dụng Operator.

1. Cài Keycloak Operator

Tạo namespace và set context

kubectl create namespace keycloak
kubectl config set-context --current --namespace keycloak

kubectl apply -f https://raw.githubusercontent.com/keycloak/keycloak-k8s-resources/25.0.2/kubernetes/keycloaks.k8s.keycloak.org-v1.yml

kubectl apply -f https://raw.githubusercontent.com/keycloak/keycloak-k8s-resources/25.0.2/kubernetes/keycloakrealmimports.k8s.keycloak.org-v1.yml

kubectl apply -f https://raw.githubusercontent.com/keycloak/keycloak-k8s-resources/25.0.2/kubernetes/kubernetes.yml

Tạo service mapping sang DB có sẵn

Ta tạo services có tên postgresdb_svc mapping sang DB ở name space khác

(Có thể bỏ qua bước mapping này để gọi trực tiếp sang DB ở name space khác)

cat mappingdb.yaml
kind: Service
apiVersion: v1
metadata:
  name: postgresDB
  namespace: playground
spec:
  type: ExternalName
  externalName: awx-demo-postgres-15.awx.svc.cluster.local
  ports:
  - port: 5432
kubectl apply -f  mappingdb.yaml

Tạo secret kết nối sang DB

kubectl create secret generic keycloak-db-secret –from-literal=username=[your_database_username] –from-literal=password=[your_database_password]

Ở đây ta đặt user: keycloak và password: keycloak_DBpass

Lưu ý: keycloak user cần có quyền ở database public và full quyền ở database keycloak

kubectl create secret generic keycloak-db-secret --from-literal=username=keycloak --from-literal=password=keycloak_DBpass

Tạo custom resource keycloak

vi example-kc.yaml

Thiết lập các thông tin DB: user, pass, host

Thông tin host name và port listen

Disable operator tạo ingress để tự thiết lập thủ công

apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
  annotations:    
  name: uptime-kc
  namespace: keycloak
spec:
  db:
    database: keycloak
    host: awx-demo-postgres-15.awx.svc.cluster.local
    passwordSecret:
      key: password
      name: keycloak-db-secret
    usernameSecret:
      key: username
      name: keycloak-db-secret
    vendor: postgres
  hostname:
    hostname: sso.uptime59.com
    strict: false
    strictBackchannel: false
  http:
    httpEnabled: true
    httpPort: 8080
    httpsPort: 8443
    tlsSecret: example-tls-secret
  ingress:
    enabled: false
  instances: 1
  proxy:
    headers: xforwarded

Apply vào k8s

kubectl apply -f example-kc.yaml

Kiểm tra tình trạng sau thiết lập

kubectl get keycloaks/uptime-kc-kc -o go-template='{{range .status.conditions}}CONDITION: {{.type}}{{"\n"}} STATUS: {{.status}}{{"\n"}} MESSAGE: {{.message}}{{"\n"}}{{end}}'
kubectl get keycloaks
kubectl describe keycloaks uptime59-kc

Lấy các thông tin user/ pass để vào trang quản trị

kubectl get secret uptime-kc-initial-admin -o jsonpath='{.data.username}' | base64 --decode
--> admin
kubectl get secret uptime-kc-initial-admin -o jsonpath='{.data.password}' | base64 --decode	
--> 8200207a5f3a46c889a1ff0956da4db3

Cấu hình Ingress

Tạo configmap

Config map là proxy-set-headers để truyền giá trị proxy headers cho nginx ingress

vi proxy-set-headers.yaml

apiVersion: v1
data:
  url: sso.uptime59.com
kind: ConfigMap
metadata:
  annotations:
    kubernetes.io/description: proxy-set-headers
  name: proxy-set-headers
  namespace: keycloak  
k apply -f  proxy-set-headers.yaml
k get cm proxy-set-headers -o yaml

Tạo ingress

vi uptime-kc-ingress.yaml

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: uptime-kc-ingress
  namespace: keycloak
  labels:
    app: keycloak
  annotations:
    nginx.ingress.kubernetes.io/auth-proxy-set-headers: proxy-set-headers
    nginx.ingress.kubernetes.io/cors-allow-headers: X-Forwarded-For
    nginx.ingress.kubernetes.io/proxy-connect-timeout: '30'
    nginx.ingress.kubernetes.io/proxy-read-timeout: '1800'
    nginx.ingress.kubernetes.io/proxy-send-timeout: '1800'
spec:
  ingressClassName: nginx
  rules:
    - host: sso.uptime59.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: uptime-kc-service
                port:
                  number: 8080

k apply -f uptime-kc-ingress.yaml

k get ing uptime-kc-ingress -o yaml

Thiết lập file host để trỏ domain đến IP của LB và mở trình duyệt để kiểm tra

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply