1. Pod (파드)

  • 최소 단위, 1개 이상의 컨테이너로 구성
  • Pod가 단독으로 쓰이는 경우는 없다. Pod가 컨테이너를 관리하듯 다른 컨트롤러가 Pod를 관리한다
  • 파드의 IP는 생성 될 때 마다 동적으로 변경된다

  • Label : 파드의 용도를 구분하는 태그
  • NodeSelector : 해당 레이블이 달려 있는 노드에 할당, 없을 경우 노드 할당 불가능

image

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에 접근하는 방식

image

  1. 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
  1. NodePort : 클러스터 외부(노드)에서 접근 가능하도록 Port 지정
    • ClusterIP 포함
    • 범위 : 30000 ~ 32768

image

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)로 요청이 간다

  1. Load Balancer
    • Node에 로드밸런서를 연결해 자동으로 살아 있는 노드로 연결
    • ClusterIP + NodePort 포함

image

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개의 클러스터에서 여러 개의 서비스를 운영한다면 들어온 요청을 보고 어느 서비스로 연결할지 판단해야 한다

image

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 오브젝트 관계

클러스터 > 네임스페이스 > 노드 > 파드 > 컨테이너

image

<출처> 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 출처>