🧩 DevOps

    [kubernetes] Service Discovery란? (feat.nodelocal DNS)

    Auto-scaling, 업그레이드, 확장 등의 이유로 생성, 소멸되면서 서비스의 IP가 동적으로 변경되는 일이 많다. 그러나 클라이언트 애플리케이션은 이러한 변경 사항을 알기 어렵다. Auto-scaling이 되어 서버가 하나 더 생성되었더라도 이를 알아차리고 생성된 서버에 트래픽을 분산시키기 어렵다는 뜻이다. 이런 상황에서 클라이언트가 서비스의 Location(IP주소와 포트)을 알아내려면 어떻게 해야할까? 바로 이런 역할을 Service Discovery가 해준다. 애플리케이션이 해당되는 서비스를 찾아내는 것을 Service Discovery(SD)라고 한다. 랜덤한 IP에 대응하기 위해, k8s는 파드 앞에 서비스를 만들고, 레이블과 셀렉터를 사용하여 서비스의 백엔드로 연결시킨다. 그러나, 서비스..

    [Kubernetes] Service - ClusterIP : SessionAffinity, NamedPort, MultiPort

    ✔️ Service : ClusterIP 타입 서비스에 의해 할당되는 IP 주소에는 Cluster IP와 External IP가 있다. Cluster IP는 클러스터 안의 Pod끼리 통신하기 위한 Private IP이며, External IP는 클러스터 외부에 공개하는 IP 주소이다. ClusterIP는 클러스터 내부에 새로운 IP를 할당하고 여러 개의 Pod을 바라보는 로드밸런서 기능을 제공한다. 그리고 서비스 이름을 내부 도메인 서버에 등록하여 Pod 간에 서비스 이름으로 통신할 수 있다. 클러스터 내부에서만 접근할 수 있으며, 외부에서 접근이 불가능하므로 Port Forwarding이나 Proxy를 통해 접근해야한다. 서비스 타입을 별도로 지정하지 않으면 ClusterIP가 Default로 설정된다..

    [Kubernetes] Services와 DNS

    서비스는 파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법이다. 서비스를 이용하여 고유한 IP주소, DNS이름을 부여하여 접근할 수 있다. 또한 서비스는 기본적으로 로드밸런서의 기능을 가지고 있기 때문에 트래픽을 분산해서 접근이 가능하게한다. 클라이언트 입장에서 어느 애플리케이션에 찾아가야할지 알 수 없기 때문에 서비스 리소스를 사용한다. 서비스 리소스에는 셀렉터가 있고, 파드는 레이블을 가지고 있어서 서비스와 파드들이 연결된다. 또한 서비스에는 DNS이름이 부여되는데, 이러한 이름이 부여되기 위해서는 kube-dns구성이 되어있어야한다. kubeadm에 의해 kube-dns는 무조건 설치되며, coredns를 dns서버로 사용한다. 참고로 kube-dns는 클러스터 내부에서 ..

    [kubernetes] Controller: Jobs와 CronJobs

    잡 | Kubernetes ReplicaSets, ReplicaController, DaemonSets 등은 데몬 형태의 계속적으로 실행되어야하는 애플리케이션들을 실행하는 것이 목적이다. 반면에 job에서는 하나 이상의 파드를 생성하고 지정된 수의 파드가 성공적으로 종료될 때까지 계속해서 파드의 실행을 재시도한다. 시작이 있으면 반드시 끝이 있는 애플리케이션이며, 애플리케이션의 종료를 보장한다. 지정된 수의 성공 완료에 도달하면, 작업(job)이 완료되고, 잡을 삭제하면 잡이 생성한 파드가 정리된다 cronjobs와 jobs는 batch 그룹에 속해있는 것을 확인할 수 있다. $ kubectl api-resources | grep batch cronjobs cj batch/v1 true CronJob j..

    [kubernetes] Controller: DaemonSets

    데몬셋은 모든 노드의 파드를 실행하도록 하며, daemonset(DS)은 일반적으로 systemctl에서 제어하는 모는 것을 의미한다. (스케쥴러를 조정하면, 일부로 조절 가능하긴하다) 데몬셋는 반드시 하나의 노드에 파드 하나씩 존재하기 때문에, 각각의 노드에 분산되는 것을 보장한다. 따라서 노드가 클러스터에 추가되면 파드도 추가되고, 노드가 클러스터에서 제거되면 가비지(garbage)로 수집된다. 반면에, 예로 ReplicaSets은 각각의 노드에 배치되는 것이 가장 고가용성을 구축하는 방법임에도, sched 스케쥴러에 의해 제어되기 때문에 노드에 분산되는 것을 보장할 수 없으며, 어느 노드에 파드가 배치될지 알 수 없다. 데몬셋의 대표적인 용도는 다음과 같다. 모든 노드에서 클러스터 스토리지 데몬 실..

    [Kubernetes] Controller : ReplicationController와 ReplicaSets

    워크로드 | Kubernetes 워크로드 리소스는 Controller이고, Controller는 Pod의 집합이다. 파드만을 직접 만드는 경우(싱글톤 파드)는 거의 없고, 대부분은 Controller를 만들고, Controller가 Pod를 만들고, Pod가 Container를 만든다. 쿠버네티스는 다음과 같이 여러 가지 빌트인(built-in) 워크로드 리소스를 제공한다. Workload - Pod - Controller - ReplicationController - ReplicaSets - DaemonSets - Jobs - CronJobs - Deployments - StatefulSets - HorizontalPodAutoscaler(HPA) Deployment 및 ReplicaSet (레거시 리..

    [Kubernetes] Pod Lifecycle

    pod-lifecycle ✔️ 파드의 상태 파드의 상태는 컨테이너의 상태를 반영한다. 쿠버네티스는 다양한 컨테이너 상태를 추적하고 파드를 다시 정상 상태로 만들기 위해 취할 조치를 결정하며, 파드의 status 필드는 phase 필드를 포함하는 PodStatus 오브젝트로 정의된다. phase에 가능한 값은 다음과 같다. 값 의미 Pending 파드가 쿠버네티스 클러스터에서 승인되었지만, 하나 이상의 컨테이너가 설정되지 않았고 실행할 준비가 되지 않았다. 여기에는 파드가 스케줄되기 이전까지의 시간 뿐만 아니라 네트워크를 통한 컨테이너 이미지 다운로드 시간도 포함된다. (이미지 사이즈가 크면 pending 상태가 조금 더 지속된다) - 스케쥴링되기 전, 이미지 받기 전, 컨테이너가 준비 되기 전 Runni..

    [Kubernetes] k8s Label, LabelSelector, Annotations

    📌Index Label LabelSelector Annotations ✔️ Label Labels Label은 AWS의 TAG와 비슷하여, Label은 리소스에 하나 이상 설정할 수 있고, 중복될 수 있다. Label은 오브젝트의 특성을 식별하는 데 사용한다. metadata의 키를 사용하며, 키는 중복이 가능하다. 권장 레이블 : 권장일 뿐 must는 아니다. 일반적으로 애플리케이션 이름, 버전, 도구, 만든 사용자 등을 붙여준다. 유효한 레이블 조건 63 자 이하(공백일 수도 있음) (공백이 아니라면) 시작과 끝은 알파벳과 숫자([a-z0-9A-Z]) 알파벳과 숫자, 대시(-), 밑줄(_), 점(.)을 중간에 포함 가능 참고로 kubernetes.io/와 k8s.io/ 접두사는 쿠버네티스의 핵심 컴포..

    [Kubernetes] k8s Namespace (feat. 이름과 UID)

    ✔️ 이름과 UID 오브젝트 이름과 ID | Kubernetes 클러스터의 각 오브젝트는 해당 유형의 리소스에 대하여 고유한 이름을 가지고 있다. 이름은 Namespace 내에서 유일하면 된다. Namespace는 분리하기 위한 용도와, DNS이름이 분리되는 용도를 위해 사용한다. 기본적으로는 default Namespace를 사용한다. 오브젝트를 리소스로 만들 때 쿠버네티스의 컨트롤러 매니저는 해당되는 리소스에 UID를 붙이게 되고, 모든 쿠버네티스 오브젝트는 전체 클러스터에 걸쳐 고유한 UID를 가지고 있다. ✔️ Namespace namespace란, 쿠버네티스 클러스터 내의 논리적인 분리 단위이다. 다음과 같이 리소스를 분리할 수 있다. 리소스 분리 서비스 별 사용자 별 환경: 개발, 스테이징, ..

    [Kubernetes] k8s Workload : Pod

    📌Index 파드(Pod)란? Pod 생성 및 관리 YAML 파일로 파드 정의 Pod 디자인 Pod 포트 포워딩 ✔️ 파드(Pod)란? 워크로드는 쿠버네티스에서 구동되는 애플리케이션이다. 워크로드가 단일 컴포넌트이거나 함께 작동하는 여러 컴포넌트이든 관계없이, 쿠버네티스에서는 워크로드를 일련의 파드 집합 내에서 실행한다. Pod는 하나 이상의 컨테이너 그룹으로, 컨테이너를 실행하기 위한 오브젝트이다. 쿠버네티스에서 관리할 수 있는 가장 작은 Workload는 Pod이다. 즉, 쿠버네티스는 컨테이너를 직접 컨트롤하지 않고, 파드만 관리할 수 있다 참고로 하나의 파드는 하나의 호스트에만 배치되고, 하나의 노드에 배치된다. 파드의 사용 단일 컨테이너를 실행하는 파드 파드가 하나의 컨테이너만 포함하는 경우이다...

    [Kubernetes] k8s 오브젝트(Objects)

    📌Index 쿠버네티스 오브젝트란? 오브젝트의 버전 오브젝트의 정의 오브젝트 관리 ✔️ 쿠버네티스 오브젝트란? 출처: https://dev.to/chrisedrego/kubernetes-monitoring-kube-state-metrics-2bbi 쿠버네티스 오브젝트 이해하기 | Kubernetes 레퍼런스 | Kubernetes 쿠버네티스 오브젝트란 클러스터 내부의 엔티티로서, 이후 설명할 파드, 컨트롤러, 서비스 등의 인스턴스를 의미한다. 각각의 오브젝트는 쿠버네티스 API의 리소스 종류에 맞게 설정되고 생성된다. 쿠버네티스 오브젝트는 쿠버네티스 시스템에서 영속성을 가지는 오브젝트로, 오브젝트는 지정된 상태가 유지되도록 쿠버네티스에 의해 제어된다. 쿠버네티스에서 사용 가능한 오브젝트 리스트 $ kub..

    [Kubernetes] Kubespray로 쿠버네티스 설치하기

    Kubespray로 쿠버네티스 설치하기 | Kubernetes Readme (kubespray.io) https://github.com/kubernetes-sigs/kubespray kubeadm 방식은 k8s를 구성할때 수동으로 구성 모듈을 하나 하나 설치한다는 어려움이 있으나, 전체적인 구성요소를 이해하는데 장점이 있고, kubespray는 설치가 매우 간단하다는 장점이 있다. Kubespray는 ansible 기반의 배포툴(Kubeadm + Ansible)로, 클러스터의 구성은 아래의 그림과 유사하다. https://initmanfs.eu/ Requirements Ansible의 명령어를 실행하기 위해 Ansible v 2.9와 Python netaddr 라이브러리가 머신에 설치되어 있어야 한다 A..

728x90