반응형
안녕하세요! 오늘은 특정 NAMESPACE에만 권한을 부여하고,
이 권한에 대한 kubeconfig 를 생성하는 방법에 대해 알아보겠습니다.
특정 namespace용 kubeconfig 만들기
TL;DR;
- Kubernetes에서 제공하는 role, role binding, service account를 이용합니다.
- 관련문서: https://kubernetes.io/docs/reference/access-authn-authz/rbac/
- 특정 namespace에 read/write 권한을 갖는 role을 생성하고, 시스템 어카운트인 serviceaccount를 생성하고, rolebindingd을 통해 앞서 정의한 role을 생성한 serviceaccount에 바인딩합니다.
상황
- 클러스터를 관리하고 있는 admin은 클러스터 내의 모든 권한을 갖지만, 이 권한을 모든 사용자가 가져서는 안 됩니다. 개발자나, 특정 리소스에만 접근이 필요한 사용자에게 least previlege의 원칙에 맞추어 필요한 만큼의 권한만 부여해야 하는데, 본문에서는 특정 namespace를 생성해 주고, 거기에 read/write 권한을 갖는 kubeconfig를 생성하여 이 config를 사용하는 사용자가 적정한 권한을 이용하여 클러스터에 접근할 수 있도록 합니다.
clusterrole vs. role
- scope의 차이가 있습니다. role은 within a certain namespace이라는 범위를 가지고 있고, clusterrole은 클러스터 내에서 지정할 수 있는 role 입니다. 본문의 경우에는 둘 다 사용 가능하지만 clusterrole로 진행하겠습니다~!
rbac이 적용된 kubeconfig 만들기
- 권한을 부여할 namespace가 없다면 생성합니다.
kubectl create ns test-space
- service account를 생성합니다. yaml로 생성하든 cli로 생성하든 편하신 대로..ㅎㅎ
# CLI
kubectl create sa sa-dev
# yaml
# serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: sa-dev
namespace: test-space
kubectl apply -f ./serviceaccount.yaml
- 생성된 service account에 role binding을 통해 권한을 부여합니다.
# rb.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: dev-rolebinding
namespace: test-space
subjects:
- kind: ServiceAccount
name: sa-dev
namespace: test-space
roleRef:
kind: ClusterRole
name: edit
apiGroup: rbac.authorization.k8s.io
- namespace와 serviceaccount의 정보를 기반으로 kubeconfig를 생성합니다.
# the name of the service account
name=sa-dev
# the name of the namespace
namespace=test-space
server=$(kubectl cluster-info | grep -m 1 -o "https.*.:443")
token_name=$(kubectl -n $namespace get serviceaccount $name -o jsonpath='{.secrets[].name}')
ca=$(kubectl -n $namespace get secret/$token_name -o jsonpath='{.data.ca\\.crt}')
token=$(kubectl -n $namespace get secret/$token_name -o jsonpath='{.data.token}' | base64 --decode)
echo "
apiVersion: v1
kind: Config
clusters:
- name: default-cluster
cluster:
certificate-authority-data: ${ca}
server: ${server}
contexts:
- name: default-context
context:
cluster: default-cluster
namespace: ${namespace}
user: ${name}
current-context: default-context
users:
- name: ${name}
user:
token: ${token}
" > kubeconfig
- 이제 생성된 kubeconfig를 --kubeconfig 옵션을 이용하든 kubectx를 사용하든 뭘 하시든 사용하시면 해당 namespace에서만 read, write가 가능한 환경이 조성됩니다~
네.........
길고 긴 여정이었는데요,
하나씩 하는 것도 좋지만..................조금...번거롭습니다.
스크립트 하나로 퉁쳐봅시다!
- 위의 설명은 다 잊고 요 스크립트 실행시키고, service account name과 namespace 만 지정해 주시면
알아서 지지고볶고 다 됩니다~ - 주의하실 점은, 해당 커맨드를 사용하실 때 rancher api를 이용한 context 파일을 사용하고 계시면 안 되고,
(kubernetes api server의 주소를 가져오지 못하고 rancher api 주소를 가져오기 때문)
이 shell을 실행하실 때 current-context가 원하시는 클러스터로 지정되어 있어야 합니다^^
#!/bin/bash
read -p 'service account name: ' name
read -p 'namespace you want to create: ' namespace
if [ -z "$name" ] || [ -z "$namespace" ];
then
echo "please provide the input - serviceaccount and namespace"
exit 1
fi
kubectl create ns $namespace
kubectl create serviceaccount $name -n $namespace
kubectl create rolebinding $name --clusterrole=edit --serviceaccount="$namespace:$name" --namespace=$namespace
server=$(kubectl cluster-info | grep -m 1 -o "https.*.:443")
token_name=$(kubectl -n $namespace get serviceaccount $name -o jsonpath='{.secrets[].name}')
ca=$(kubectl -n $namespace get secret/$token_name -o jsonpath='{.data.ca\\.crt}')
token=$(kubectl -n $namespace get secret/$token_name -o jsonpath='{.data.token}' | base64 --decode)
cluster=$(kubectl config view --minify -o jsonpath='{.clusters[].name}')
echo "
apiVersion: v1
kind: Config
clusters:
- name: ${namespace}-${name}
cluster:
certificate-authority-data: ${ca}
server: ${server}
contexts:
- name: developer-context
context:
cluster: ${cluster}
namespace: ${namespace}
user: ${name}
current-context: developer-context
users:
- name: ${name}
user:
token: ${token}
" > kubeconfig
이상입니다~ 즐건 쿠베생활하세요 ㅎㅎ
반응형
'DevOps' 카테고리의 다른 글
[이럴땐이렇게] Kubernetes(쿠버네티스)에서 namespace 삭제가 안 될 때 강제 삭제하기 (0) | 2022.01.12 |
---|---|
[이럴땐이렇게] Jenkins에서 배포한 지 오래 된 Job 찾기! 마지막 배포로부터 n일 이상 된 잡을 찾아보자~! (0) | 2021.12.21 |
[Kubernetes & Azure] TLS 인증서(SSL 인증서) Keyvault 연동하기 (1) | 2021.11.13 |
[Kubernetes] Application Gateway의 기본 기능, Connection Draining에 대해 알아보자! (0) | 2021.11.10 |
[Kubernetes] Node selector vs. Node affinity, 어떤 것을 사용할까? (1) | 2021.11.07 |