[k8s] 쿠버네티스 Object
1. Pod (파드)
- 최소 단위, 1개 이상의 컨테이너로 구성
- Pod가 단독으로 쓰이는 경우는 없다. Pod가 컨테이너를 관리하듯 다른 컨트롤러가 Pod를 관리한다
-
파드의 IP는 생성 될 때 마다 동적으로 변경된다
- Label : 파드의 용도를 구분하는 태그
- NodeSelector : 해당 레이블이 달려 있는 노드에 할당, 없을 경우 노드 할당 불가능
apiVersion: v1
kind: Pod
metadata:
name: pod1
# namespace: ns1
labels:
type: web
spec:
nodeSelector:
kubernetes.io/hostname: node1 # 할당시킬 노드가 갖고 있는 레이블 입력
containers:
- name: container1
image: europani/init
ports:
- containerPort: 8080
- name: container2
image: europani/init2
ports:
- containerPort: 8080
resources:
requests: # 스케줄링 시 요구되는 최소 리소스
cpu: 100m
memory: 256Mi
limits: # Pod가 사용할 수 있는 최대 리소스
cpu: 200m
memory: 512Mi
NodeSchedule
-
파드를 할당시킬 노드를 선택하는 전략
- NodeSelector : 해당 레이블이 달려 있는 노드에 할당, 없을 경우 노드 할당 불가능
- NodeAffinity : 해당 레이블이 달려 있는 노드에 할당, 옵션을 설정하면 resource가 넉넉한 노드에도 할당 가능
- Pod Affinity : 연관된 파드가 있는 노드에 같이 할당되도록 설정 (i.g WebApp-Server)
- Pod Anti-Affinity : 설정한 조건에 맞는 파드가 있는 노드에 같이 할당되지 않도록 설정 (i.g Master-Slave)
- Taint / Toleration : 특정 파드만 올라올 수 있도록 노드의 조건 설정
- Taint : 해당 노드에 할당 될 수 있는 파드의 조건을 노드에 설정
- Toleration : 파드에 설정하는 옵션으로 노드의 Taint와 일치하면 해당 노드에 할당 됨
헬스체크
1. startup
- 컨테이너 실행 전의 사전 조사 체크나 사전
- App 초기화가 끝났는지 체크
- 컨테이너 내의 어플리케이션 시작 여부(App 초기화), 웜업 등
- Spring App 초기화시 : Jar 실행, Spring 초기화, DB 연결 등이 수행
- App 초기화가 되면 startup이 성공
- startup 체크가 끝나야 readliness/liveness 체크 단계로 넘어 갈 수 있음
- 실패시 해당 컨테이너를 죽이고 재시작
2. readiness
- 컨테이너가 준비되었는 지 체크하고 정상적이지 않다면 파드로 들어오는 요청을 제외
- 외부 트래픽을 받을 수 있는 상황인지 체크
- User 초기화 : 초기 데이터 셋팅, 연동 시스템 체크, DB 데이터 validation 등
- readiness 체크가 성공하면 Service는 해당 Pod와 연결하여 트래픽이 가도록 한다
- 실패시 해당 Pod를 Service 연결 대상에서 제외
spec:
containers:
- name: container1
image: europani/init
ports:
- containerPort: 8080
readnessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 5 # 최초 probe 시작 전 딜레이 (default:0)
periodSeconds: 5 # probe 체크 주기 (default:10)
timeoutSeconds: 2 # probe timeout (default:1)
successThreshold: 1 # 성공처리를 위한 성공횟수 (default:1)
failureThreshold: 1 # 실패처리를 위한 실패횟수 (default:3)
3. liveness
- 컨테이너가 정상적으로 살아있는 지 체크
- 실패시 컨테이너를 재시작하여 문제를 해결 시도
spec:
containers:
- name: container1
image: europani/init
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5 # 최초 probe 시작 전 딜레이 (default:0)
periodSeconds: 5 # probe 체크 주기 (default:10)
timeoutSeconds: 2 # probe timeout (default:1)
successThreshold: 1 # 성공처리를 위한 성공횟수 (default:1)
failureThreshold: 1 # 실패처리를 위한 실패횟수 (default:3)
2. Service (서비스)
- 네트워크와 관련된 Object이며, 파드를 외부 네트워크와 연결해주고 여러 개의 Pod을 바라보는 내부 로드 밸런서를 생성할 때 사용
- IP가 계속 변하는 파드와 직접 통신하지 않고 별도의 고정된 IP를 갖는 서비스를 통해 Pod에 접근하는 방식
- ClusterIP : 클러스터 내에서만 접근 가능한 IP를 지정
- 클러스터 내부에서 여러 개의 pod를 바라보는 로드밸런서 기능 제공
- default 타입
apiVersion: v1
kind: Service
metadata:
name: svc1
spec:
type: ClusterIP # default : ClusterIP
selector:
type: web # Pod의 Label과 매칭
ports:
- port: 80 # Service의 포트
targetPort: 8080 # 포워딩 할 Pod의 컨테이너 포트
protocol: TCP
- NodePort : 클러스터 외부(노드)에서 접근 가능하도록 Port 지정
- ClusterIP 포함
- 범위 : 30000 ~ 32768
apiVersion: v1
kind: Service
metadata:
name: svc1
spec:
type: NodePort
selector:
type: web
ports:
- port: 80
targetPort: 8080
protocol: TCP
nodePort: 31000 # 노드에 오픈할 포트 (미지정시 범위에서 랜덤지정)
-> 클러스터 외부에서 http://192.168.56.30:31000/test
로 요청을 보내면 파드 안의 컨테이너(:8080)로 요청이 간다
- Load Balancer
- Node에 로드밸런서를 연결해 자동으로 살아 있는 노드로 연결
- ClusterIP + NodePort 포함
apiVersion: v1
kind: Service
metadata:
name: svc1
# namespace: ns1
spec:
type: LoadBalancer
selector:
type: web
ports:
- port: 80
targetPort: 8080
protocol: TCP
특별한 서비스 종류
- Headless : ClusterIP를 지정하지 않은 서비스
- Pod -> Service 혹은 Pod -> Pod 연결 시 유용하다
- 서비스에 ClusterIP를 지정하지 않으면 해당 서비스에 연결된 파드로 IP를 통해 직접 접근이 가능하다
- 서비스명을 알면 DNS Server를 통해 서비스의 IP를 알 수 있고 이를 통해 해당 서비스에 접근이 가능하다
- 여기서 Headless를 사용하면 DNS Server에 서비스의 IP가 아닌 파드들의 IP가 등록된다
-
Endpoint
- ExternalName : 외부 서비스와 연결해 주는 서비스
apiVersion: v1
kind: Service
metadata:
name: externalname1
spec:
type: ExternalName
externalName: github.github.io
3. Node (노드)
- 서버
- 파드는 노드 위에서 동작한다
Ingress
- 1개의 클러스터에서 여러 개의 서비스를 운영한다면 들어온 요청을 보고 어느 서비스로 연결할지 판단해야 한다
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress1
spec:
rules:
- host: 192.124.68.4
http:
paths:
- path: / # 해당 path로 들어오면 해당 서비스로 연결
pathType: Prefix
backend:
service:
name: svc-shopping
port:
number: 8080
- path: /customer
pathType: Prefix
backend:
service:
name: svc-customer
port:
number: 8080
- path: /order
pathType: Prefix
backend:
service:
name: svc-order
port:
number: 8080
Namespace (네임스페이스)
- 논리적 공간
- 네임스페이스를 통해 1개의 클러스터를 논리적으로 구분해서 사용 가능
- 모든 Object는 네임스페이스 안에 할당되며 네임스페이스 간의 공유가 되지 않는다
- 네임스페이스에 Resource와 Object 제한을 걸 수 있다
- ResourceQuota, LimitRange 등
- Pod 갯수 등
- 네임스페이스간의 공유되는 사항
- 같은 클러스터에 있다면 다른 네임스페이스에 있는 Object를 IP와 포트로 접근이 가능하다
- NodePort
- HostPath
apiVersion: v1
kind: Namespace
metadata:
name: ns1
k8s 오브젝트 관계
클러스터 > 네임스페이스 > 노드 > 파드 > 컨테이너
<출처> https://subicura.com/k8s/ https://www.inflearn.com/course/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EA%B8%B0%EC%B4%88/dashboard 출처>