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 |