KubeflowにKeycloakの導入

Keycloakは、主にWebおよびモバイルアプリケーションにおける認証、認可、シングルサインオン(SSO)を提供することを目的としています。

Keycloakは、セキュリティとアクセス制御を一元管理することで、アプリケーション開発者がこれらの機能を効率的に組み込むことができるように設計されています。


Kubeflowはデフォルトでdexを使用して認証機能を提供していますがこの認証機能は変更することが可能です。Kubeflowの認証機能をKeycloakに変更する方法をシェアしたいと思います。


以下の記事では、Windows環境にKubeflowのインストール方法をシェアしているので、Kubeflowのインストールがまだであれば、こちらの記事を参照してください。

venoda.hatenablog.com




1. Keycloakの設定

1. Kuberntes環境へKeycloakのデプロイ

Keycloakの公式サイトから、KeycloakのManifestファイルをダウンロードします。

https://www.keycloak.org/getting-started/getting-started-kube

$ kubectl create -f https://raw.githubusercontent.com/keycloak/keycloak-quickstarts/latest/kubernetes/keycloak.yaml -n auth


ifconfigIPアドレスを取得して、下記のURLでアクセスできるか確認してみてください。

http://<取得したIPアドレス>:8080


アクセスができたら次のような画面が表示されるはずです。


「Administration Console」をクリックするとログイン画面が表示されるので、下記のユーザ名とパスワードでログインしてください。

ユーザ名:admin
パスワード:admin



2. KeycloakコンソールからClientの設定

Keycloakのコンソールから、ClientにKubeflowを設定します。

※今回の目標はKubeflowの認証機能をKeycloakに変更することなので、レルムの設定などは行いません。


1. Clientの作成

左側のメニューから「Client」をクリックします。

「Create client」をクリックして、クライアントを作成します。


2. Client IDの設定

「Client ID」を設定します。

今回はkubeflow-oidc-authserviceと設定しました。


3. Client authenticationの設定

「Client authentication」を「On」に設定します。



4. Valid redirect URIsの設定

「Valid redirect URIs」を設定します。

ここは下記のURLを設定してください。

   http://localhost:8989/authservice/oidc/callback


5. Secretの取得

作成したClientをクリックして、Secretを取得します。

作成したClientを選択してください。


「Credential」タブの「Client Secret」の情報を取得します。

後ほどKubeflow側の設定の際に使用するのでメモしておいてください。


6. メールアドレスの設定

今回の設定では、ユーザのメールアドレスが必須になるので、メールアドレスを設定します。


左側のメニューの「Users」をクリックします。

※今回はユーザ作成は実施しないので、デフォルトで作成されているadminユーザに対して設定を行います。


メールアドレスを設定します。


これでKeycloak側の設定が完了しました。



2. Kubeflowの設定

ManifestファイルでKubeflowをインストールした場合に、認証機能周りの情報が記載されているディレクトリは下記となります。

manifests/common/oidc-authservice/base


設定を変更するファイルとしては、下記の2ファイルの編集を行います。

  • params.env
  • secret_params.env


コンテナ起動時に権限が不十分で、権限エラーが発生するため下記のStatefulSetに修正を行います。

  • statefulset.yaml


1. OIDCプロバイダの変更

params.envを下記のように修正します。

OIDC_PROVIDEROIDC_AUTH_URLは、ifconfigで取得したIPアドレスを設定してください。

# http://<keycloakのIP>:<keyclockのport>/realms/<レルム名>
OIDC_PROVIDER=http://<IPアドレス>:8080/auth/realms/master
# http://<keycloakのIP>:<keyclockのport>/realms/<レルム名>/protocol/openid-connect/auth
OIDC_AUTH_URL=http://<IPアドレス>:8080/auth/realms/master/protocol/openid-connect/auth
# profile email groups ⇒ profile email
OIDC_SCOPES=profile email
# 追加
AUTHSERVICE_URL_PREFIX=/authservice/
# /dex ⇒ /authservice
SKIP_AUTH_URLS=/authservice
AFTER_LOGOUT_URL=/
# http://<kubeflowのIP>:<kubeflowのport>/authservice/oidc/callback
REDIRECT_URL=http://localhost:8989/authservice/oidc/callback
USERID_HEADER=kubeflow-userid
USERID_PREFIX=
USERID_CLAIM=email
PORT="8080"
STORE_PATH=/var/lib/authservice/data.db

※最初にKeycloakのServiceへの内部IPを指定したのですが、Kubeflowアクセスの際に内部IPだとうまくいきませんでした。


secret_params.envを下記のように修正します。

# Keycloakコンソールで設定したclient id
CLIENT_ID=kubeflow-oidc-authservice
# keycloakコンソールで取得したclient secret
CLIENT_SECRET=〇〇〇〇〇〇〇


2. StatefulSetの修正

statefulset.yamlを下記のように修正します。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: authservice
spec:
  replicas: 1
  selector:
    matchLabels:
      app: authservice
  serviceName: authservice
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: "false"
      labels:
        app: authservice
    spec:
      serviceAccountName: authservice
      #################################
      # 権限変更処理の追加
      initContainers:
      - name: fix-permission
        image: busybox
        command: ['sh', '-c']
        args: ['chmod -R 777 /var/lib/authservice']
        volumeMounts:
        - mountPath: /var/lib/authservice
          name: data
      #################################
      containers:
      - name: authservice
        image: gcr.io/arrikto/kubeflow/oidc-authservice:e236439
        imagePullPolicy: Always
        ports:
        - name: http-api
          containerPort: 8080
        envFrom:
          - secretRef:
              name: oidc-authservice-client
          - configMapRef:
              name: oidc-authservice-parameters
        volumeMounts:
          - name: data
            mountPath: /var/lib/authservice
        readinessProbe:
            httpGet:
              path: /
              port: 8081
      securityContext:
        fsGroup: 111
      volumes:
        - name: data
          persistentVolumeClaim:
              claimName: authservice-pvc


3. 変更の適用

修正が完了したら、下記のコマンドでManifestファイルを適用します。

# manifests/common/oidc-authservice/base直下で適用する
$ kustomize build | kubectl delete -f -
$ kustomize build | kubectl apply -f -


Podの状態は、下記のコマンドで確認できるのでエラーが出力されていないか確認してみてください。

# 認証系を提供するリソース
$ kubectl get pods -n istio-system
$ kubectl describe pods -n istio-system authservice-0
$ kubectl logs -n istio-system authservice-0

# keycloakのリソース
$ kubectl get pods -n auth
$ kubectl describe pods -n auth keycloak-6f447f47f4-9hhd4
$ kubectl logs -n auth keycloak-6f447f47f4-9hhd4  # 適宜Pod名は修正する



3. Kubeflowへのアクセス

Kubeflowにアクセスするために、下記のコマンドを実行します。

$ kubectl port-forward svc/istio-ingressgateway -n istio-system 8989:80


ブラウザから下記のURLでアクセスできます。

http://localhost:8989


Keycloakのログイン画面が表示されます。


ユーザ名とパスワードはKeycloakの下記でアクセスができます。

ユーザ名:admin
パスワード:admin


実際にログインができました。

Keycloak上でユーザを作成すれば、作成したユーザでアクセスができます。