본문 바로가기
Development(Web, Server, Cloud)/Cloud : 정리

kubernetes(k8s) 정리 part1

by tonyhan18 2022. 5. 19.
728x90

라벨링(label)

특정 포드를 특정 노드에 배포하고 싶은 경우가 있을 수 있다. 이 경우에는 특정 노드를 지정하기 위하여 라벨을 사용할 수 있다.

 

특정 노드에 배치할 수 있는 방법

1) Pod 배포시 spec에 배포될 Node 의 이름을 작성한다.

2) Node에 label을 부착하고 pod 배포시 해당 label을 지정한다. - 이렇게 하면 같은 라벨을 부착할 수도 있고 구지 노드별로 yaml을 만들어줄 필요도 없어진다. Pod를 확장해서 Deployment나 Replicaset으로 지정하면 Pod 별로 스케쥴링이 되어 배포된다.

 

노드에 라벨을 부착하고 Deployment, ReplicaSet 을 이용하여 포드의 숫자를 다수로 설정했을 경우에는 각 포드별로 스케줄링이 되므로 모든 포드가 하나의 노드에 배치되는 것이 아니라, 각 노드(동일한 라벨을 사용하는)에 분산 처리 배치 된다.

 

kubectl get no --show-labels
# 현재의 노드에 부착되어있는 라벨은 무엇인가 : 전체를 보여줌

kubectl describe no node1
# node1의 라벨을 볼 수 있다.

kubectl label nodes node1 zone=seoul
kubectl label nodes node2 zone=seoul
kubectl label nodes node3 zone=busan

kubectl label nodes node1 level=low
kubectl label nodes node2 level=med
kubectl label nodes node3 level=med

* kubectl label nodes node1 region/zone=a
* kubectl label nodes node2 region/zone=b
(Key: region/zone, Value=a 이런 형식으로도 작성할 수 있다.)
# 직접 만든 사용자 라벨을 추가하고 싶다면?

kubectl describe pod testpod
kubectl label node node1 zone-
kubectl label node node2 zone-
kubectl label node node3 zone-

kubectl label node node1 level-
kubectl label node node2 level-
kubectl label node node3 level-
# 라벨 모두 지우기
apiVersion: v1
kind: Pod
metadata:
  name: testpod
spec:
  nodeSelector:
    zone: seoul
    level: med
  containers:
  - name: testctn
    image: nginx

이 상황에서 포드를 특정 노드에 배포하기

 

 

 

네임스페이스(namespace)

PV/PVC/Dynamic PV + SA/RBAC

PV/PVC 는

1. 정적 매핑

- 개발자와 스토리지 담당자가 대화를 통해 필요한 볼륨을 정의

- 스토리지 담당자는 볼륨을 미리 준비한다. 생성된 볼륨은 pool에 담긴다.

- 개발자는 스토리지 담당자로 부터 접속을 위한 정보(파일시스템 -> NFS, iSCSI..., IP, Access[ReadWriteMany/ReadWriteOnce])를 전달받고 해당 정보를 PVC에 정의한 다음 해당 PVC를 Pod에 작성하여 배포시 지정된 볼륨을 사용한다.

RWO 이면 한 Pod에 한 PV만 연결

RWM 이면 여러 Pod에 한 PV를 연결

-> 정적 매핑은 볼륨의 정확한 정보를 미리 알고 있어야 한다.

 

2. 동적 매핑

* k8s에서의 계정관리

1) ServiceAccount : 시스템 사용자, 특정 포드, 오브젝트를 사용할 수 있는 권리

2) UserAccount : 전체 클러스터를 대상으로한 사용자, k8s 내에서 별도로 사용자를 생성하는 것이 아니라, 3rd party에서 제공하는 인증서버와 연계해서 사용해야 한다.(들어오기전에 사용자 인증서버를 거치어서 들어오는 계정)

 

프로비저너는 회사내에서 포드에 볼륨을 제공할 수 있는 스토리지별로 작성한다.

동적과 정적 매핑의 가장 큰 차이점은 정적 매핑은 필요한 볼륨정보를 사전에 담당자와 미리 회의를 통해 결정해야하고 정확한 주소 등을 기록할 수 있어야 한다.

하지만 개발자가 볼륨이 필요할 때마다 담당자에게 연락해서 해당 볼륨을 제공받는 것은 서로에게 불필요한/불편한 작업이 될 것이다. 따라서, 개발자는 볼륨이 필요할 때마다 담당자와의 소통 필요없이 즉시 볼륨을 제공받을 수 있는 것이 필요한데 이것은 동적 PVC에서 제공한다.

이제 Pod 안에는 StorageClass가 존재하고 StorageClass는 어떤 Provisioner를 사용할지가 결정되어 잇다. 우리의 Provisioner 코드는 NFS(211.183.3.99/k8s)에게 가게된다. 그렇게 만들어진 PV가 PVC의 요청에 따라서 Pod로 가게 된다.

 

pv를 사용할 수 있는 포드 배포하기

동적 프로비저너를 사용해서 배포하는 것이 보다 편리할 수 있다.

 

- 전체구조

Pod([PVC -> Storage Class -> Provisioner]) ---> NFS(Storage/디렉토리)

 

SA: 쿠버네티스 내에서 시스템(노드 등등의 오브젝트와 특정 명령을 사용할 수 있는 일종의 계정)

RBAC(Role Based Access Control)

 

Role(네임스페이스에 속한 오브젝트에 대한 사용가능 명령?)

--- deploy, pod, svc, pvc ... ---

둘을 연결해주는 것이 RoleBinding(Role과 SA를 연결)

SA

 

ClusterRole(네임스페이스에 속하지 않은 오브젝트에 대한 명령)

--- node, namespace, persistent volume(PV) ... ---

둘을 연결해주는 것이 ClusterRoleBinding(Role과 SA를 연결)

SA

 

SA

 

728x90