์๋ ํ์ธ์,
Helm 2.5.0
GCP์์ RBAC๊ฐ ์ฌ์ฉ ์ค์ ๋ Kubernetes 1.6
kubectl ๋ฐ helm์ ์ฌ์ฉํ์ฌ ์ปจํ ์ด๋์์์ด ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
$ kubectl config set-credentials $K8S_USER --username=$K8S_USER --password=$K8S_PASS
$ kubectl config set-cluster test-cluster --server=https://$K8S_SERVER --insecure-skip-tls- verify=$K8S_INSECURE_SKIP_TLS_VERIFY
$ kubectl config set-context default-context --cluster=$K8S_CLUSTER_NAME --user=$K8S_USER
$ kubectl config use-context default-context
$ kubectl cluster-info
Kubernetes master is running at https://****
$ helm init
$HELM_HOME has been configured at /config/.helm.
Error: error installing: User "system:anonymous" cannot create deployments.extensions in the namespace "kube-system".: "No policy matched.\nUnknown user \"system:anonymous\"" (post deployments.extensions)
์ด ์ค๋ฅ๋ฅผ ์์ ํ๋ ค๋ฉด ์ด๋ป๊ฒํด์ผํฉ๋๊น?
์ฐจํธ์์ ์์ฒญํ ๊ฐ์ฒด๋ฅผ ์ค์นํ ์ ์์ผ๋ ค๋ฉด Tiller ํฌ๋์ ์๋น์ค ๊ณ์ ์ ์ถฉ๋ถํ ๊ถํ์ ๋ฐ์ธ๋ฉํด์ผํฉ๋๋ค. ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ํด๋น ํฌ๋๊ฐ ์คํ๋๋ ๋์ผํ ๋ค์ ์คํ์ด์ค (๊ทํ์ ๊ฒฝ์ฐ "kube-system")์์ Tiller์ ๋ํ ์ ์๋น์ค ๊ณ์ ์ ๋ง๋ ๋ค์ ์ฐจํธ๋ฅผ ์ค์นํ๋ ค๋ ๋ค์ ์คํ์ด์ค์ _Role_์ ๋ง๋ค๊ฑฐ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ _ClusterRole_์ ๋ง๋๋ ๊ฒ์ ๋๋ค. ์ฌ๋ฌ ๋ค์ ์คํ์ด์ค์์ ์ ์๋ฅผ ๊ณต์ ํ ๋ค์ _RoleBinding_ ๋๋ _ClusterRoleBinding_ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์์ ์ธ๊ธ ํ Tiller ๊ด๋ จ ์๋น์ค ๊ณ์ ์ ์ด๋ฌํ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
์๋น์ค ๊ณ์ ๋ฐ ClusterRoleBinding ์ ์๋ก ๋งค๋ํ์คํธ๋ฅผ ๋ง๋ค์์ต๋๋ค.
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
secrets:
- tiller-secret
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
๊ทธ๋ฐ ๋ค์์ด ์๋น์ค ์ฌ์ฉ์๋ฅผ Tiller ์ฌ์์ ์ถ๊ฐํ์ต๋๋ค.
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
๊ทธ๋ฐ ๋ค์ ํ์ดํ ๋ผ์ธ ๋งค๋ํ์คํธ์ k8s์์ ์ธ์ฆ์ ๋ํ ๋ช ๋ น ๋ชฉ๋ก์ ๋ณ๊ฒฝํ์ต๋๋ค.
begin_script:
- echo "$CA" > /ca.crt
- kubectl config set-cluster k8s-cluster --embed-certs=true --server=https://$K8S_SERVER --certificate-authority=/ca.crt
- kubectl config set-credentials tiller --token=$USER_TOKEN
- kubectl config set-context k8s-cluster --cluster=k8s-cluster --user=tiller
- kubectl config use-context k8s-cluster
$CA
๋ฐ $USER_TOKEN
-ca.crt ๋ฐ์ดํฐ ๋ฐ ํธ๋ฌ ์ฌ์ฉ์ ํ ํฐ์ ์ ์ฅํ๋ ๋น๋ฐ ๋ณ์์
๋๋ค.
ca.crt ๋ฐ user_token์ ๊ฐ์ ธ ์ค๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ญ์์ค.
$ secret=$(kubectl get sa tiller -o json --namaspace=kube-system | jq -r .secrets[].name)
$ kubectl get secret $secret -o json | jq -r '.data["ca.crt"]' | base64 -D # $CA
$ kubectl get secret $secret -o json | jq -r '.data["token"]' | base64 -D # $USER_TOKEN
_helm init_๋ ์ปค๋ฐ 64e9e471838ac44e551c32abcbd19f671c80ecce์์ --service-account
ํ๋๊ทธ๋ฅผ ์ค์ํฉ๋๋ค.