Kubernetes 141

Volumes

도커 - 볼륨 도커 컨테이너는 본질적으로 일시적 데이터 처리가 필요할 때 요청하여, 처리를 완료한 뒤에는 삭제된다. 컨테이너 내의 데이터도 컨테이너와 함께 삭제되기 때문에, 데이터를 유지하기 위해서는 volume을 설정해주어야 한다. 볼륨을 설정하면 컨테이너에서 처리한 데이터가 볼륨에 저장 => 컨테이너 삭제 후에도 데이터 유지 가능 쿠버네티스 - 볼륨 쿠버네티스 포드도 도커 컨테이너와 마찬가지로 일시적이다. 포드가 생성되면 데이터를 처리한 뒤에 삭제되며, 이때 처리한 데이터도 함께 삭제된다. 포드에 볼륨을 설정하면 포드에서 생성한 데이터는 볼륨에 저장 => 포드가 삭제된 이후에도 데이터 유지 가능 구성 방법 볼륨 구성 방법 중 하나는 호스트의 디렉터리를 사용하도록 구성(hostPath)하는 것이다. 이..

Developing Network Policy

들어오는 트래픽을 허용하면, 허용된 트래픽에 대한 응답을 자동으로 허용하기 때문에 요청이 발생하는 방향만 고려하면 된다. 또한 Network Policy는 ingress, egress 규칙을 모두 가질 수 있다. 여러 경우 클러스터 내에 label은 같지만 namespace가 다른 포드가 여러 개 있는 경우 -> 모든 namespace에서 label이 일치하는 모든 포드의 연결이 허용된다. 특정 namespace의 포드만 허용하고 싶은 경우 -> namespaceSelector를 사용한다. podSelector가 없는 대신 namespaceSelector만 있는 경우 -> 설정된 namespace 내의 모든 포드와의 연결을 허용하며, 그 외의 포드는 허용하지 않는다. 클러스터 외부에서 포드에 연결하고 싶..

Network Policy

Ingress 서버 입장에서, 들어오는 트래픽 Egress 서버 입장에서, 보내는 트래픽 트래픽이 발생한 방향을 따져서 ingress와 egress를 정의하며, ingress와 egress를 정의하기 위해서는 트래픽 규칙이 필요하다. All allow 모든 포드에서 다른 포르 또는 서비스로 트래픽을 허용하는 규칙 쿠버네티스가 기본적으로 구성하는 규칙으로, 쿠버네티스는 어떤 솔루션을 구현하든 추가 설정 없이 포드 간에 통신이 가능해야 함을 전제한다. Network Policy 쿠버네티스의 개체 중 하나로, 하나 이상의 포드에 연결하여 policy 내에 트래픽 규칙을 정의할 수 있다. Network Policy를 생성하여 포드에 적용하면, 적용된 포드에서는 규칙에 해당하는 트래픽만 혀용하고 다른 트래픽은 차..

Ingress Networking

쿠버네티스 서비스 세 가지 유형 중 로드밸런서 유형은 온프레미스에서의 NodePort 유형의 서비스의 역할을 클라우드 환경에서 대체한다. 다른 애플리케이션 두 개가 클러스터 리소스를 공유할 수 있도록 하기 위해서는 같은 클러스터 내에 별도 Deployment로 배포해야 하는데, 이때 로드밸런서 유형의 서비스는 로드밸런서를 프로비저닝 하기 때문에 클라우드 비용도 증가할 수 있다. 로드밸런서 간의 트래픽을 URL 기반으로 전달하기 위해서는, URL 기반 트래픽을 다른 서비스로 리다이렉션 할 수 있는 프록시 또는 로드밸런서가 필요하다. 새 쿠버네티스 서비스를 구성할 때마다 로드밸런서를 재구성해야 한다. 때문에 구성이 다양해진 상황에서는 애플리케이션 확장 시 관리가 어려울 수 있고, 각 서비스마다 새 클라우드 ..

Services - ClusterIP

모든 포드에는 IP 주소가 할당되어 있으나, 각 포드는 언제든지 종료되고 새로 생성될 수 있기 때문에 이러한 IP 주소는 정적이지 않다. 따라서 IP 주소를 이용해서 내부 통신을 하는 것을 어렵다. 이러한 문제를 해결하기 위해 쿠버네티스 서비스는 포드를 그룹화하고 그룹 내의 포드에 접근할 수 있는 단일 인터페이스를 제공한다. 서비스는 들어온 요청을 그룹 내의 포드 중 하나에 임의로 전달하게 된다. 이 유형의 서비스를 ClusterIP 서비스라고 하며, 서비스는 클러스터 내에서 IP와 다른 포드가 서비스 접근에 사용하는 이름이 할당된다. ClusterIP 서비스 개념에 의해 프런트엔드, 백엔드 등의 각 계층은 서비스 간의 통신에 영향받고 영향을 미치지 않고 필요에 따라 확장하거나 이동할 수 있다. 또한 마..

