[Kubernetes] Ch2. 워크로드 API 카테고리 - (1) 파드
파드
워크로드 리소스의 최소 단위
파드는 1개 이상의 컨테이너로 구성
같은 파드에 포함된 컨테이너들끼리 네트워크적으로 격리되어 있지 않고 IP주소를 공유
즉, 파드 내부 컨테이너는 서로 localhost 통신이 가능하다
(컨테이너별이 아닌 파드 단위로 IP 주소가 할당)
파드 지다인 패턴
사이드카 패턴
(메인 컨테이너에 기능을 추가)
메인 컨테이너 외에 보조적인 기능을 추가하는 서브 컨테이너를 포함하는 패턴
ex1) 특정 변경 사항을 감지하여 동적으로 설정을 변경하는 컨테이너
ex2) 애플리케이션 로그 파일을 오브젝트 스토리지로 전송하는 컨테이너
파드는 데이터 영역을 공유하고 가지고 있을 수 있기 때문에 대부분 설정에 관련된 패턴
앰배서더 패턴
(외부 시스템과의 통신을 중계)
메인 컨테이너가 외부 시스템과 접속할 때 대리로 중계해주는 서브 컨테이너(앰배서더 컨테이너)를 포함한 패턴
앰배서더 컨테이너를 사용하면 좀 더 느슨한 결합을 유지할 수 있다
ex) 데이터베이스에 직접 결합하지 않고, 앰배서더 컨테이너를 경유하여 사용할 수 있도록 할 수 있다
어댑터 패턴
(외부 접속을 위한 인터페이스를 제공)
서로 다른 데이터 형식을 변환해주는 컨테이너(어댑터 컨테이너)를 포함하는 패턴
외부 요청에 맞게 데이터 형식을 변환하고 데이터를 반환할 수 있다
파드 생성
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
spec:
containers:
- image: nginx:1.16
name: sample-pod
# 파드 생성
kubectl apply -f sample-pod.yaml
# 파드 목록 표시
kubectl get pods
NAME READY STATUS RESTARTS AGE
**sample-pod 1/1 Running 0 14s**
web-695858cd9d-4xrq2 1/1 Running 8 (4h36m ago) 27d
web-695858cd9d-gp7x5 1/1 Running 8 (4h36m ago) 27
# 파드 상세 정보 표시
kubectl get pods -o wide
두 개의 컨테이너를 포함한 파드 생성
apiVersion: v1
kind: Pod
metadata:
name: sample-pod-2
spec:
containers:
- image: nginx:1.16
name: nginx-container
- image: redis:3.2
name: redis-container
kubectl apply -f sample-pod-2.yaml
컨테이너 로그인과 명령어 실행
# 컨테이너에서 /bin/bash 실행
kubectl exec -it sample-pod-2 -- /bin/bash
파드명 제한
이용 가능한 문자는 영문 소문자와 숫자
이용 가능한 기호는 - 또는 .
시작과 끝은 영문 소문자
호스트의 네트워크 구성을 사용한 파드 기동
파드에 할당된 IP 주소는 노드의 호스트 IP 주소와 범위가 다르다
따라서 외부에서 볼 수 없는 IP 주소가 할당됨
hostNetwork를 활성화하면 프로세스를 기동하는 것과 같은 네트워크 구성으로 파드를 구동한다
(노드 IP 주소와 같은 IP 주소)
특수한 상황이 아니면 사용하지 않는다
파드의 DNS 설정과 서비스 디스커버리
spec.dnsPolicy에 설정
ClusterFirst(기본값)
클러스터 내부의 DNS 서버에 질의하고, 클러스터 내부 DNS에서 해석이 안되는 도메인에 대해서는 업스트림 DNS 서버에 질의한다
apiVersion: v1
kind: Pod
metadata:
name: sample-dnspolicy-clusterfirst
spec:
dnsPolicy: ClusterFirst
containers:
- image: nginx:1.16
name: nginx-container
kubectl apply -f sample-dnspolicy-clusterfirst
kubectl exec -it sample-dnspolicy-clusterfirst -- cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5
kubectl get services -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 59d
None
클러스터 외부 DNS 서버를 참조하는 경우도 있다
DNS 서버를 수동으로 설정하려면 None으로 설정한 후, dnsConfig에 설정하고 싶은 값을 작성
외부 DNS 서버만 설정하면 클러스터 내부 DNS를 사용한 서비스 디스커버리는 사용할 수 없다
Default
쿠버네티스 노드의 DNS 설정을 그대로 상속받는 경우에 Default로 설정
dnsPolicy의 기본값은 Default가 아니므로 주의가 필요하다
쿠버네티스 노드 DNS 설정을 상속받게 설정하면 클러스터 내부 DNS를 사용한 서비스 디스커버리를 사용할 수 없다
ClusterFirstWithHostNet
hostNetwork를 사용한 파드에 클러스터 내부 DNS를 참조하고 싶은 경우 사용한다
전체적으로 ClusterFirst와 같다
hostNetwork를 사용하는 경우 기본값인 ClusterFirst의 설정값은 무시되고 쿠버네티스 노드의 네트워크 설정이 사용되기 때문에 명시적으로 ClusterFirstWithHostNet을 지정해야한다