Infra Architecture/Kubernetes

[K8S] Workload - Pods

검은 까마귀 2024. 2. 26. 17:07

CKA의 자격증을 공부하면서 이론 부분도 다시 머리속에 재 정립하고자 하는 공부하는 글이다.

최대한, 공식문서를 참고하여 실생활의 메타포를 곁드려 작성할 생각이니.... 어울리지 않더라도 많은 양해바란다.

 

# 워크로드란?

workload는 k8s에서 구동되는 어플리케이션이다. 워크로드가 단일 컴포넌트, 함께 동작하는 다중 컴포넌트와 관계 없이 쿠버네티스에서는 워크로드를 "파드"라는 집합내에서 실행하고, 파드는 클러스터에서 실행중인 컨테이너 집합을 나타낸다.

 

즉, 다시 말해 Pods(파드)는 컨테이너의 집합이고 가장 작은 단위를 이야기한다.

 

# Pods

Pods는 위에서 설명했던 것처럼 쿠버네티스에서 관리하고 생생되는 가장 컴퓨팅 단위를 이야기한다. (그 뜻의 어원은 고래의 지느러미, 배의 꼬투리이다.) 

 

pods의 가장 큰 특징은 isolation(격리)이다. Pod의 Context는 리눅스의 namespace, cgroup등등 다른 요소들로 컨테이너들을 격리 시킬 수 있습니다. 아래는 파드를 관리하는 방법들이다.

  • 파드 하나당 컨테이너 하나
    • 기본적인 사용방법이다. 한번에 하나씩 말면 된다.
  • 함께 작동해야할 멀티 컨테이너의 파드
    • 여러개의 컨테이너들을 하나의 파드에 넣어 그룹화 한다.
    • 만약, 파드당 컨테이너를 하나씩 실행한다면, 이를 안정적으로 운영하기위해 여러개의 파드가 생기지만, 멀티 컨테이너 파드 환경이라면 파드를 하나만 만들어주면된다.

# Pods의 Lifecycle

이전 포스팅에서 설명했던것과 같이 Pods는 삭제되었다 생성되었다를 반복하는 일시적인 객체이다. node안에 생성되는 단위이기 때문에 노드가 죽으면 죽게된다. Pods는 self-heal을 하지 않는다. 

 

Pods의 Lifecycle에는 Phase가 있다.

 

Peding, Running을 가장 많이 보게 된다.

 

pending은 실행 중 image를 불러오거나 뭔가 컨테이너가 존재하지 않는 경우가 대게 많이본다. 그럴때는 kubectl describe pod를 통해서 pods에 어떤 이벤트가 발생했는지 확인후에 오류를 해결하면 된다. pods의 phase 뿐만 아니라 container의 상태도 확인 할 수 있다.

# Pods 생성 방법

$ kubectl run pods --help
Create and run a particular image in a pod.

Examples:
  # Start a nginx pod
  kubectl run nginx --image=nginx

  # Start a hazelcast pod and let the container expose port 5701
  kubectl run hazelcast --image=hazelcast/hazelcast --port=5701

  # Start a hazelcast pod and set environment variables "DNS_DOMAIN=cluster" and
"POD_NAMESPACE=default" in the container
  kubectl run hazelcast --image=hazelcast/hazelcast --env="DNS_DOMAIN=cluster"
--env="POD_NAMESPACE=default"

  # Start a hazelcast pod and set labels "app=hazelcast" and "env=prod" in the container
  kubectl run hazelcast --image=hazelcast/hazelcast --labels="app=hazelcast,env=prod"

  # Dry run; print the corresponding API objects without creating them
  kubectl run nginx --image=nginx --dry-run=client

  # Start a nginx pod, but overload the spec with a partial set of values parsed from JSON
  kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }'

  # Start a busybox pod and keep it in the foreground, don't restart it if it exits
  kubectl run -i -t busybox --image=busybox --restart=Never

  # Start the nginx pod using the default command, but use custom arguments (arg1 .. argN) for that