Services

Services Pod 집합에서 실행 중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법 쿠버네티스 개체 중 하나로 애플리케이션 내부와 외부의 구성 요소 간의 통신을 가능하게 하며, 애플리케이션을 다른 애플리케이션 또는 사용자와 연결하는 데 사용한다. 포드 그룹 간의 연결을 가능하게 하며, 애플리케이션에서 마이크로서비스 간의 느슨한 연결을 생성한다. 타입 NodePort 노드의 특정 포트에 들어온 요청을 수신하여, 노드의 포드로 전달한다. 노드의 포트에서 노드 내의 포드에 접근할 수 있도록 노드의 포트를 포드의 포트에 매핑한다. - targetPort : 요청을 전달할 포드의 포트 - port : 서비스 자체의 포트 - nodePort : 노드 자체에서 외부와 통신하는 데 사용하는 포트로, 300..

CronJobs

CronJobs 크론 형식으로 쓰인 반복 일정에 따라 Job을 주기적으로 생성하고 동작시킨다. Linux의 crontab과 유사하게 생각할 수 있다. Job은 생성하면 즉시 실행되지만, CronJob은 생성 시 주기적으로 스케쥴링하여 실행할 수 있다. 생성 방법 yaml 형식의 정의 파일을 작성한 후 create 명령을 이용해 생성한다. apiVersion: batch/v1beta1 kind: CronJob metadata: name: reporting-cron-job spec: # cronjob spec schedule: "*/1 * * * *" jobTemplete: spec: # job spec completions: 3 parallelism: 3 template: spec: # pod spec c..

Job

컨테이너가 제공할 수 있는 워크로드는 다양하다. 웹, 애플리케이션, 데이터베이스와 같이 수동으로 종료할 때까지 장시간 수행하는 종류부터 계산, 이미지 처리, 대규모 데이터 분석, 리포트 생성, 메일 발송 등 특정 작업을 수행한 후 완료해야 하는, 짧은 시간 동안 수행하는 종류 등이 존재한다. 아래와 같이 간단한 계산을 수행하는 컨테이너를 도커로 실행하면, 컨테이너는 실행을 완료하고 종료된다. docker ps ubuntu expr 3 + 2 반면 동일한 기능을 하는 컨테이너를 쿠버네티스 포드에 생성하여 실행하면, 작업을 수행한 뒤 포드가 완료되고 다시 포드를 생성하여 작업을 수행한다. 쿠버네티스는 기본적으로 컨테이너 실행 상태를 유지하는 방향으로 설정된 restartPolicy 값을 참조하여 임계치에 도..

Rolling Updates & Rollbacks in Deployments

Deployment Strategy Recreate strategy 애플리케이션 인스턴스의 기존 버전을 모두 삭제한 뒤, 새로운 버전의 애플리케이션 인스턴스를 생성하여 배포하는 방식 기존 버전을 중단한 후, 새로운 버전이 동작하기 전까지 애플리케이션의 서비스 중단이 발생한다. Rolling Updates 서버를 실제로 서비스할 때 서비스적인 장애와 배포에 있어서 부담감을 최소화하고, 서비스가 중단되지 않도록 배포하는 무중단 배포 방법 중 하나 새 버전을 배포하면서, 새 버전 인스턴스를 하나씩 늘려가고 기존 버전의 인스턴스를 하나식 줄여나가는 방식 새 버전의 인스턴스로 트래픽이 이전되기 전까지 이전 버전과 새 버전의 인스턴스가 동시에 존재할 수 있다는 단점이 있지만, 시스템을 무중단으로 업데이트할 수 있다..

Labels, Selectors and Annotation

Labels & Selectors Labels 각 항목에 붙은 속성 Selectors 항목을 필터링하는 데 사용한다. 레이블과 셀렉터는 항목을 그룹화하는 표준 방법이다. 유튜브 동영상이나 블로그 포스트에 붙인 태그처럼 클래스, 유형, 그룹 등의 기준으로 레이블을 붙이면 기준에 따라 필터링할 수 있다. 쿠버네티스에는 수많은 개체가 있을 수 있기 때문에 유형, 애플리케이션, 기능 등의 다양한 범주를 기준으로 필터링하여 볼 수 있는 방법이 필요하다. 레이블 지정 방법 일반적으로 정의 파일에 지정할 수 있다. apiVersion: v1 kind: Pod metadata: name: simple-webapp labels: app: App1 function: Front-end spec: containers: - n..