개발강의정리/DevOps

[데브옵스를 위한 쿠버네티스 마스터] 쿠버네티스 핵심 개념-pod

nineDeveloper 2020. 11. 27.
728x90

POD

포드

  • 컨테이너의 공동 배포된 그룹이며 쿠버네티스의 기본 빌딩 블록을 대표
  • 쿠버네티스는 컨테이너를 개별적으로 배포하지 않고 컨테이너의 포드를 항상 배포하고 운영
  • 일반적으로 포드는 단일 컨테이너만 포함하지만 다수의 컨테이너를 포함 할 수 있음
  • 포드는 다수의 노드에 생성되지 않고 단일 노드에서만 실행
  • 여러 프로세스를 실행하기 위해서는 컨테이너 당 단일 프로세스가 적합
  • 다수의 프로세스를 제어하려면 -> 다수의 컨테이너를 다룰 수 있는 그룹이 필요

포드의 관리

  • 두 가지 장점
    • 포드는 밀접하게 연관된 프로세스를 함께 실행하고 마치 하나의 환경에서 동작하는 것처럼 보임
    • 그러나 동일한 환경을 제공하면서 다소 격리된 상태로 유지

동일한 포드의 컨테이너 사이의 부분 격리

  • 포드의 모든 컨테이너는 동일한 네트워크 및 UTS 네임스페이스에서 실행
  • 같은 호스트 이름 및 네트워크 인터페이스를 공유 포트 충돌 가능성 있음
  • 포드의 모든 컨테이너는 동일한 IPC 네임스페이스 아래에서 실행되며 IPC 를 통해 통신 가능
    • 최신 쿠버네티스 및 도커 버전에서는 동일한 PID 네임스페이스를 공유할 수 있지만 이 기능은 기본적으로 활성화돼 있지 않다

플랫 인터 포드 네트워크 구조

  • 쿠버네티스 클러스터의 모든 포드는 공유된 단일 플랫, 네트워크 주소 공간에 위치
  • 포드 사이에는 NAT 게이트웨이가 존재 하지 않음

컨테이너를 포드 전체에 적절하게 구성하는 방법

  • 다수의 포드로 멀티티어 애플리케이션 분할하기
  • 각각 스케일링이 가능한 포드로 분할하기

YAML 로 포드 디스크립터 만들기

  • kubectl 실행 명령으로 간단한 리소스 작성 방법도 가능하지만 일부 항목에 대해서만 가능하며 저장이
    용의하지 않음
  • 모든 쿠버네티스 객체를 YAML 로 정의하면 버전 제어 시스템에 저장 가능
  • 모든 API에 대한 내용은 http://kubernetes.io/docs/reference/ 참고

포드 정의

  • apiVersion kind 메타 데이터 스펙 스테이터스 로 구성
  • 포드 정의 구성 요소
    • apiVersion 쿠버네티스 api 의 버전을 가리킴
    • kind 어떤 리소스 유형인지 결정 포드 레플리카컨트롤러 서비스 등
    • 메타데이터 포드와 관련된 이름 네임스페이스 레이블 그 밖의 정보 존재
    • 스펙 컨테이너 볼륨 등의 정보
    • 상태 포드의 상태 각 컨테이너의 설명 및 상태 포드 내부의 IP 및 그 밖의 기본 정보 등

포드에서 YAML 파일 불러오기

$ kubectl get pod http-go -o yaml
apiVersion: v1 
kind: Pod 
metadata:
  creationTimestamp: "2019-06-18T08:23:04Z"
  generateName: http-go-
  labels:
    run: http-go
  name: http-go-jvsg4
  namespace: default
  ownerReferences:
  - apiVersion: v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicationController
    name: http-go
    uid: 40b167be-91a2-11e9-8c69-0800278e464d
  resourceVersion: "8777"
  selfLink: /api/v1/namespaces/default/pods/http-go-jvsg4
  uid: 4b85d848-91a2-11e9-8c69-0800278e464d

포드에서 YAML 파일 불러오기

# 포드의 상세 스펙(포드 컨테이너의 목록, 볼륨, 그 밖의 것들)
spec:
  containers:
  - image: gasbugs/http-go
  imagePullPolicy: Always
  name: http-go
  ports:
  - containerPort: 8080
    protocol: TCP
  resources: {}
  terminationMessagePath: /dev/termination-log
  terminationMessagePolicy: File
  volumeMounts:
  - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
    name: default-token-mts8j
    readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: slave2-virtualbox
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  [중략]
  # 포드의 컨테이너의 상세 상태 
  status:
    conditions:
    - lastProbeTime: null
      lastTransitionTime: "2019-06-18T08:23:07Z"
      status: "True"
      type: Initialized
    - lastProbeTime: null
      lastTransitionTime: "2019-06-18T08:23:33Z"
      status: "True"
      type: Ready
    - lastProbeTime: null
      lastTransitionTime: "2019-06-18T08:23:33Z"
      status: "True"
      type: ContainersReady
    - lastProbeTime: null
      lastTransitionTime: "2019-06-18T08:23:04Z"
      status: "True"
      type: PodScheduled
    [중략]

