Keycloak with helm(v2)

소개



이번에는 kubernetes 위에 Keycloak을 Deploy합니다.
Keycloak은 ID 관리 소프트웨어이며 SSO (Single Sing On), OAuth, OIDC (Open ID Connect)와 같은 인증 및 허가 API를 지원합니다.
Rancher의 로그인 인증에도 이용할 수 있기 때문에, 이번은 우선 Keycloak의 Deploy로부터 가고 싶습니다.
Deploy 방법은 helm v2 를 이용해 갑니다.

구성



docker-ce: 18.09
kubernetes: 1.17
Rancher: 2.4.2
롱혼: 0.8.0
helm: 2.16.6
Keycloak: 9.0.2

※이전의 기사에서도 실려 있습니다만, vagrant 상의 CentOS 로 k8s 클러스터를 짜고 있습니다.
※Keycloak 의 데이터 스토어에 postgresql 을 이용하고 있어 PV/PVC 로서 Longhorn 를 이용하고 있습니다
⇒ 구축은 여기 를 참조해 주세요.

이전 준비



이번에는 keycloak 을 helm 으로 Deploy 해 갑니다.
※Keycloak 의 Chart 는 helm 공식 카탈로그에서는 이미 이동하고 있어, 비추천이었기 때문에, 공식에서 이동한 처의 github 로부터 Chart 를 다운로드해 Deploy 합니다



※Rancher 에, 이동처의 github 의 URL 를 카탈로그로서 등록해 Deploy 를 시도했습니다만, 의존을 해결할 수 없고 Deploy 할 수 없었습니다・・・

먼저 준비로 helm을 설치합니다.

helm 설치
# バイナリダウンロード
$ wget https://get.helm.sh/helm-v2.16.6-linux-amd64.tar.gz

# 解凍・配置
$ tar xzvf helm-v2.16.6-linux-amd64.tar.gz
linux-amd64/
linux-amd64/README.md
linux-amd64/LICENSE
linux-amd64/tiller
linux-amd64/helm

$ mv linux-amd64/helm /usr/local/sbin/

# helm セットアップ前準備
$ kubectl -n kube-system create serviceaccount tiller
serviceaccount/tiller created

$ kubectl create clusterrolebinding tiller --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
clusterrolebinding.rbac.authorization.k8s.io/tiller created

# helm セットアップ
$ helm init --service-account tiller
Creating /root/.helm
・・・
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
・・・

# 動作確認
$ helm version
Client: &version.Version{SemVer:"v2.16.6", GitCommit:"dd2e5695da88625b190e6b22e9542550ab503a47", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.16.6", GitCommit:"dd2e5695da88625b190e6b22e9542550ab503a47", GitTreeState:"clean"}

준비 완료입니다. helm 을 사용해 Deploy 해 갑니다.

Deploy



먼저 필요한 Chart 세트를 다운로드합니다.
# git clone
$ git clone https://github.com/codecentric/helm-charts.git
$ cd helm-charts/charts/keycloak/

Deploy용 변수 파일을 편집합니다.
※ServiceType 에 NodePort 를 지정하고 있습니다
※데이터스토어에 PostgreSQL 를 지정해, PV 를 이용하도록 설정하고 있습니다

values.yaml
$ vim values.yaml

# 原本との比較
$ diff -u values.yaml{.org,}
--- values.yaml.org     2020-04-19 20:53:12.327210392 +0900
+++ values.yaml         2020-04-19 21:56:49.148103595 +0900
@@ -223,7 +223,7 @@

     ## ServiceType
     ## ref: https://kubernetes.io/docs/user-guide/services/#publishing-services---service-types
-    type: ClusterIP
+    type: NodePort

     ## Optional static port assignment for service type NodePort.
     # nodePort: 30000
@@ -287,10 +287,10 @@
   ## Persistence configuration
   persistence:
     # If true, the Postgres chart is deployed
-    deployPostgres: false
+    deployPostgres: true

     # The database vendor. Can be either "postgres", "mysql", "mariadb", or "h2"
-    dbVendor: h2
+    dbVendor: postgres

     ## The following values only apply if "deployPostgres" is set to "false"
     dbName: keycloak
@@ -332,7 +332,7 @@
   persistence:
     ## Enable PostgreSQL persistence using Persistent Volume Claims.
     ##
-    enabled: false
+    enabled: true

 test:
   enabled: true

네임스페이스를 만들고 배포합니다.

deploy
# namespace 作成
$ kubectl create ns keycloak
namespace/keycloak created

# deploy
# --dep-up:依存関係のある Chart をダウンロードします
# --name:helm 管理用の名前
# --namespace:deploy 先 namespace
$ helm install --dep-up --name keycloak --namespace keycloak ./
Hang tight while we grab the latest from your chart repositories...
・・・
...Successfully got an update from the "stable" chart repository
Update Complete.
Saving 1 charts
Downloading postgresql from repo https://kubernetes-charts.storage.googleapis.com/
Deleting outdated charts

NAME:   keycloak
LAST DEPLOYED: Sun Apr 19 22:00:23 2020
NAMESPACE: keycloak
STATUS: DEPLOYED

RESOURCES:
==> v1/ConfigMap
NAME              DATA  AGE
keycloak-sh       1     1s
keycloak-startup  1     1s
keycloak-test     1     1s

==> v1/Pod(related)
NAME                   READY  STATUS   RESTARTS  AGE
keycloak-postgresql-0  0/1    Pending  0         1s
keycloak-postgresql-0  0/1    Pending  0         1s

==> v1/Secret
NAME                 TYPE    DATA  AGE
keycloak-http        Opaque  1     1s
keycloak-postgresql  Opaque  1     1s

==> v1/Service
NAME                          TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)                      AGE
keycloak-headless             ClusterIP  None          <none>       80/TCP,8443/TCP              1s
keycloak-http                 NodePort   10.43.111.55  <none>       80:32051/TCP,8443:31402/TCP  1s
keycloak-postgresql           ClusterIP  10.43.98.107  <none>       5432/TCP                     1s
keycloak-postgresql-headless  ClusterIP  None          <none>       5432/TCP                     1s

