728x90
반응형

Service

  • Service는 파드들의 그룹에 접근하기 위한 안정적인 엔드포인트를 정의한 것
  • 어플리케이션을 클러스터 내의 다른 파드들에 노출시거나 외부 클라이언트에 노출시킬 수 있다.
  • Load Balancing과 자동 스케일링 기능을 제공하여, 어플리케이션이 매우 사용 가능한 상태로 남게 해 준다
apiVersion: v1  
kind: Pod  
metadata:  
    name: webapp-with-db  
    labels:  
        app: my-webapp  
spec:  
    containers:  
    - name: webapp  
      image: nginx:latest  
      ports:  
        - containerPort: 80  
    - name: database  
      image: mongo:latest  

---  

apiVersion: v1  
kind: Service  
metadata:  
    name: webapp-service  
spec:  
    selector:            // 서비스 내의 파드를 선택한다
        app: my-webapp  // 파드가 해당 label을 metadata로 가진 이상, service는 이 파드를 타겟한다.
    ports:  
    - protocol: TCP   
      port: 80  
      targetPort: 80.   // 파드의 포트. 

Ingress

  • 클러스터 내에서 파드끼리 내부 통신을 가능하게 함
  • 즉, 서비스를 클러스터 외부 클라이언트에 노출시킴
  • 어플리케이션의 외부 엔트리 포인로서 동작
  • 들어오는 트래픽에 대해 라우팅 규칙과 로드 밸런싱을 설정할 수 있게 함
  • Ingress 사용을 위해서는 클러스터 내에 Ingress Controller가 배포되어야 함
apiVersion: networking.k8s.io/v1  
kind: Ingress  
metadata:  
    name: webapp-ingress  
spec:  
    rules:  
    - host: mywebapp.example.com       // 클러스터 외부에서 접근할 수 있는 도메인
      http:                            
        paths:                         // 라우팅 규칙을 정의하는 부분
        - path: /  
          pathType: Prefix  
          backend:                     // 트래픽이 포워딩 되어야 하는 타겟 서비스 정의
            service:  
                name: webapp-service  
                port:  
                    number: 80
728x90
반응형
728x90
반응형

메인 컴포넌트

#nodes #pods #노드 #파드 #쿠버네티스 #kubernetes #k8ss

노드와 파드

  • 노드
    • 노드는 컨테이너가 배포되고 구동되는 Worker Machine이다.
    • 각 노드는 클러스터 내에서 개별 노드를 의미하고, 물리/가상 머신이다.
    • 노드는 실제 workload를 구동시키고 필요 자원을 제공하는 역할이다.
  • 파드
    • 최소 배포 가능한 단위
    • 하나 혹은 강하게 결합된 컨테이너를 의미함
    • 파드 내의 컨테이너들은 같은 네트워크 네임스페이스를 공유한다
      • 이는 localhost 상에서 서로 소통할 수 있게 함
    • 파드는 클러스터에서 하나의 프로세스 인스턴스를 의미함
apiVersion: v1  
kind: Pod  
metadata:  
    name: webapp-with-db       // 파드 이름
    labels:  
        app: my-webapp  
spec:  
    containers:  
    - name: webapp            // 컨테이너 명
      image: nginx:latest     // 컨테이너 이미지 명
      ports:  
        - containerPort: 80   // 컨테이너 포트
    - name: database  
      image: mongo:latest
  • 왜 컨테이너가 아니라 파드를 사용하는가
    • Grouping Containers
      • 컨테이너들을 논리적으로 그룹화 한다.
      • 스케줄링, 스케일링, 관리를 간단화시킨다.
    • Shared Resources
      • 파드 내의 컨테이너들은 동일한 네트워크 네임스페이스를 공유함
      • 파드 내의 컨테이너들은 동일한 볼륨을 공유할 수 있다.
      • 따라서 서로 소통하기 더욱 쉬워진다
    • Amotic Unit
      • 파드는 배포의 원자 단위이다.
      • 어플리케이션 관리 혹은 스케일링 시, 파드 레벨로 수행한다 (컨테이너 개별 적용말고)
    • Scheduling and Affinity
      • 쿠버네티스는 파드를 노드에 스케줄하지, 각각 컨테이너를 스케줄하지 않는다.
      • 따라서 서로 연간되어있는 파드 내의 컨테이너들은 동일한 노드에 위치하게 된다
728x90
반응형
728x90
반응형

아키텍처

마스터 노드

  • 전체 클러스터를 컨트롤하고, 전체 클러스터 상태를 관리함
  • 새로운 파드들의 스케일링, 노드/파드들의 헬스 모니터링, 수요에 따른 어플리케이션 스케일링 등 전체 클러스터에 대한 결정권을 갖는다.
  • 주요 컴포넌트
    • API Server
      • 클러스터와ㅏ 유저/컴포넌트간의 소통을 가능하게 하는 API를 노출시켜준다.
    • etcd
      • 클러스터의 모든설정 데이터를 key-value 값들이 저장된다
      • 모든 클러스터 상태 정보가 여기 저장된다.
    • Controller Manager
      • API Server를 통해 클러스터 상태를 체크하고 원하는 상태가 유지하기 위한 행동을 취한다.
    • Scheduler
      • 새로운 파드들을 리소스 필요량과 가용성에 따라 노드들에 배정한다.
      • 이를 통해 worker 노드들에 workload들을 공평하게 분배한다.

워커 노드

  • 컨테이너(파드)가 스케쥴되고 구동되는 머신을 의미
  • 클러스터의 data plane을 형성하고, 실제 workload를 실행한다.
  • 워커 노드 주요 컴포넌트
    • kubelet
      • 각각의 워커 노드를 구동시키고 Master Node와 통신하는 역할
      • 파드 명세에 적혀있는 대로 컨테이너가 구동되고 그 상태가 건강하게 하는 역할
    • Container Runtime
      • Docker나 containerd와 같은 복수개의 container runtimes를 지원한다
      • 컨테이너 이미지를 가져오고, 컨테이너를 구동하는 역할
    • Kube Proxy
      • 클러스터 내에서 네트워크 소통을 하는 역할
      • 서비스 네트워크 라우팅을 관리하고 Load Balancing을 수행한다.

상호작용 방식

  • Master node와 Worker Node들은 API Server를 통해 서로 통신한다.
  • 유저와 다른 컴포넌트들 역시 API Server를 통해 서로 상호 작용함
  • 예시
    • 새로운 어플리케이션 배포 시, 설정 파일들이 API Server를 통해 전달됨
      • 그 설정들은 etcd에 저장됨
    • Controller Manager는 API Server를 통해 클러스터 상태를 모니터링함
    • 새로운 파드가 스케줄됐을 때, Scheduler가 적정한 Worker Node를 선정한다
      • 이 선정된 내용을 API Server가 선정된 노드에게 전달한다
      • 그리고 그 노드의 kubelet이 컨테이너를 실행시킨다

728x90
반응형

+ Recent posts