디스크립터 작성하기

  • 간단히 다음과 같이 디스크립터 생성 (http-go-pod.yaml)
# 이 디스크립터는 쿠버네티스 API v1를 사용
apiVersion: v1
# 리소스 포드에 대한 설명
kind: Pod
metadata:
  # 포드의 이름
  name: http-go
spec:
  containers:
  # 생성할 컨테이너의 컨테이너 이미지
  - image: gasbugs/http-go
    name: http-go
    ports:
    # 응답 대기할 애플리케이션 포트
    - containerPort: 8080
      protocol: TCP

kubectl에 디스크립터 작성 요령 확인 가능

$ kubectl explain pods
KIND: Pod
VERSION: v1

DESCRIPTION:
Pod is a collection of created by clients and
containers that can run on a host. This resource is scheduled onto hosts.

FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

디스크립터를 사용해 포드 생성

  • kubectl create -f <파일명>
$ kubectl create -f http-go-pod.yaml
pod/ http-go created

pod 확인

$ kubectl get pod
NAME      READY   STATUS              RESTARTS   AGE
http-go   0/1     ContainerCreating   0          11s

보다 정확한 정보 확인시 -o wide 옵션추가

$ kubectl get pod -o wide
NAME      READY   STATUS    RESTARTS   AGE     IP          NODE    NOMINATED NODE   READINESS GATES
http-go   1/1     Running   0          3m34s   10.32.0.3   work1   <none>           <none>

관찰 모드 변경되면 내용이 갱신된다

$ kubectl get pod -w

yaml 이나 json의 형태로도 볼 수 있음
yaml 로 보기

$ kubectl get pod -o yaml

json 으로 보기

$ kubectl get pod -o json

진행상황 확인

$ kubectl describe pod http-go

kubectl log로 포드의 로그 가져오기

  • kubectl logs http-go

컨테이너에서 호스트로 포트 포워딩

  • 디버깅 혹은 다른 이유로 서비스를 거치지 않고 특정 포드와 통신하고 싶을 때 사용
  • kubectl port-forward 명령으로 수행
  • 컨테이너 8888 포트를 pod의 8080 포트로 전달
$ kubectl port-forward http-go 8080:8080
Forwarding from 127.0.0.1:8888 -> 8080
^Z
[1]+ Stopped kubectl port-forward http-go 8888:8080

$ bg
[1]+ kubectl port-forward http-go 8888:8080 &

$ curl 127.0.0.1:8888
Handling connection for 8888
Welcome! http-go

※ 팁: 포트포워딩 종료는 프로세스 강제 kill로 수행한다

포드에 주석 추가하기

  • 각 포드나 API 객체 설명이 추가
  • 클러스터를 사용하는 모든 사람이 각 객체의 정보를 빠르게 확인 가능
  • 예를 들어 객체를 만든 사람의 이름을 지정
  • 공동 작업 가능
  • 총 256KB까지 포함 가능
$ kubectl annotate pod http-go key="test1234"
pod/http-go annotated

$ kubectl get pod http-go -o yaml

포드 삭제

  • 만든 포드 조회

    $ kubectl get pod
    NAME             READY   STATUS    RESTARTS   AGE
    http-go     1/1    Running   0          7h12m
  • 포드 삭제

    • kubectl delete pod <포드 이름>
  • 전체 포드 삭제

    • kubectl delete pod --all

연습문제

  • 모든 리소스 삭제

    • kubectl delete pod --all
  • YAML을 사용하여 도커이미지 jenkins로 Jenkins-manual 포드를 생성하기

    jenkins-manual-pod.yaml 파일 생성

    apiVersion: v1
    kind: Pod
    metadata:
      name: jenkins-manual
    spec:
      containers:
      - name: jenkins
        image: jenkins
        ports:
        - containerPort: 9080
  • Jenkins 포드에서 curl 명령어로 로컬호스트:8080 접속하기

    • kubectl exec jenkins-manual -- curl 127.0.0.1:8080 -s
  • Jenkins 포트를 8888로 포트포워딩하기

    • kubectl port-forward jenkins-manual 8888:8080
    • kubectl logs jenkins-manual
  • 현재 Jenkins-manual의 설정을 yaml로 출력하기

    • kubectl get pod jenkins-manual -o yaml
728x90

댓글

💲 추천 글