[Helm]GKEなどRBACが有効な環境でHelmを利用するには?

GKEなどRBACが有効なKubernetes環境でHelmを利用するには、アクセス権限の設定が必要です。本記事ではRBACが有効なKubenetes環境でHelmを利用する方法を紹介します。

はじめに

KubernetesのRBACとは、Role-based access controlのことです。ユーザに与えられたロールをもとに、アクセスできるリソースやネットワークを規定します。GKEなどではデフォルトでRBACが有効になっています。このため、権限のないユーザでHelmサーバ(Tiller)をインストールした場合、Chartのインストールでの権限が不足し、以下のようなエラーが発生します。

$ helm install --name nginx easydoggie/nginx
Error: release nginx failed: namespaces "default" is forbidden: User "system:serviceaccount:kube-system:default" cannot get resource "namespaces" in API group "" in the namespace "default"

RBACに基づいた権限を設定するために、ServiceAccountClusterRoleBindingを利用した設定を紹介します。

RBACの認証設定

確認環境

本記事では以下のKubernetesのバージョンで動作確認を行っています。サーバは記事執筆時点のGKEのデフォルトバージョンです。

$ kubectl version --short
Client Version: v1.14.1
Server Version: v1.12.8-gke.6

マニフェストファイルを作る

ServiceAccountとClusterRoleBindingのマニフェストファイルを作成します。ClusterRoleとしてデフォルトで用意されている’cluster-admin‘の権限を与えています。

#file: serviceaccount/helm-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: helm
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: helm
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: helm
  namespace: kube-system

マニフェストファイルはGitHubでも公開してるので、参照をしてください。

https://github.com/easydoggie/EasyDoggie/tree/master/serviceaccount

マニフェストファイルを適用する

作成したマニフェストファイルをkubectl applyコマンドでKubernetes上に適用します。はじめに現在のコンテキストがHelmインストール先であるか、確認をしておきましょう。

$ kubectl config current-context
<your_current_context>

現在のコンテキストが正しければ、マニフェストファイルを適用します。

$ kubectl apply -f helm-account.yaml
serviceaccount/helm created
clusterrolebinding.rbac.authorization.k8s.io/helm created

Kubernetes上に反映されたか、確認をしてみましょう。

$ kubectl get sa,clusterrolebindings -n kube-system helm
NAME                  SECRETS   AGE
serviceaccount/helm   1         17s

NAME                                                AGE
clusterrolebinding.rbac.authorization.k8s.io/helm   17s

反映されたようです。これでHelm用のRBAC設定ができました。Helmサーバ(Tiller)のインストールに進みます。

Helmサーバ(Tiller)をインストールする

Helmクライアントのインストールは事前に完了させておいてください。Helmクライアントのインストール方法は別の記事で紹介をしているので、参考にしてください。

Helmサーバ(Tiller)のインストールにはhelm initコマンドを利用します。オプションなしでもTillerのインストールはできますが、helm installなどのコマンドを実行したときに、権限不足でエラーが発生します。Helmに必要な権限を有効にするために、helm initでTillerをインストールするときに—service-accountオプションで事前に作成したRBAC用のHelmアカウントを指定します。

$ helm init --service-account helm
$HELM_HOME has been configured at /home/maint/.helm.

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

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!

helm versionコマンドでサーバにアクセスできるか確認をしておきましょう。

$ helm version --short
Client: v2.13.1+g618447c
Server: v2.13.1+g618447c

ここまで問題がなければ、helm installコマンドでHelmチャートのインストールも問題なく実行できます。

おわりに

本記事ではRBACが有効な環境でHelmを使う方法を紹介しました。どのシステムでもアクセス権や認証は必要な項目です。しかし設計や設定があいまいだと、本番と開発環境のアクセス権限の違いで、障害を引き起こしてしまう場合もあります。普段からシステムやユーザの権限を意識し、環境間の差異はなくしていきたいものです。コンテナは環境間の差異をなくす一つの手段でもありますので、積極的に活用していきたいですね。

スカイアーチ ファンタジー研究室

スカイアーチ ファンタジー研究室

投稿者プロフィール

石川 淳
スカイアーチネットワークスで、新しいサービスの企画を行っています。
元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。
https://github.com/easydoggie
コメントを頂けると嬉しいです。

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.

ABOUTこの記事をかいた人

スカイアーチネットワークスで、新しいサービスの企画を行っています。 元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。 https://github.com/easydoggie コメントを頂けると嬉しいです。