본문 바로가기

쿠버네티스

(15)
[k8s] Kubernetes 명령어 비교: kubectl apply vs kubectl create Kubernetes에서 자원을 관리하고 배포하는 데는 다양한 명령어가 사용됩니다. 이 글에서는 Kubernetes의 핵심 명령어인 kubectl apply와 kubectl create의 차이점을 살펴보고, 언제 어느 명령어를 사용해야 하는지를 알아보겠습니다. kubectl apply의 특징 및 사용법 kubectl apply 명령어는 Kubernetes 리소스의 구성을 선언적으로 관리하는 데 사용됩니다. 이 명령어는 리소스의 현재 상태를 JSON 또는 YAML 파일 형식으로 지정된 원하는 상태와 비교하여, 필요한 변경사항을 적용합니다. 주요 특징 변경사항만 적용: 기존 리소스의 설정을 수정하거나 추가할 때 유용합니다. 선언적 업데이트: 리소스의 전체 정의를 제공하고 Kubernetes가 필요한 변경을 파..
[k8s] 쿠버네티스의 Autoscaler (HPA, VPA, CA 개념) HPA(Horizontal Pod Autoscaler) Horizontal Pod Autoscaler는 파드의 리소스를 감시하여, 리소스가 부족한 경우 Controller의 replicas를 증가시켜, 파드의 수를 늘리도록 합니다. 위의 그림 처럼 Pod가 수평적으로 증가하는 것을 Scale Out, 수평적으로 감소하는 것을 Scale In 이라고 합니다. 파드가 증가하였기 때문에 기존의 트래픽이 분산되어 서비스를 더 안정적으로 유지할 수 있게 합니다. HPA는 다음과 같은 경우에 사용이 권장됩니다. - 기동이 빠르게 되는 App 파드의 장애가 났을 때 대응하기 위한 용도로 사용되기 때문에 파드의 생성이 빠르게 되어야 합니다. 따라서 기동이 빠르게 되는 애플리케이션에 더 적합합니다. - Stateless..
[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] 파드 스케쥴링 - Node Affinity(노드 어피니티) Node Affinity 노드 어피니티(Node Affinity)는 노드 셀렉터와 비슷하게 노드의 레이블을 기반으로 파드를 스케쥴링합니다. 노드 어피니티와 노드셀렉터를 함께 설정할 수도 있으며, 이 때는 노드 어피니티와 노드셀렉터의 조건을 모두 만족하는 노드에 파드를 스케쥴링합니다. 참고로 Affinity는 한국어로 다음과 같은 의미를 가집니다. 1.친밀감 (=rapport) 2.(밀접한) 관련성, 친연성 노드 어피니티에는 두 가지 필드가 있습니다. requiredDuringSchedulingIgnoredDuringExecution : '스케쥴링하는 동안 꼭 필요한' 조건 preferredDuringSchedulingIgnoredDuringExecution : '스케쥴링하는 동안 만족하면 좋은' 조건입니..
[k8s] Pod LifeCycle(파드의 생명 주기) Pod LifeCycle 파드는 생성부터 삭제까지의 과정에 생명 주기(LiefCycle)이 있습니다. 파드의 생명 주기는 다음과 같습니다. 파드의 Status 값 설명 Pending 파드의 작성을 기다리고 있는 상태, 컨테이너 이미지의 다운로드 등에 시간이 걸리는 경우가 있습니다. Running 파드가 가동 중인 상태 Succeeded 파드 안의 컨테이너가 정상적으로 종료된 상태 Failed 파드 안의 컨테이너 중 하나의 컨테이너가 실패하여 종료된 상태 Unknown 어떤 이유로 파드와 통신할 수 없는 상태 파드는 Pending 단계에서 시작해서, 기본 컨테이너 중 적어도 하나 이상이 OK로 시작하게 되면 Running 단계를 통과하고, 그런 다음 파드의 컨테이너가 실패로 종료되었는지 여부에 따라 Suc..
[k8s] Job/CronJob Job/CronJob은 웹 서버와 같은 상주 서비스가 아니라 집계 등과 같은 배치 처리 또는 기계학습이나 수치해석과 같은 프로그램의 시작부터 종료까지로 완료되는 작업을 실행하기 위한 리소스입니다. Job(잡) 잡은 실행된 후 종료해야 하는 성격의 작업을 실행시킬 때 사용하는 컨트롤러입니다. 특정 개수만큼의 파드를 정상적으로 실행 종료함을 보장합니다. 예를 들어 데이터베이스 마이그레이션과 같이 한 번의 잡으로 처리가 끝나는 것에 이용합니다. 잡에서 하나 이상의 파드를 생성하고 지정된 수의 파드가 성공적으로 종료될 때 까지 계속해서 파드의 실행을 재시도합니다. 지정된 수 만큼 파드가 성공적으로 완료되면, 작업(즉, 잡)이 완료됩니다. 잡을 삭제하게되면 생성한 파드가 정리되며, 일시 중지하게 되면 작업이 다시..