쿠버네티스

Kubernetes 네임스페이스 별 자원할당

황동리 2024. 6. 11. 16:32
반응형

이번엔 네임스페이스 별로 자원할당량을 설정해주고 serviceaccount에

해당 네임스페이스에 대한 권한만 부여하여 자원을 나눠서 사용해보도록 하겠습니다.


1. Namespace 생성

우선 Namespace를 생성 해줍니다.

# kubectl create namespace <생성하고자 하는 namespace 명>
ex) kubectl create namespace test

2. Service Account 생성

네임스페이스를 사용할 Service Account를 생성 해줍니다.

# kubectl create serviceaccount <생성하고자 하는 Serviceaccount 명> -n <앞서 생성한 Namespace 명>
ex) kubectl create serviceaccount test-sa -n test

3. Role 정의

Service Account에 넣어줄 권한을 정의해주는 Role을 생성 해줍니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: test <위에서 생성한 Namespace>
  name: test-role <생성하고자 하는 Role의 이름>
rules:
- apiGroups: [""]
  resources: ["pods", "services", "deployments"] <사용할 리소스 선언 ex) configmaps, secrets, pods, service, 등> 
  verbs: ["get", "list", "watch", "create", "update", "delete"] <위에서 정의한 리소스에 대한 동작 정의>

4. Rolebinding 설정

이제 ServiceAccount에 Role을 바인딩 해줍니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: test-role-binding <생성하고자 하는 Rolebinding의 이름>
  namespace: test <위에서 생성한 Namespace>
subjects:
- kind: ServiceAccount 
  name: test-sa <위에서 생성한 Serviceaccount 이름>
  namespace: test <위에서 생성한 Namespace>
roleRef:
  kind: Role
  name: test-role <위에서 생성한 Role의 이름>
  apiGroup: rbac.authorization.k8s.io

5. Secret 생성

쿠버네티스 1.24 버전 이후로는 Service Account에 대한 token 값을 수동으로 생성해주어야 합니다.

apiVersion: v1
kind: Secret
metadata:
  name: test-secret <생성하고자 하는 Secret 이름>
  namespace: test <위에서 생성한 Namespace>
  annotations:
    kubernetes.io/service-account.name: test-sa <위에서 생성한 ServiceAccount 이름>
type: kubernetes.io/service-account-token <ServiceAccount 토큰으로 정의>

6. token, ca.crt 확인

token 값 확인
# kubectl -n <Namespace 이름> describe secret $(kubectl -n <Namespace 이름> get secret | (grep <Secrets 이름> || echo "$_") | awk '{print $1}') | grep token: | awk '{print $2}'\n
ex) # kubectl -n test describe secret $(kubectl -n test get secret | (grep test-secret || echo "$_") | awk '{print $1}') | grep token: | awk '{print $2}'\n

 

 

ca.crt 생성
# kubectl -n <Namespace 이름> get secret $(kubectl -n <Namespace 이름> get secret | (grep <Secrets 이름> || echo "$_") | awk '{print $1}') -o "jsonpath={.data['ca\.crt']}" | base64 --decode > ca.crt
ex) kubectl -n test get secret $(kubectl -n test get secret | (grep test-secret || echo "$_") | awk '{print $1}') -o "jsonpath={.data['ca\.crt']}" | base64 --decode > ca.crt

7. kubeconfig 파일 정의

원래 가지고 있던 .kube/config 파일에서 몇 가지를 수정해줍니다.

apiVersion: v1
clusters:
- cluster:
    certificate-authority: ca.crt <앞서 생성한 ca.crt>
    server: <Kubernetes API 서버>
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    namespace: test <Namespace 추가>
    user: test-sa-context <Context에서 사용될 사용자>
  name: test-sa-context 
current-context: test-sa-context
kind: Config
preferences: {}
users:
- name: test-sa-context <Context에서 사용될 사용자>
  user:
    token: <앞서 확인한 token 값>

8. kubeconfig 동작 확인

(저 같은 경우에는 새로운 가상머신의 .kube 디렉터리 안에 위에서 생성한 kubeconfig 파일을 config 파일로 이름을 변경하여 넣어주었습니다.)
.kube 안에 파일을 안 넣어줄 경우에는 아래와 같이 명령어로 입력 해주면 됩니다.

# kubectl --kubeconfig=<위에서 생성한 kubeconfig 파일 경로> get pods

 

이제 동작 확인을 해보겠습니다.

 

다른 네임스페이스에서 파드를 확인하려고 하면 아래와 같이 오류가 나옵니다.

 

파드 생성도 정상적으로 잘 됩니다.

 

이상입니다.

반응형