본문 바로가기

About/Kubernetes

(37)
[k8s] RBAC(Role Based Access Control)란 리소스 표현과 동작 쿠버네티스는 리소스 조작을 API Server에 집약시키고 있습니다. 그리고 API Server는 REST 형식으로 리퀘스트를 받습니다. URL로 리소스를 표현하고 거기에 대해 HTTP 메소드로 조작을 합니다. 쿠버네티스의 RBAC에서는 조작을 Verb라고 부릅니다. 참조, 작성, 갱신, 부분 갱신, 삭제 조작에 각각 Verb가 있어서 HTTP 메서드와 대응하고 있습니다. HTTP Method Verb Verb(컬렉션) GET, HEAD get(watch) list(watch) POST create - PUT update - PATCH patch - DELETE delete deletecollection 파드, 서비스, 시크릿과 같은 리소스에 대해 각 계정이 갖고 있는 '역할'이 이런..
[k8s] 쿠버네티스의 인증과 인가 쿠버네티스의 인증과 인가는 API Server 상에서 일어나는데, 인증, 인가, Admission Control 이라는 3단계가 있습니다. 인증 인증은 해당 계정이 누구인지, 어떤 그룹에 속하는지를 확인하는 것입니다. 쿠버네티스가 지원하고 있는 대표적인 방식, 플로그인은 다음과 같습니다. X509 클라이언트 인증서 정적 토큰 파일 부트스트랩 토큰 정적 비밀번호 파일 Service Account 토큰 OpenID Connect 토큰 인가 인가는 인증이 끝난 계정에 대해 조작할 수 있는 리소스와 가능한 조작을 한정하는 것입니다. 인가 방식에는 여러 가지가 있지만 그중에서도 RBAC(Role Based Access Control)가 사실상 표준으로 자리매김하고 있습니다. Admission Control Ad..
[k8s] 쿠버네티스의 계정 - User Account, Service Account 사용자 계정(User Account) 쿠버네티스는 '사람'을 관리하는 장치를 가지고 있지 않습니다. 정확히 말하자면 일반 사용자를 나타내는 오브젝트가 없습니다. 쿠버네티스는 일반 사용자의 관리를 외부에게 맡기고 있습니다. 여기서 외부란 Azure AD나 Google 계정과 같은 ID 관리 시스템입니다. 일반 사용자는 외부에서의 인증을 거친 후에 쿠버네티스의 리소스를 조작합니다. 여러 클러스터를 조합하여 사용하는 것이 당연시되므로 모든 시스템이나 서비스에서 개별적으로 사용자 ID를 관리하는 것이 어려움을 더 증가시키는 것이 쿠버네티스 자체에서 ID를 관리하지 않는 이유입니다. 여러 클러스터를 사용하던 사용자가 회사를 관둔다면 해당 ID를 돌아다니며 삭제하는 절차를 만들어야할 것입니다. 서비스 계정(Serv..
[k8s] Volume - PV/PVC(퍼시스턴트 볼륨과 퍼시스턴트 볼륨 클레임) 쿠버네티스에서 볼륨(Volume)을 사용하는 구조는 PV라고 하는 퍼시스턴트 볼륨(PersistentVolume)과 PVC라고 하는 퍼시스턴트 볼륨 클레임(PersistentVolumeClaim) 2개로 분리되어 있습니다. PV/PVC PV는 볼륨 자체를 뜻합니다. 클러스터 안에서 자원으로 다룹니다. 파드와는 별개로 관리되며 별도의 생명 주기가 있습니다. PVC는 사용자가 PV에 하는 요청입니다. 사용하고 싶은 용량은 얼마인지, 읽기/쓰기는 어떤 모드로 설정하고 싶은지 등을 정해서 요청합니다. 쿠버네티스 볼륨을 파드에 직접 할당하는 방식이 아니라 중간에 PVC를 두어 파드와 파드가 사용할 스토리지를 분리했습니다. 이런 구조는 파드 각각의 상황에 맞게 다양한 스토리지를 사용할 수 있게 합니다. 클라우드 서..
[k8s] kube-porxy가 네트워크를 관리하는 3가지 모드(userspace, iptables, IPVS) kube-proxy는 쿠버네티스에서 서비스를 만들었을 때 Cluster IP나 NodePort로 접근할 수 있게 하는 실제 조작을 하는 컴포넌트입니다. 쿠버네티스 클러스터의 노드마다 실행되면서 클러스터 내부 IP로 연결하려는 요청을 적절한 파드로 전달합니다. kube-proxy가 네트워크를 관리하는 방법은 userspace, iptables, IPVS가 있습니다. 초기에는 userspace가 기본 관리 모드였고, 2019년 12월에는 iptables가 기본 관리 모드 입니다. 앞으로는 iptables에서 IPVS로 기본 관리 모드가 바뀔 것으로 예상됩니다. userspace 모드 클라이언트에서 서비스의 클러스터 IP를 통해 어떤 요청을 하면 iptables를 거쳐서 kube-proxy가 요청을 받습니다...
[k8s] Service - 헤드리스 서비스(Headless Service) 헤드리스 서비스(Headless Service) 쿠버네티스 서비스 생성 시 .spec.clusterIP 필드 값을 None으로 설정하면 클러스터 IP가 없는 서비스를 만들 수 있습니다. 이런 서비스를 '헤드리스 서비스(Headless Service)'라고 합니다. 헤드리스 서비스의 경우 클러스터 IP가 할당되지 않고, kube-proxy가 이렇나 서비스를 처리하지 않으며, 로드 밸런싱 또는 프록시 동작을 수행하지 않습니다. DNS가 자동으로 구성되는 방법은 서비스에 셀렉터가 정의되어 있는지 여부에 달려있습니다. 헤드리스 서비스에 셀렉터(.spec.selector) 필드를 설정하면 쿠버네티스 API로 확인할 수 있는 엔드포인트(endpoint)가 만들어집니다. 서비스와 연결된 파드를 직접 가리키는 DNA ..
[k8s] Service - ExternalName 사용하기 쿠버네티스에서 ExternalName 유형의 서비스는 일반적인 셀렉터에 대한 서비스가 아니라 DNS 이름에 대한 서비스에 매핑합니다. ExternalName 서비스 생성 다음은 ExternalName 타입의 서비스를 설정하는 예시 입니다. 1 2 3 4 5 6 7 8 # externalname.yaml apiVersion: v1 kind: Service metadata: name: externalname1 spec: type: ExternalName externalName: google.com cs 6번 라인에서 .spec.type을 ExternaName으로 지정했으며, .spec.externalName 필드를 google.com으로 설정하였습니다. 연결할려는 외부 도메인 값을 설정한 것입니다. exte..
[k8s] 노드 스케쥴링 - Taints와 Toleratioin(테인트와 톨러레이션) 테인트(Taints)와 톨러레이션(Toleration) 쿠버네티스 클러스터의 특정 노드에 테인트(Taint)를 설정할 수 있습니다. Node Affinity는 Pod가 특정 노드를 선택하게 하는 Pod의 속성이었다면 테인트(Taint)는 반대로 노드가 파드 셋을 제외하도록하는 노드에 설정하는 속성입니다. 기본적으로 테인트를 설정한 노드는 파드들을 스케줄링하지 않습니다. 테인트를 설정한 노드에 파드들을 스케줄링하려면 파드에 톨러레이션(Toleration)을 설정해야 합니다. 그럼 테인트는 톨러레이션에서 설정한 특정 파드들만 실행하고 다른 파드는 실행하지 못하게 합니다. 테인트와 톨러레이션은 주로 노드를 특정 역할만 하도록 만들 때 사용합니다. 예를 들어 데이터베이스용 파드를 실행한 후 노드 전체의 CPU나..
[k8s] 파드 스케줄링 - Inter-Pod Affinity, Anti-Affinity(파드 어피니티와 안티 어피니티) Inter-Pod Affinity, Anti-Affinity Affinity(Inter-Pod Affinity)와 Anti-Affinity는 Deployment나 StatefulSet으로 파드를 배포했을 때 개별 파드 사이의 관계를 정의하는 용도로 사용합니다. Inter-Pod Affinity Node Affinity가 node의 label을 기준으로 Pod가 배포될 node를 선택한다면, Inter-Pod Affinity 는 기존에 배포된 Pod를 기준으로 배포될 node를 결정합니다. 서비스 A의 파드와 서비스의 B의 파드가 자주 통신한다고 했을 때, Affinity는 이런 상황에서 서비스 A와 서비스 B의 파드들을 같은 노드에 속하게 만들어 효율을 높입니다. 예를 들어 데이터베이스나 캐시 같은 서비..
[k8s] 파드 스케쥴링 - Node Affinity(노드 어피니티) Node Affinity 노드 어피니티(Node Affinity)는 노드 셀렉터와 비슷하게 노드의 레이블을 기반으로 파드를 스케쥴링합니다. 노드 어피니티와 노드셀렉터를 함께 설정할 수도 있으며, 이 때는 노드 어피니티와 노드셀렉터의 조건을 모두 만족하는 노드에 파드를 스케쥴링합니다. 참고로 Affinity는 한국어로 다음과 같은 의미를 가집니다. 1.친밀감 (=rapport) 2.(밀접한) 관련성, 친연성 노드 어피니티에는 두 가지 필드가 있습니다. requiredDuringSchedulingIgnoredDuringExecution : '스케쥴링하는 동안 꼭 필요한' 조건 preferredDuringSchedulingIgnoredDuringExecution : '스케쥴링하는 동안 만족하면 좋은' 조건입니..