반응형
Deployment
Kubernetes Deployment Docs.
- 디플로이먼트는 파드와 레플리카셋에 대한 업데이트를 선언하는 영역
apiVersion: apps/v1
kind: Deployment
metadata:
name: haenny-deploy
labels:
app: haenny-deploy
spec:
replicas: 2
revisionHistoryLimit: 3 # 유지할 ReplicaSet의 최대 개수 설정
selector:
matchLabels:
app: haenny
template:
metadata:
labels:
app: haenny
spec:
containers:
- name: haenny
image: openjdk11
command:
- /java/openjdk/bin/java
- '-jar'
- /haenny.jar
ports:
- containerPort: 80
- apiVersion : 해당 deployment 를 생성하기 위해 사용하고 있는 K8S API 버전 정의
- kind : K8S 에 다양한 오브젝트가 존재하는데, 그 중 하나가 deployment
- metadata : deployment 설정 - 오브젝트를 유일하게 구분해줄 데이터
- metadata.name : 생성할 deployment 이름 설정
- metadata.label : deployment 레이블 설정
- spec : 오브젝트 상태 정의
- spec.replicas : pod 의 개수를 몇 개 유지할 지 설정, 기본 값 = 1
- spec.selector : 이 deployment 가 관리할 파드를 찾는 방법 정의., 이 필드가 없을 경우 spec.template.metadata.labels 에 설정된 내용들을 기본 값으로 설정
- spec.template.metadata : 어떤 파드를 실행할 지 정의하는 곳
- spec.template.metadata.name : 생성될 파드 이름 지정
- spec.template.metadata.labels : 파드에 레이블 설정
- spec : 컨테이너에 대한 설정 지정 - 컨테이너 명, 포트 등
- spec.containers.ports.containerPort : 컨테이너가 사용하는 포트 지정
- 컨테이너와 통신하기 위해 service.yaml 설정도 필요
- service.yaml 에 targetPort 와 containerPort 가 같지 않다면, 서비스는 해당 컨테이너로 트래픽을 전달할 수 없음
Service
Kubernetes Service Docs.
- 파드셋에서 실행중인 애플리케이션을 네트워크 서비스로 노출시키는 방법
- 파드는 클러스터 상태와 일치하도록 생성 및 삭제됨으로 각 파드가 고유한 IP를 가지지만, Deployment 를 통해 앱을 실행하면 특정 시점에서 실행된 파드 셋이 잠시 후 실행되는 해당 파드 셋과 다를 수 있어 K8S 서비스가 파드에 접근할 수 있도록 정책을 정의
- 실제 파드가 변경되더라도 Front-end Client 는 이를 인식할 필요가 없도록 해줌
apiVersion: v1
kind: Service
metadata:
name: haenny-service
spec:
selector:
app: haenny
ports:
- protocol: TCP
port: 80
targetPort: 8080
- metadata.name : 생성할 서비스 이름 지정
- spec.selector : 셀렉터와 일치하는 파드를 지속적으로 검색하고, 해당 이름을 가지는 endpoint object 에 대한 모든 업데이트를 POST 함
서비스의 유형
- ClusterIP (Default - type 을 별도로 지정하지 않은 경우 기본 값)
: pod 들이 클러스터 내부의 다른 리소스들과 통신할 수 있도록 해주는 가상 클러스터 전용 IP로, ClusterIP로 들어온 클러스터 내부 트래픽을 해당 파드의 <PodIP>:<targetPort> 로 넘겨주도록 동작하므로 클러스터 내부에서만 접근 가능하다. - NodePort
: 외부에서 노드 IP의 특정 포트 ( <NodeIP>:<NodePort> ) 로 들어오는 요청을 감지해, 해당 포트와 연결된 파드로 트래픽을 전달하는 서비스다. 이 때 클러스터 내부로 들어온 트래픽을 특정 파드로 연결하기 위한 ClusterIP 역시 자동으로 생성된다. - LoadBalancer
: 클러스터의 서비스로 프로비저닝할 수 있는 로드밸런서 유형도 제공된다 - ExternalName
: 서비스에 selector 대신 DNS name을 직접 명시하고자 할 때 쓰인다
Ingress
Kubernetes Ingress Docs.
- 클러스터 외부에서 클러스터 내부 서비스로 HTTP, HTTPS 경로를 노출
- 인그레스 리소스에 정의된 규칙에 의해 트래픽 라우팅을 컨트롤
Ingress Controller
Kubernetes Ingree Controller Docs.
- 인그레스 컨트롤러가 외부로부터 네트워크 요청을 수신하면, 인그레스 규칙에 따라 요청을 처리할 지 결정
- Kubernetes - AWS, GCE, Nginx 인그레스 컨트롤러를 지원
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dev-ingress-path
namespace: dev
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /haenny(/|$)(.*)
pathType: Prefix
backend:
service:
name: haenny-service
port:
number: 80
- metadata.annotations : nginx.ingress.kubernetes.io/rewrite-target: /$2 는 regex 의 두번째 그룹으로 요청 전송한다
- e.g.) /a/b 호출 > /b, /a/b/c 호출 > /b/c
쿠버네티스(K8S)를 통해 애플리케이션 배포하기 위해서는, 세 가지 영역을 설정에 대해 알아보았다.
- Deployment - 클러스터 desired state 기술
- Service - 네트워크 서비스로 노출
- Ingress - 클러스터 외부에서 클러스터 내부 서비스로 접근
728x90
반응형
'Infra > Open Source' 카테고리의 다른 글
[Docker] 도커 컨테이너 (python app) 구동하기 (0) | 2024.04.14 |
---|---|
[Docker] Mysql 설치하기 (0) | 2024.04.14 |
[K8S] 파드 CreateContainerError 오류 해결 (0) | 2024.01.30 |
[Kubernetes] 윈도우 환경 kubectl 설치 및 설정하기 (0) | 2024.01.18 |
[Docker] Windows10 Docker 설치하기 (0) | 2024.01.16 |
댓글