1.Deployment
-정의: Replicaset 을 관리하는 controller
-역할: 애플리케이션의 상태를 원하는 대로 설정하고 관리하는 방법.
<예시> nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
- apiVersion
- 리소스의 API 그룹과 버전을 지정합니다. 각 Kubernetes 리소스는 특정 API 그룹에 속해 있으며, apiVersion은 이 그룹과 버전을 명시합니다.
- kind
- YAML 파일에서 정의하려는 리소스의 종류를 나타냅니다.
- 예: Deployment, Service, Pod 등이 있습니다.
- metadata
- 리소스에 대한 메타데이터를 포함합니다. 이 필드는 모든 Kubernetes 리소스에서 공통으로 사용됩니다.
- 주요 하위 필드:
- name: 리소스의 이름을 지정합니다.
- labels: 리소스를 식별하고 그룹화하는 데 사용되는 키-값 쌍입니다. 예를 들어, 특정 앱을 식별하거나 버전 등을 표시할 수 있습니다.
- annotations: 레이블과 유사한 키-값 쌍을 추가할 수 있지만, 주로 메타데이터에 정보를 추가하는 용도로 사용됩니다.
- spec
- 리소스의 구체적인 사양을 정의합니다. 리소스마다 spec 필드의 내용이 다릅니다.
- 주요 하위 필드:
- Deployment의 spec 필드:
- replicas: 생성할 파드 수를 정의합니다.
- selector: 이 Deployment가 관리할 파드를 식별하는 기준이 되는 레이블을 설정합니다.
- template: Deployment가 생성할 파드의 템플릿을 정의합니다. 파드 템플릿에는 파드의 메타데이터(metadata)와 사양(spec)이 포함됩니다.
- Pod의 spec 필드:
- containers: 파드 내 컨테이너 목록입니다. 각 컨테이너에 대한 이름, 이미지, 포트, 자원 요청/제한 등을 설정할 수 있습니다.
- Deployment의 spec 필드:
- containers
- 파드에 포함된 컨테이너의 목록을 정의합니다.
- 주요 하위 필드:
- name: 컨테이너의 이름입니다.
- image: 컨테이너 이미지 이름 및 태그(버전)를 지정합니다.
- ports: 컨테이너가 노출할 포트입니다. containerPort는 컨테이너 내에서 사용되는 포트를 설정합니다.
- env: 환경 변수 설정입니다. 각 환경 변수에 대한 이름과 값을 지정할 수 있습니다.
- selector
- 이 리소스가 어떤 파드를 선택하여 관리할지 결정합니다. 주로 matchLabels를 통해 특정 레이블과 일치하는 파드를 선택합니다.
- template
- Deployment와 같은 리소스가 생성할 파드의 템플릿을 정의합니다.
- template 아래에 있는 metadata와 spec은 생성되는 파드의 레이블과 사양을 정의합니다.
- labels
- metadata나 template의 metadata에서 사용하는 필드로, 리소스에 대한 레이블을 정의합니다.
- 파드를 특정 그룹으로 묶어 관리하거나, 선택 조건으로 사용됩니다.
2.Service
-정의: 클러스터 내외부에서 애플리케이션에 안정적으로 접근할 수 있는 네트워크 엔드포인트를 제공합니다. 일반적으로 파드는 동적으로 생성되고 삭제되므로 IP 주소가 고정되지 않기 때문에, Service는 이러한 파드의 집합에 고정된 IP 주소와 이름을 제공하여 파드 간 통신을 용이하게 함.
-역할: 클러스터 내외부에서 애플리케이션에 접근하도록 하는 엔드포인트 생성.
<예시> nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80 # Service에서 외부에 노출되는 포트
targetPort: 80 # 파드에서 서비스하는 포트
type: ClusterIP # Service의 유형 (ClusterIP, NodePort, LoadBalancer 등)
- apiVersion
- 리소스가 속한 API 그룹과 버전입니다. Service는 기본 그룹에 속해 있으며, 보통 v1 버전을 사용합니다.
- kind
- 리소스의 종류를 나타내며, 여기서는 Service입니다.
- metadata
- Service의 메타데이터 정보를 포함합니다.
- name: Service의 이름입니다.
- labels: 필요에 따라 서비스에 레이블을 추가해 관리할 수 있습니다.
- spec
- Service의 상세 설정입니다.
- selector: Service가 트래픽을 전달할 파드를 선택하는 기준입니다. 예를 들어, app: nginx라는 레이블을 가진 모든 파드가 이 Service의 대상이 됩니다.
- ports: 외부와 통신할 때 사용할 포트 설정입니다.
- port: Service가 외부에 노출하는 포트입니다.
- targetPort: 연결된 파드가 내부적으로 사용하는 포트입니다. port와 targetPort는 다를 수 있습니다.
- protocol: 사용할 네트워크 프로토콜을 지정합니다(예: TCP, UDP).
- type: Service의 유형을 정의하며, 네트워크 접근 방식에 영향을 미칩니다. 주요 type 옵션은 다음과 같습니다:
- ClusterIP: 기본값으로, 클러스터 내에서만 접근 가능.
- NodePort: 클러스터 외부에서 노드 IP 주소와 특정 포트를 통해 접근 가능.
- LoadBalancer: 클라우드 환경에서 외부 로드 밸런서를 설정해 외부 접근 가능.
- ExternalName: 클러스터 외부의 DNS 이름을 사용할 때 사용됩니다.
주요 Service 유형
- ClusterIP
- 기본 설정이며, 클러스터 내부에서만 접근할 수 있는 IP 주소를 할당합니다.
- 보통 애플리케이션의 백엔드가 다른 서비스와 통신할 때 사용합니다.
- NodePort
- 각 노드의 특정 포트(30000~32767 범위)를 통해 클러스터 외부에서 접근할 수 있습니다.
- 외부에서 클러스터 노드 IP와 NodePort를 사용해 서비스에 접근할 수 있습니다.
- LoadBalancer
- 클라우드 환경에서 외부 로드 밸런서를 생성하여 외부 접근을 용이하게 합니다.
- LoadBalancer IP 주소를 통해 외부에서 접근할 수 있습니다. (지원 여부는 클라우드 환경에 따라 다름)
- ExternalName
- Service가 클러스터 외부의 DNS 이름을 사용하도록 합니다.
- 클러스터 내에서 Service 이름을 통해 외부 DNS 엔트리에 접근할 수 있습니다
3. kubectl 을 활용하여 Deployment 와 Service 활용
- nginx-deployment.yaml 배포
kubectl apply -f nginx-deployment.yaml
- nginx-service.yaml 배포
kubectl apply -f nginx-service.yaml
'Study > Cloud,Docker,Kubernetes' 카테고리의 다른 글
Load Balancer 정의 및 정리 (0) | 2024.10.29 |
---|---|
Container 기초 (0) | 2024.10.15 |
Kubernetes (0) | 2024.04.08 |
Docker(4)-DockerCompose (0) | 2024.04.06 |
Docker(3)-Dockerfile (0) | 2024.04.04 |