==> v1/StatefulSet
NAME                 READY  AGE
keycloak             0/1    1s
keycloak-postgresql  0/1    1s

NOTES:

Keycloak can be accessed:
・・・
Login with the following credentials:
Username: keycloak

To retrieve the initial user password run:
kubectl get secret --namespace keycloak keycloak-http -o jsonpath="{.data.password}" | base64 --decode; echo

WebUI에 액세스



만든 Keycloak에 빠르게 액세스해 봅시다.
Rancher는 명령으로 만든 네임 스페이스의 작업 부하를 볼 때 대상 네임 스페이스를 프로젝트에 추가합니다.



네임 스페이스 옆의 "..."에서 "이동"을 선택하고 "Default"프로젝트로 이동하십시오.
이동하면 워크로드에도 배포된 리소스가 표시됩니다.





NodePort로 작성했기 때문에 액세스처의 IP는 worker의 IP가 됩니다만, Port에 대해서는 이하에서 확인할 수 있습니다.

포트 확인
# kc get svc -n keycloak keycloak-http
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                       AGE
keycloak-http   NodePort   10.43.187.78   <none>        80:30187/TCP,8443:32650/TCP   8m40s

Rancher의 관리 화면에서 「리소스」⇒「워크로드」⇒「서비스 발견」에서도 확인할 수 있습니다.



내 환경의 경우 worker # 1의 IP 주소가 192.168.10.51이므로,
http://192.168.10.51:30187
htps // 192.168.10.51:32650

에서 액세스할 수 있습니다.
※80이 http, 8443이 https의 통신이 됩니다
※https는 자기 서명 증명서입니다



"Administration Console"을 클릭하면 로그인 화면이 나타납니다.
Username은 "keycloak"을 지정하고 암호는 다음과 같이 얻을 수 있습니다.

keycloak_password
$ kubectl get secret --namespace keycloak keycloak-http -o jsonpath="{.data.password}" | base64 --decode; echo

로그인 화면



Dashboad (Master realm)



결론



Keycloak 의 환경은 helm 라고 순식간에 구축할 수 있었습니다.
배포시 설정은 values.yaml을 편집하여 사용자 정의 할 수 있으므로 사용자 환경에 맞는 설정을 확인하는 것이 좋습니다.
특히 ServiceType/Ingress 등의 액세스용의 설정은 해 둡시다.

다음에는 Rancher 로그인 인증을 위해 Keycloak을 사용하고 싶습니다.

좋은 웹페이지 즐겨찾기