반응형
이번엔 네임스페이스 별로 자원할당량을 설정해주고 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
이제 동작 확인을 해보겠습니다.
다른 네임스페이스에서 파드를 확인하려고 하면 아래와 같이 오류가 나옵니다.
파드 생성도 정상적으로 잘 됩니다.
이상입니다.
반응형
'쿠버네티스' 카테고리의 다른 글
쿠버네티스 공부 1일차 (라이브니스 프로브, 데몬셋) (0) | 2024.07.18 |
---|---|
쿠버네티스 네임스페이스 변경 (0) | 2024.06.27 |
쿠버네티스 Metrics 설치 (0) | 2024.06.10 |
쿠버네티스 클러스터에 Master, Worker 노드 추가 (0) | 2024.04.18 |
MetalLB 사용해서 외부로 노출 시키기 (0) | 2024.04.15 |