Install SSO

مستند نصب SSO با Keycloak

این مستند مراحل ایجاد و استقرار یک سرویس Single Sign-On (SSO) با استفاده از Keycloak ورژن 23 را توضیح می‌دهد. مراحل شامل ساخت Docker Image، بیلد و پوش به Docker Registry، و دیپلوی روی Kubernetes است.


مراحل

1. ساخت Docker Image

برای ایجاد Docker Image، فایل Dockerfile زیر استفاده می‌شود:

FROM quay.io/keycloak/keycloak:23.0.3 as builder

# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true

# Configure a database vendor
ENV KC_DB=postgres

WORKDIR /opt/keycloak
# for demonstration purposes only, please make sure to use proper certificates in production instead
RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore

ADD --chown=keycloak:keycloak ./com.mavaratech.login-natcode-jar-with-dependencies.jar /opt/keycloak/providers/com.mavaratech.login-natcode-jar-with-dependencies.jar

RUN /opt/keycloak/bin/kc.sh build

FROM quay.io/keycloak/keycloak:23.0.3

COPY --from=builder /opt/keycloak/ /opt/keycloak/

# change these values to point to a running postgres instance
ENV KC_DB=postgres
#ENV KC_DB_URL=<DBURL>
#ENV KC_DB_USERNAME=<DBUSERNAME>
#ENV KC_DB_PASSWORD=<DBPASSWORD>
ENV KC_HOSTNAME=localhost
ENV KC_HOSTNAME_STRICT_HTTPS=false
ENV TZ=Asia/Tehran
ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start", "--debug", "--spi-theme-static-max-age=-1","--spi-theme-cache-themes=false", "--spi-theme-cache-templates=false"]

 

در این فایل، پلاگین جاوا کامپایل شده به دایرکتوری /opt/keycloak/providers/ اضافه شده است.

دستور بیلد:

docker build -t keycloak-custom:23 .

توضیح: این دستور Docker Image را با نام keycloak-custom و نسخه 23 از محتوای تعریف‌شده در Dockerfile می‌سازد.


2. پوش Docker Image به Docker Registry

Docker Image ساخته‌شده را به رجیستری Docker روی سرور 192.168.30.26:5000 پوش می‌کنیم:

دستورات:

docker tag keycloak-custom:23 192.168.30.26:5000/keycloak-custom:23

توضیح: این دستور یک تگ جدید برای Docker Image ساخته‌شده ایجاد می‌کند تا برای پوش کردن به رجیستری آماده شود.

docker push 192.168.30.26:5000/keycloak-custom:23

توضیح: این دستور Docker Image را به رجیستری مشخص‌شده (192.168.30.26:5000) ارسال می‌کند.

 


3. دیپلوی روی Kubernetes

برای استقرار Keycloak، از فایل keycloak-deploy.yaml زیر استفاده می‌شود:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: keycloak-deployment
  namespace: nioc
  labels:
    app: keycloak
spec:
  replicas: 1
  selector:
    matchLabels:
      app: keycloak
  template:
    metadata:
      labels:
        app: keycloak
    spec:
      containers:
        - name: keycloak
          image: image
          volumeMounts:
            - mountPath: /opt/keycloak/themes
              name: files-vol
              subPath: keycloak/themes
          env:
            - name: KC_DB_URL
              valueFrom:
                configMapKeyRef:
                  name: integration-configs
                  key: keycloak-db-url
            - name: KC_DB_USERNAME
              valueFrom:
                configMapKeyRef:
                  name: integration-configs
                  key: keycloak-db-username
            - name: KC_DB_PASSWORD
              valueFrom:
                configMapKeyRef:
                  name: integration-configs
                  key: keycloak-db-password
            - name: KC_HOSTNAME
              valueFrom:
                configMapKeyRef:
                  name: integration-configs
                  key: keycloak-db-hostname
            - name: KEYCLOAK_ADMIN
              valueFrom:
                configMapKeyRef:
                  name: integration-configs
                  key: keycloak-admin-user
            - name: KEYCLOAK_ADMIN_PASSWORD
              valueFrom:
                configMapKeyRef:
                  name: integration-configs
                  key: keycloak-admin-password
            - name: KC_HOSTNAME_STRICT_HTTPS
              value: "false"
            - name: KC_HOSTNAME_STRICT
              value: "false"
            - name: DEBUG_PORT
              value: "*:8787"
      volumes:
        - name: files-vol
          persistentVolumeClaim:
            claimName: pvc-files

---
apiVersion: v1
kind: Service
metadata:
  name: keycloak-service
  namespace: nioc
spec:
  selector:
    app: keycloak
  ports:
    - name: app
      protocol: TCP
      port: 8443
      targetPort: 8443
    - name: debug
      protocol: TCP
      port: 8787
      targetPort: 8787

دستور دیپلوی:

kubectl apply -f keycloak-deploy.yaml

توضیح: این دستور فایل keycloak-deploy.yaml را روی کلاستر Kubernetes اعمال کرده و دیپلوی Keycloak را آغاز می‌کند.

 


4. تنظیم Ingress برای ارائه SSO

با استفاده از فایل ingress.yaml زیر، سرویس SSO روی ساب‌دامین ارائه می‌شود:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
    nginx.ingress.kubernetes.io/keep-alive-requests: "10000"
    nginx.ingress.kubernetes.io/large-client-header-buffers: 8 512k
    nginx.ingress.kubernetes.io/max-worker-connections: "100000"
    nginx.ingress.kubernetes.io/proxy-body-size: 8m
    nginx.ingress.kubernetes.io/proxy-buffer-size: 256k
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    nginx.ingress.kubernetes.io/proxy-buffers: 4 512k
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/upstream-keepalive-connections: "2000"
    nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
    nginx.ingress.kubernetes.io/use-proxy-protocol: "true"
    nginx.org/server-snippets: |
      listen 80 443 backlog=4096;
  name: integration-ingress-ssl
  namespace: nioc
spec:
  rules:
  - host: mysso.nioc.ir
    http:
      paths:
      - backend:
          service:
            name: keycloak-service
            port:
              number: 8443
        path: /
        pathType: Prefix

دستور اعمال:

kubectl apply -f ingress.yaml

توضیح: این دستور فایل ingress.yaml را روی کلاستر Kubernetes اعمال کرده و تنظیمات Ingress برای دسترسی به سرویس SSO را ایجاد می‌کند.

نتیجه

پس از اجرای مراحل بالا، سرویس SSO روی ساب‌دامین mysso.nioc.ir در دسترس خواهد بود. اگر مشکلی در هر مرحله پیش آمد، از لاگ‌های مرتبط برای عیب‌یابی استفاده کنید.


دستورات مفید برای بررسی:

بررسی وضعیت پادها:

kubectl get pods -n nioc

توضیح: این دستور وضعیت پادهای مستقرشده در namespace nioc را نمایش می‌دهد.

بررسی لاگ‌های پاد:

kubectl logs [POD_NAME] -n nioc

توضیح: این دستور لاگ‌های یک پاد مشخص را برای بررسی خطا یا مشکلات نمایش می‌دهد.