[DEVOPS-006][기초] 파드·디플로이먼트·서비스 연결하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[DEVOPS-006][기초] 파드·디플로이먼트·서비스 연결하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 168회 작성일 26-09-02 01:35

본문

[이번 수업]
Kubernetes는 컨테이너를 여러 서버에 배치하고 원하는 상태를 유지하는 오픈소스 플랫폼입니다. 파드(Pod), 디플로이먼트(Deployment), 서비스(Service)가 어떻게 연결되는지 배웁니다. 실제 클러스터 없이 클라이언트 모드로 객체 정의를 확인합니다.

[선수지식]
DEVOPS-002의 이미지·컨테이너와 DEVOPS-005의 배포 개념을 알면 좋습니다. `kubectl` 클라이언트만 사용합니다.

[학습목표]
1. `apiVersion`, `kind`, `metadata`, `spec`의 역할을 설명한다.
2. 파드·디플로이먼트·서비스의 책임을 구분한다.
3. 라벨과 선택자로 서비스가 파드를 찾는 원리를 확인한다.

[핵심개념]
Kubernetes 객체는 “이 상태가 되기를 원한다”는 의도 기록입니다. `spec`은 사용자가 선언한 희망 상태, `status`는 시스템이 갱신하는 현재 상태입니다. 컨트롤러는 둘의 차이를 줄이는 조정(reconciliation)을 반복합니다. 매니페스트에는 API 버전, 객체 종류, 이름과 객체별 명세가 들어갑니다.

파드는 함께 실행되는 컨테이너를 담는 가장 작은 배포 단위이며 교체될 수 있습니다. 디플로이먼트는 파드 템플릿과 복제 수를 선언하고 하위 ReplicaSet을 통해 파드 수와 순차 업데이트를 관리합니다. 그래서 개별 파드 이름이나 IP에 의존하면 안 됩니다.

서비스는 바뀌는 파드 집합 앞에 안정적인 네트워크 접근점을 둡니다. 보통 `selector`와 일치하는 라벨의 파드를 대상으로 삼습니다. 기본 `ClusterIP` 유형은 클러스터 내부용입니다. `port`는 서비스가 받는 포트, `targetPort`는 파드 애플리케이션의 포트입니다.

[따라하기]
먼저 `kubectl version --client`로 설치를 확인합니다. 다음 명령은 서버에 연결하거나 객체를 만들지 않고 로컬에서 결과만 생성합니다.

```sh
kubectl create deployment hello-web --image=registry.k8s.io/e2e-test-images/agnhost:2.54 --replicas=2 --dry-run=client -o jsonpath='{.kind} {.spec.replicas} {.spec.selector.matchLabels} {.spec.template.metadata.labels}{"\n"}'
kubectl create service clusterip hello-web --tcp=80:8080 --dry-run=client -o jsonpath='{.kind} {.spec.selector} {.spec.ports[0].port}{"->"}{.spec.ports[0].targetPort}{"\n"}'
```

macOS·Linux 터미널과 Windows PowerShell에서 명령은 같습니다. 예상 결과입니다.

```text
Deployment 2 {"app":"hello-web"} {"app":"hello-web"}
Service {"app":"hello-web"} 80->8080
```

첫 줄은 디플로이먼트 선택자와 파드 템플릿 라벨이 같음을 보여 줍니다. 서비스 선택자도 같으므로 이 파드들을 찾습니다. `80->8080`은 서비스 80번 포트를 파드 8080번 포트로 전달한다는 뜻입니다. `--dry-run=client`라서 파드 실행이나 외부 공개는 없습니다.

[흔한 실수]
디플로이먼트 선택자와 파드 템플릿 라벨이 다르면 객체가 거부됩니다. 서비스 선택자가 틀리면 연결할 파드를 찾지 못합니다. 파드 IP나 이름을 설정에 고정하지 않습니다. `containerPort`를 써도 실제 프로세스가 자동으로 시작되지는 않습니다. 복제 수만 늘려 상태 저장 작업이 안전해지는 것도 아닙니다.

[보안 주의]
출처를 확인한 이미지와 고정 버전 또는 다이제스트를 쓰고 취약점을 검사합니다. 실제 매니페스트에는 `runAsNonRoot: true`, `allowPrivilegeEscalation: false`, 불필요한 기능 제거, `seccompProfile: RuntimeDefault`를 검토합니다. 서비스는 필요한 범위만 공개하고 클러스터 권한은 최소화합니다. 비밀값을 이미지나 일반 매니페스트에 넣지 않습니다. 실습은 본인 소유 로컬·격리 환경에서만 수행합니다.

[직접 해볼 과제]
이름을 `study-web`, 복제 수를 3, 포트를 `8081:8080`으로 바꿔 실행하세요. 관계를 “디플로이먼트 → 파드 → 서비스” 순서로 네 문장 안에 설명합니다.

[확인문제]
1. `spec`과 `status`는 각각 누가 정하고 무엇을 나타내나요?
2. 디플로이먼트가 파드를 직접 여러 개 만드는 것보다 나은 이유는 무엇인가요?
3. 서비스 선택자와 파드 라벨이 일치해야 하는 이유는 무엇인가요?

[다음 학습]
DEVOPS-007에서는 설정·비밀·아티팩트를 코드와 분리하고 배포 환경별로 안전하게 전달하는 방법을 배웁니다.

[공식 참고 자료]
- 객체 모델: https://kubernetes.io/docs/concepts/overview/working-with-objects/
- 파드: https://kubernetes.io/docs/concepts/workloads/pods/
- 디플로이먼트: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
- 서비스: https://kubernetes.io/docs/concepts/services-networking/service/
- 애플리케이션 보안 점검표: https://kubernetes.io/docs/concepts/security/application-security-checklist/

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
1,047
어제
5,103
최대
16,772
전체
772,101
Copyright © 소유하신 도메인. All rights reserved.