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

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

