삽질의 현장/- Docker&Kubernetes

[GCP Study Jam] Kubernetes를 통한 클라우드 조정

shovelman 2019. 1. 20. 00:32

GCP를 활용한 Kubernetes 학습을 진행하며 정리하는 글입니다 (Google Cloud Study Jam 참여 중).


Pod

Pod 란?




  • 하나 이상의 Container가 포함된 집합을 의미합니다.
  • 일반적으로 종속도가 높은 여러 Container가 있을 경우 Container들을 단일 Pod로 패키징합니다.
  • Volume 은 Data Disk로서 Pod의 컨테이너에서 사용할 수 있습니다.
  • Pod는 Contents에 대한 공유 Namespace 제공합니다.
    • Pod에 속한 두 Container가 서로 통신할 수 있으며 연결된 Volume도 공유합니다.
  • Pod는 Network Namespace도 공유합니다(Pod마다 IP주소가 하나씩 있습니다.).
  • Pod는 하나의 Container(Monolith)로 구성됩니다.
  • Pod는 기본적으로 비공개 IP 주소가 할당 됩니다.

Pod 만들기

.yaml 형식의 구성 파일을 통해 Pod를 생성합니다. (파일명 → POD_NAME)

kubectl create -f POD_NAME.yaml

## POD_NAME.yaml 파일구성
apiVersion: v1
kind: Pod
metadata:
  name: monolith
  labels:
    app: monolith
spec:
  containers:
    - name: monolith
      image: kelseyhightower/monolith:1.0.0
      args:
        - "-http=0.0.0.0:80"
        - "-health=0.0.0.0:81"
        - "-secret=secret"
      ports:
        - name: http
          containerPort: 80
        - name: health
          containerPort: 81
      resources:
        limits:
          cpu: 0.2
          memory: "10Mi"

모든 Pod 조회

kubectl get pods

실행 된 Pod 정보 조회

kubectl describe pods POD_NAME
  • Pod의 IP 주소 및 이벤트 로그 등 Pod에 관한 정보를 확인할 수 있어 이슈 해결 시 유용한 명령어입니다.

Ford interaction

Pod는 기본적으로 비공개 IP 주소가 할당 되며 클러스터 외부에 도달할 수 없습니다. 따라서 포트 포워딩을 통해 로컬 포트를 Pod 포트로 매핑하여 사용합니다.

kubectl port-forward POD_NAME LOCAL_PORT:POD_PORT
  • LOCAL_PORT 를 POD_PORT 로 포워딩 합니다.

Pod의 Log를 조회하기 위해서 'logs' 명령을 사용합니다.

kubectl logs POD_NAME
kubectl logs -f POD_NAME // 실시간으로 발생하는 로그 확인이 가능합니다.

대화형 쉘 실행도 가능합니다.

kubectl exec POD_NAME --stdin --tty -c POD_NAME /bin/sh

Service

Service 란?



  • Pod 집합과 통신하기 위해서 Service를 사용합니다.
  • Service는 Pod를 위한 안정적인 EndPoint를 제공합니다.
  • Service는 Label을 사용해 Service가 수행될 Pod를 판단합니다.
  • Service가 Pod 집합에 제공하는 Access 수준은 현재 3가지 입니다.
    • ClusterIP (내부) : 기본 유형으로서 이 Service는 클러스터 내부에서만 볼 수 있습니다.
    • NodePort : 클러스터의 각 노드에 외부 엑세스가 가능한 IP를 제공합니다.
    • LoadBalancer : Service에서 포함된 노드로 트래픽을 전송하는 클라우드 제공업체의 부하 분산기를 추가합니다.

Service 만들기

.yaml 형식의 Service 구성 파일을 통해 Service를 생성합니다.

kubectl create -f SERVICE_NAME.yaml

## SERVICE_NAME.yaml 파일구성
kind: Service
apiVersion: v1
metadata:
  name: "monolith"
spec:
  selector:
    app: "monolith"
    secure: "enabled"
  ports:
    - protocol: "TCP"
      port: 443
      targetPort: 443
      nodePort: 31000
  type: NodePort
  • 구성 파일 기준으로 봤을 때
    • 'app=monolith' 및 'secure=enabled' Label의 Pod를 자동으로 찾습니다.
    • 31000 포트에서 nginx(포트 443)로 외부 트레픽을 전송하기 위해서는 Node 포트를 노출해야 합니다.

Pod에 Label 추가

Label 추가

kubectl label pods POD_NAME 'LABEL_NAME'
kubectl get pods POD_NAME --show-label

Deployment

Deployment 란?

  • Production 단계에서 Container를 확장하고 관리하기 위해 사용됩니다.
  • Deployment는 실행 중인 Pod의 수가 사용자가 지정한 Pod 개수와 일치하도록 보장해주는 선언적 방법입니다.
  • Deployment는 Pod 관리에 대한 하위 수준의 세부 정보를 추상화 해주는 장점이 있습니다.
  • Background에서 Deployment는 'ReplicaSet'를 사용해 Pod의 시작과 중지를 관리합니다.
  • Pod를 업데이트 및 확장해야 할 경우 Deployment에서 처리해 줍니다.
  • Pod가 중단될 경우 Pod를 재시작 처리해 줍니다.
  • 마이크로 서비스 별 상호 작용을 할 수 있게 됩니다.
  • 독립적으로 확장 및 배포가 가능해집니다.

Deployment 만들기

.yaml 형식의 구성파일을 통해 Deployment 생성 시 Deployment 매니페스트의 데이터를 따르는 Pod가 생성됩니다.

kubectl create -f DEPLOYMENT_NAME.yaml

## DEPLOYMENT_NAME.yaml 파일구성
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: auth
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: auth
        track: stable
    spec:
      containers:
        - name: auth
          image: "kelseyhightower/auth:1.0.0"
          ports:
            - name: http
              containerPort: 80
            - name: health
              containerPort: 81
...

ETC

Secret 이란

Kubernetes에서 Secret은 외부로 노출되면 안되는 민감한 정보들을 저장하는 용도로 사용합니다.

kubectl create secret ...



학습 내용 출처 : https://run.qwiklabs.com/focuses/557?parent=catalog