command
  kubectl run nginx --image=nginx -- <arg1> <arg2> ... <argN>

  # Start the nginx pod using a different command and custom arguments
  kubectl run nginx --image=nginx --command -- <cmd> <arg1> ... <argN>

Options:
    --allow-missing-template-keys=true:
        If true, ignore any errors in templates when a field or map key is missing in the
        template. Only applies to golang and jsonpath output formats.

    --annotations=[]:
        Annotations to apply to the pod.

    --attach=false:
        If true, wait for the Pod to start running, and then attach to the Pod as if 'kubectl
        attach ...' were called.  Default false, unless '-i/--stdin' is set, in which case the
        default is true. With '--restart=Never' the exit code of the container process is
        returned.

    --command=false:
        If true and extra arguments are present, use them as the 'command' field in the container,
        rather than the 'args' field which is the default.

    --dry-run='none':
        Must be "none", "server", or "client". If client strategy, only print the object that
        would be sent, without sending it. If server strategy, submit server-side request without
        persisting the resource.

    --env=[]:
        Environment variables to set in the container.

    --expose=false:
        If true, create a ClusterIP service associated with the pod.  Requires `--port`.

    --field-manager='kubectl-run':
        Name of the manager used to track field ownership.

    --image='':
        The image for the container to run.

    --image-pull-policy='':
        The image pull policy for the container.  If left empty, this value will not be specified
        by the client and defaulted by the server.

    -l, --labels='':
        Comma separated labels to apply to the pod. Will override previous values.

    --leave-stdin-open=false:
        If the pod is started in interactive mode or with stdin, leave stdin open after the first
        attach completes. By default, stdin will be closed after the first attach completes.

    -o, --output='':
        Output format. One of: (json, yaml, name, go-template, go-template-file, template,
        templatefile, jsonpath, jsonpath-as-json, jsonpath-file).

    --override-type='merge':
        The method used to override the generated object: json, merge, or strategic.

    --overrides='':
        An inline JSON override for the generated object. If this is non-empty, it is used to
        override the generated object. Requires that the object supply a valid apiVersion field.

    --pod-running-timeout=1m0s:
        The length of time (like 5s, 2m, or 3h, higher than zero) to wait until at least one pod
        is running

    --port='':
        The port that this container exposes.

    --privileged=false:
        If true, run the container in privileged mode.

    -q, --quiet=false:
        If true, suppress prompt messages.

    --restart='Always':
        The restart policy for this Pod.  Legal values [Always, OnFailure, Never].

    --rm=false:
        If true, delete the pod after it exits.  Only valid when attaching to the container, e.g.
        with '--attach' or with '-i/--stdin'.

    --save-config=false:
        If true, the configuration of current object will be saved in its annotation. Otherwise,
        the annotation will be unchanged. This flag is useful when you want to perform kubectl
        apply on this object in the future.

    --show-managed-fields=false:
        If true, keep the managedFields when printing objects in JSON or YAML format.

    -i, --stdin=false:
        Keep stdin open on the container in the pod, even if nothing is attached.

    --template='':
        Template string or path to template file to use when -o=go-template, -o=go-template-file.
        The template format is golang templates
        [http://golang.org/pkg/text/template/#pkg-overview].

    -t, --tty=false:
        Allocate a TTY for the container in the pod.

Usage:
  kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client]
[--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]

Use "kubectl options" for a list of global command-line options (applies to all commands).

 

2024.02.25 - [Infra Architecture/Kubernetes] - [K8S kubectl] --dry-run 옵션

 

[K8S kubectl] --dry-run 옵션

$ kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client] [--overrides=inline-json] [--command] -- [COMMAND] [args...] kubectl의 run명령어 옵션중에는 --dry-run 옵션이 있습니다. 실제로 사전에 검색

blaj2938.tistory.com

 파드를 생성하는 방법에 대한 메뉴얼이다 --help만 입력해도 예제부터 아주 잘 나온다.

 

 

반응형