쿠버네티스

Kubernetes : RBAC (role/rolebinding/csr/serviceAccount)

NickTop 2025. 3. 9. 18:51

RBAC

user별로 역할을 구분하여 쿠버네티스의 특정 리소스만 접근

외부에서 kube-api-server를 호출할 때 ca.crt와 함께 호출한다

 

User을 생성하는 과정은 다음과 같다

 

CSR

쿠버네티스는 csr을 쿠버네티스의 리소스로 등록하여 승인할 수 있다

openssl genrsa -out sample.key 2048
openssl req -new -key sample.key -out sample.csr
# 아무거나 입력, 단 common name은 user와 맞추어야함

 

생성한 .csr을 쿠버네티스의 리소스로 등록하자

sample.csr을 base64로 디코딩 하여 spec.request에 넣어야한다

cat sample.csr | base64 | tr -d '\n'

 

# vi sample-csr.yaml

apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: sample-csr
spec:
  request: LS0tLS1CRUdJTiBDR...(생략)
  signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth

 

리소스로 등록하고 승인하자

kubectl create -f sample-csr.yaml
kubectl certificate approve sample-csr

# .crt얻기
kubectl get csr sample-csr -o jsonpath='{.status.certificate}'| base64 -d > sample.crt

 

이제 sample이라는 user에 .crt를 등록하여 외부에서 https로 접근할 수 있게 하자

 

role과 rolebinding을 생성해서, role에는 어떤 리소스에 접근 가능한지 정의하고, rolebinding을 통해서 user와 role을 이어주자

참고로 clusterRole은 namespace를 지정하지 않는 role이고 role은 namespace를 지정하는 role이다

# pod만 접근가능한 role
kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods
# rolebinding
kubectl create rolebinding developer-binding-sample --role=developer --user=sample

 

마지막으로 kubeconfig에 추가해주어야 한다

kubectl config set-credentials sample --client-key=sample.key --client-certificate=sample.crt --embed-certs=true
kubectl config set-context sample --cluster=kubernetes --user=sample

 

여기까지하면 ~/.kube/config에 sample이라는 user가 추가되어있다

 

다음과 같은 형태로 외부PC에서 kube api server를 호출할 수 있다

다음과 같이 클러스터 설정

 

* $HOME/k8s/sample 경로에 sample.key, sample.crt있어야함

kubectl config set-cluster my-cluster \
  --server=<api-server>:6443 \
  --certificate-authority=$HOME/k8s/sample/ca.crt \ # ca.crt는 마스터노드의 /etc/kubernetes/pki 경로에 있다
  --embed-certs=true \
  --kubeconfig=$HOME/k8s/sample-config

 

context 설정

kubectl config set-context sample-context \
  --cluster=my-cluster \
  --user=sample \
  --kubeconfig=$HOME/k8s/sample-config
  
kubectl config use-context sample-context --kubeconfig=$HOME/k8s/sample-config

 

이후 호출 가능

kubectl --kubeconfig=$HOME/k8s/sample-config get pods

 

 

serviceAccount

serviceaccount는 pod에 role을 부여하는 것입니다

kubectl create serviceaccount api-caller

role 및 rolebinding 생성

# api-caller-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: api-caller-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]
yaml

---

# api-caller-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: api-caller-binding
subjects:
- kind: ServiceAccount
  name: api-caller     #  Pod가 사용할 ServiceAccount
  namespace: development
roleRef:
  kind: Role
  name: api-caller-role
  apiGroup: rbac.authorization.k8s.io
  
---

apiVersion: v1
kind: Pod
metadata:
  name: api-calling-pod
  namespace: development
spec:
  serviceAccountName: api-caller
  containers:
  - name: alpine
    image: alpine
    command: ["sleep", "3600"]

 

위 방법으로 pod가 kube api server를 호출할 수 있다

 

 

 

https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/

'쿠버네티스' 카테고리의 다른 글

2025 CKA 자격증 합격 후기  (0) 2025.03.19
Kubernetes : CRD  (0) 2025.03.09
Kubernetes : Kustomize  (0) 2025.03.05
Kubernetes : Helm  (0) 2025.03.04
Kubernetes : Network  (0) 2025.03.03