전체 글
[Kubernetes] k8s Volume : emptyDir, initContainer, hostPath
📌Index 볼륨(Volume) 개요 emptyDir initContainer(초기화 컨테이너) hostPath ✔️ 볼륨(Volume) 개요 컨테이너 내의 디스크에 있는 파일 및 데이터들은 임시적이며, 컨테이너(파드)를 지워버리면 기본적으로 데이터들은 모두 사라지게된다. 따라서 별도의 라이프사이클을 가지고 있는 오브젝트(리소스)가 필요하고, 이를 위해 사용하는 것이 바로 볼륨(Volume)이다. 파드에 볼륨을 제공하게되면, 파드에 있는 모든 컨테이너는 해당 볼륨을 사용가능하다. spec.volumes.*: 볼륨 유형 볼륨의 유형에 따라 Field는 모두 다르다. $ kubectl explain pod.spec.volumes spec.containers.volumeMounts readOnly지정이 가능하..
[Kubernetes] k8s 프로브(Probe) : Readiness Probe
Probe란, 컨테이너에서 Kubelet에 의해 주기적으로 수행되는 진단이다. 프로브에 대한 더 자세한 설명은 Pod Lifecycle에서 확인할 수 있다. ✔️ readinessProbe 컨테이너가 요청을 처리할 준비가 되었는지 여부를 나타낸다. Service와 연결된 Pod를 확인하여 Readiness Probe에 대해 응답이 없거나 실패 응답을 보낸다면, 해당 Pod를 사용불가능한 상태라고 판단하여 서비스 목록에서 제외한다. (서비스들의 엔드포인트에서 파드의 IP주소를 제거) 만약 컨테이너가 readinessProbe를 지원하지 않는다면(설정하지 않는다면), 기본 상태는 Success 이다. 따라서 readinessProbe 설정을 하지 않는다면, 정상적으로 작동중이지 않은 파드로도 요청(Query..
[Kubernetes] k8s Ingress란? (feat. 도메인 없이 테스트하기)
✔️ Ingress란? 인그레스(Ingress) | Kubernetes : 상당히 오랜 기간 동안 beta 버전이었다가, 비교적 최근에 stable 버전이 되었다. 인그레스(ingress)란, 클러스터 외부에서 내부 서비스로 접근하는 HTTP, HTTPS (L7) 요청들의 처리 방법을 정의해둔 규칙들의 모음으로, 클러스터 외부에서 클러스터 내부 서비스로 HTTP와 HTTPS 경로를 노출한다. 클러스터 외부에서 접근 가능한 URL을 사용할 수 있게 하며, 트래픽의 로드밸런싱, SSL 인증서의 처리, 도메인 기반의 가상 호스팅을 제공하기도 한다. 인그레스는 임의의 포트 또는 프로토콜을 노출시키지 않으며, HTTP와 HTTPS 이외의 서비스를 인터넷에 노출하려면 일반적으로 Service.Type=NodePor..
[Kubernetes] Service : ExternalName
✔️ Service : ExternalName 타입 ExternalName 타입은 외부에서 접근하기 위한 종류가 아니라, 내부 파드가 외부의 특정 FQDN에 쉽게 접근하기 위한 서비스이다. k8s cluster의 coredns 서비스가 특정 FQDN에 대한 CNAME(서비스의 FQDN)을 제공함에 따라 해당 CNAME을 이용하여 쉽게 통신할 수 있다. 즉, 클러스터 내부에서 클러스터 외부의 특정 서비스에 접속하기 위해 DNS CNAME을 설정하는 것이다. 접속하기 위한 외부 FQDN 주소가 바뀌더라도, CNAME은 그대로 유지할 수 있어 애플리케이션을 다시 작성하거나 빌드하지 않아도 된다. CNAME : 도메인 별명(별칭) externalName svc.spec.externalName ExternalNa..
[Kubernetes] Service : Load Balancer
✔️ Service : LoadBalaner 타입 LoadBalancer 타입은 Nodeport 타입의 확장판이라고 할 수 있으며, 서비스를 외부에 노출 시킬 수 있다. LoadBalaner 타입을 사용하는 경우, ClusteIP와 NodePort기반의 구성이 되는데 즉, LoadBalancer = ClusterIP + NodePort + LoadBalancer 라고 할 수 있다. NodePort타입 앞단에 Loadbalancer가 붙어서 살아있는 노드를 체크하여 트래픽을 전달 할 수 있는 장점이 있다. 💻실습 myweb-svc-lb.yaml apiVersion: v1 kind: Service metadata: name: myweb-svc-lb spec: type: LoadBalancer selector..
[Kubernetes] Service : NodePort
✔️ Service : NodePort 타입 NodePort는 모든 워커 노드들의 특정 포트(port)를 이용하여 접근하도록 설정하는 타입으로, 클러스터 외부에서 접근하는 포인트라고 할 수 있다. NodePort 타입을 사용해도, 기본적으로 ClusterIP기반의 구성이 되는데, 즉 NodePort = NodePort + ClusterIP 라고 할 수 있다. NodePort의 단점은 노드가 사라졌을때 자동으로 다른노드를 통해 접근이 불가능하다는 것이다. 따라서 자동으로 다른 노드에 접근을 하려면 별도의 Loadbalancer가 필요하다. NodePort를 사용하면 포트당 하나의 서비스를 사용하며, 30000-32767범위 내의 포트를 사용 가능하다. 이는 다음과 같이 kube-apiserver.yaml ..
[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 (레거시 리..