Tiller with RBAC #
In previous example we installed tiller in kube-system namespace. It has cluster-admin previledge. That approach is not suitable if we have several departments using the same cluster. Assume we have 3 departments and each department need to deploy in your GKE cluster. We cannot grant access to the tiller account (which has cluster admin previledge). Therefore, we create three namespaces for each department and deploy tiller in each namespace with RBAC permission.
Design #
We will have 3 namespaces
-
Travel
-
Commerce
-
Hotel
We will have 4 GCP service accounts
-
gke-cluster-admin
IAM ROLE
- Kubernetes Engine Cluster Admin
- Kuberneted Engine Admin
RBAC ROLE
- cluster-admin
-
gke-travel-admin
IAM ROLE
- Kubernetes Engine Viewer
RBAC ROLE
- admin
-
gke-commerce-admin
IAM ROLE
- Kubernetes Engine Viewer
RBAC ROLE
- admin
-
gke-hotel-admin
IAM ROLE
- Kubernetes Engine Viewer
RBAC ROLE
- admin
Create Cluster Admin #
-
Create service account ‘gke-cluster-admin’ with these two roles Kubernetes Engine Cluster Admin,Kuberneted Engine Admin
-
Download the service account json (gke-cluster-admin.json)
-
Grant cluster-admin RBAC to the user gke-cluster-admin.json
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=gke-cluster-admin@<project-name>.iam.gserviceaccount.com
Login to gcp using Cluster Admin service account and then login to the gke cluster #
gcloud auth activate-service-account --key-file=gke-cluster-admin.json
gcloud container clusters get-credentials <cluster-name> --project <project-name>
Create namespaces #
kubectl create namespace travel
kubectl create namespace commerce
kubectl create namespace hotel

Create Service accounts for each namespace #
If you need to segregate the permissions tiller has, you will need to create a tiller in every namespace and tie a specific service account to it
kubectl create serviceaccount tiller --namespace travel
kubectl create serviceaccount tiller --namespace commerce
kubectl create serviceaccount tiller --namespace hotel
Create ’tiller-manager’ RBAC role for each namespace #
role-tiller.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: tiller-manager
namespace: <namespace>
rules:
- apiGroups: ["", "batch", "extensions", "apps", "rbac.authorization.k8s.io"]
resources: ["*"]
verbs: ["*"]
kubectl create -f roler-tiller.yaml
Create RoleBinding for tiller in each namespace #
rolebinding-tiller.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: tiller-binding
namespace: <namespace>
subjects:
- kind: ServiceAccount
name: tiller
namespace: <namespace>
roleRef:
kind: Role
name: tiller-manager
apiGroup: rbac.authorization.k8s.io
Create 3 IAM Service Accounts for namespaces #
Create 3 IAM service accounts with ‘Kubernetes Engine Viewer’ Role. And download the json key files
-
gke-travel-admin
-
gke-hotel-admin
-
gke-commerece-admin
Create RoleBinfing for each above user #
We assign admin role for the namespace
rb-travel-admin.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: travel-admin
namespace: travel
subjects:
- kind: User
name: travel-gke-admin@<project-name>.iam.gserviceaccount.com
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: admin
apiGroup: rbac.authorization.k8s.io
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: <name>
namespace: <namespace>
subjects:
- kind: User
name: <user email of serivce account>
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: admin
apiGroup: rbac.authorization.k8s.io
Create a Rolebinding for tiller #
Here we grand admin permisson to the service account tiller in each namespace
kubectl create rolebinding <name-for-role-binding> --clusterrole=admin --serviceaccount=<namespace>:<service-account-name> --namespace=<namespace>
kubectl create rolebinding admin-tiller-hotel --clusterrole=admin --serviceaccount=hotel:tiller --namespace=hotel
kubectl create rolebinding admin-tiller-travel --clusterrole=admin --serviceaccount=travel:tiller --namespace=travel
kubectl create rolebinding admin-tiller-commerce --clusterrole=admin --serviceaccount=commerce:tiller --namespace=commerce
Intialize helm in each namespace #
helm init --service-account tiller --tiller-namespace travel
helm init --service-account tiller --tiller-namespace hotel
helm init --service-account tiller --tiller-namespace commerce
Install app using tiller account #
Login to the gke using namespace admin service account (gke-travel-admin,gke-hotel-admin,gke-commerce-admin)
gcloud auth activate-service-account --key-file=gke-travel-admin.json
gcloud container clusters get-credentials <cluster-name> --project <project-name>
helm install my-app/ --name <name-for-helm> --tiller-namespace <namespace-of-tiller> --namespace <namespace-where-you-want-to-deploy-the-app>
helm install my-app/ --name test-hotel-my-app --tiller-namespace hotel --namespace hotel
helm install my-app/ --name test-commerce-bak-my-app --tiller-namespace travel --namespace commerce
helm install my-app/ --name test-travel-bak-my-app --tiller-namespace travel --namespace travel