# 스태틱(static) 파드 생성하기

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->


*스태틱 파드* 는 <a class='glossary-tooltip' title='쿠버네티스 API를 제공하는 컨트롤 플레인 컴포넌트.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/concepts/overview/components/#kube-apiserver' target='_blank' aria-label='API 서버'>API 서버</a>
없이 특정 노드에 있는 kubelet 데몬에 의해
직접 관리된다.
컨트롤 플레인에 의해 관리되는 파드(예를 들어 <a class='glossary-tooltip' title='클러스터에서 복제된 애플리케이션을 관리한다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/concepts/workloads/controllers/deployment/' target='_blank' aria-label='디플로이먼트(Deployment)'>디플로이먼트(Deployment)</a>)와는 달리,
kubelet 이 각각의 스태틱 파드를 감시한다.
(만약 실패할 경우 다시 구동한다.)

스태틱 파드는 항상 특정 노드에 있는 하나의 <a class='glossary-tooltip' title='클러스터의 각 노드에서 실행되는 에이전트. Kubelet은 파드에서 컨테이너가 확실하게 동작하도록 관리한다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/reference/generated/kubelet' target='_blank' aria-label='Kubelet'>Kubelet</a>에 매여 있다.

Kubelet 은 각각의 스태틱 파드에 대하여 쿠버네티스 API 서버에서 <a class='glossary-tooltip' title='Kubelet의 스태틱 파드(Static Pod)를 추적하는 API 서버 내부의 오브젝트.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/reference/glossary/?all=true#term-mirror-pod' target='_blank' aria-label='미러 파드(mirror pod)'>미러 파드(mirror pod)</a>를
생성하려고 자동으로 시도한다.
즉, 노드에서 구동되는 파드는 API 서버에 의해서 볼 수 있지만,
API 서버에서 제어될 수는 없다.
파드 이름에는 노드 호스트 이름 앞에 하이픈을 붙여 접미사로 추가된다.


<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4>만약 클러스터로 구성된 쿠버네티스를 구동하고 있고, 스태틱 파드를 사용하여
모든 노드에서 파드를 구동하고 있다면,
스태틱 파드를 사용하는 대신 <a class='glossary-tooltip' title='파드의 복제본을 클러스터 노드 집합에서 동작하게 한다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/concepts/workloads/controllers/daemonset' target='_blank' aria-label='데몬셋(DaemonSet)'>데몬셋(DaemonSet)</a>
을 사용하는 것이 바람직하다.</div>



<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4>스태틱 파드의 <code>spec</code>은 다른 API 오브젝트(예를 들면,
<a class='glossary-tooltip' title='파드에서 실행 중인 프로세스를 위한 신원(identity)을 제공한다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/tasks/configure-pod-container/configure-service-account/' target='_blank' aria-label='서비스어카운트'>서비스어카운트</a>,
<a class='glossary-tooltip' title='키-값 쌍으로 기밀이 아닌 데이터를 저장하는 데 사용하는 API 오브젝트이다. 볼륨에서 환경 변수, 커맨드-라인 인수 또는 구성 파일로 사용될 수 있다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/concepts/configuration/configmap/' target='_blank' aria-label='컨피그맵'>컨피그맵</a>,
<a class='glossary-tooltip' title='비밀번호, OAuth 토큰 및 SSH 키와 같은 민감한 정보를 저장한다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/concepts/configuration/secret/' target='_blank' aria-label='시크릿'>시크릿</a>, 등)가 참조할 수 없다.</div>



<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4>스태틱 파드는 <a href="/ko/docs/concepts/workloads/pods/ephemeral-containers/">임시 컨테이너</a>를 지원하지 않는다.</div>


## 시작하기 전에

<p>쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와
통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고
있지 않다면,
<a href="/ko/docs/tasks/tools/#minikube">minikube</a>를 사용해서 생성하거나
다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>
 
  <p>버전 확인을 위해서, 다음 커맨드를 실행  <code>kubectl version</code>.</p>


이 페이지는 파드를 실행하기 위해 <a class='glossary-tooltip' title='A lightweight container runtime specifically for Kubernetes' data-bs-toggle='tooltip' data-bs-placement='top' href='https://cri-o.io/#what-is-cri-o' target='_blank' aria-label='CRI-O'>CRI-O</a>를 사용하며,
노드에서 Fedora 운영 체제를 구동하고 있다고 가정한다.
다른 배포판이나 쿠버네티스 설치 지침과는 다소 상이할 수 있다.

<!-- steps -->

## 스태틱 파드 생성하기 {#static-pod-creation}

[파일 시스템이 호스팅하는 구성 파일](/ko/docs/tasks/configure-pod-container/static-pod/#configuration-files)이나 [웹이 호스팅하는 구성 파일](/ko/docs/tasks/configure-pod-container/static-pod/#pods-created-via-http)을 사용하여 스태틱 파드를 구성할 수 있다.

### 파일시스템이 호스팅 하는 스태틱 파드 매니페스트 {#configuration-files}

매니페스트는 특정 디렉터리에 있는 JSON 이나 YAML 형식의 표준 파드 정의이다. 
[kubelet 구성 파일](/docs/reference/config-api/kubelet-config.v1beta1/)의 `staticPodPath: <the directory>` 필드를 사용하자. 
명시한 디렉터리를 정기적으로 스캔하여, 디렉터리 안의 YAML/JSON 파일이 생성되거나 삭제되었을 때 스태틱 파드를 생성하거나 삭제한다.
Kubelet 이 특정 디렉터리를 스캔할 때 점(.)으로 시작하는 단어를 무시한다는 점을 유의하자.

예를 들어, 다음은 스태틱 파드로 간단한 웹 서버를 구동하는 방법을 보여준다.

1. 스태틱 파드를 실행할 노드를 선택한다. 이 예제에서는 `my-model` 이다.

    ```shell
    ssh my-node1
    ```

2. `/etc/kubernetes/manifests` 와 같은 디렉터리를 선택하고 웹 서버 파드의 정의를 해당 위치에, 예를 들어 `/etc/kubernetes/manifests/static-web.yaml` 에 배치한다.  

    ```shell
	  # kubelet 이 동작하고 있는 노드에서 이 명령을 수행한다.
    mkdir -p /etc/kubernetes/manifests/
    cat <<EOF >/etc/kubernetes/manifests/static-web.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: static-web
      labels:
        role: myrole
    spec:
      containers:
        - name: web
          image: nginx
          ports:
            - name: web
              containerPort: 80
              protocol: TCP
    EOF
    ```

3. 노드에서 kubelet 실행 시에 `--pod-manifest-path=/etc/kubernetes/manifests/` 와 같이 인자를 제공하여 해당 디렉터리를 사용하도록 구성한다. Fedora 의 경우 이 줄을 포함하기 위하여 `/etc/kubernetes/kubelet` 파일을 다음과 같이 수정한다.

   ```
   KUBELET_ARGS="--cluster-dns=10.254.0.10 --cluster-domain=kube.local --pod-manifest-path=/etc/kubernetes/manifests/"
   ```
   혹은 [kubelet 구성 파일](/docs/reference/config-api/kubelet-config.v1beta1/)에 
   `staticPodPath: <the directory>` 필드를 추가한다.

4. kubelet을 재시작한다. Fedora의 경우 아래와 같이 수행한다.

   ```shell
   # kubelet 이 동작하고 있는 노드에서 이 명령을 수행한다.
   systemctl restart kubelet
   ```

### 웹이 호스팅 하는 스태틱 파드 매니페스트 {#pods-created-via-http}

Kubelet은 `--manifest-url=<URL>` 의 인수로 지정된 파일을 주기적으로 다운로드하여
해당 파일을 파드의 정의가 포함된 JSON/YAML 파일로 해석한다.
[파일시스템이 호스팅 하는 매니페스트](#configuration-files) 의 작동 방식과
유사하게 kubelet은 스케줄에 맞춰 매니페스트 파일을 다시 가져온다. 스태틱 파드의 목록에
변경된 부분이 있을 경우, kubelet 은 이를 적용한다.

이 방법을 사용하기 위하여 다음을 수행한다.

1. kubelet 에게 파일의 URL을 전달하기 위하여 YAML 파일을 생성하고 이를 웹 서버에 저장한다.

    ```yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: static-web
      labels:
        role: myrole
    spec:
      containers:
        - name: web
          image: nginx
          ports:
            - name: web
              containerPort: 80
              protocol: TCP
    ```

2. 선택한 노드에서 `--manifest-url=<manifest-url>` 을 실행하여 웹 메니페스트를 사용하도록 kubelet을 구성한다. Fedora 의 경우 이 줄을 포함하기 위하여 `/etc/kubernetes/kubelet` 파일을 수정한다.

    ```
    KUBELET_ARGS="--cluster-dns=10.254.0.10 --cluster-domain=kube.local --manifest-url=<manifest-url>"
    ```

3. Kubelet을 재시작한다. Fedora의 경우 아래와 같이 수행한다.

    ```shell
    # kubelet 이 동작하고 있는 노드에서 이 명령을 수행한다.
    systemctl restart kubelet
    ```

## 스태틱 파드 행동 관찰하기 {#behavior-of-static-pods}

Kubelet 을 시작하면, 정의된 모든 스태틱 파드가 자동으로 시작된다.
스태틱 파드를 정의하고, kubelet을 재시작했으므로, 새로운 스태틱
파드가 이미 실행 중이어야 한다.

(노드에서) 구동되고 있는 (스태틱 파드를 포함한) 컨테이너들을 볼 수 있다.
```shell
# kubelet 이 동작하고 있는 노드에서 이 명령을 수행한다.
crictl ps
```

결과는 다음과 유사하다.

```console
CONTAINER       IMAGE                                 CREATED           STATE      NAME    ATTEMPT    POD ID
129fd7d382018   docker.io/library/nginx@sha256:...    11 minutes ago    Running    web     0          34533c6729106
```


<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4><code>crictl</code>은 이미지 URI와 SHA-256 체크섬을 출력한다. <code>NAME</code>은 다음과 같을 것이다.
<code>docker.io/library/nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31</code></div>


API 서버에서 미러 파드를 볼 수 있다.

```shell
kubectl get pods
```
```
NAME         READY   STATUS    RESTARTS        AGE
static-web   1/1     Running   0               2m
```


<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4>API 서버에서 미러 파드를 생성할 수 있는 권한이 kubelet에게 있는지 미리 확인해야 한다. 그렇지 않을 경우 API 서버에 의해서 생성 요청이 거부된다.</div>


스태틱 파드에 있는 <a class='glossary-tooltip' title='사용자에게 의미 있고 관련성 높은 특징으로 식별할 수 있도록 오브젝트에 태그를 붙인다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/concepts/overview/working-with-objects/labels' target='_blank' aria-label='레이블'>레이블</a> 은
미러 파드로 전파된다.  <a class='glossary-tooltip' title='사용자가 레이블에 따라서 리소스 리스트를 필터할 수 있게 한다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/concepts/overview/working-with-objects/labels/' target='_blank' aria-label='셀렉터'>셀렉터</a> 등을
통하여 이러한 레이블을 사용할 수 있다.

만약 API 서버로부터 미러 파드를 지우기 위하여 `kubectl` 을 사용하려 해도,
kubelet 은 스태틱 파드를 지우지 _않는다._

```shell
kubectl delete pod static-web
```
```
pod "static-web" deleted
```
파드가 여전히 구동 중인 것을 볼 수 있다.
```shell
kubectl get pods
```
```
NAME         READY   STATUS    RESTARTS   AGE
static-web   1/1     Running   0          4s
```

kubelet 이 구동 중인 노드로 돌아가서 컨테이너를 수동으로 중지할 수 있다.
일정 시간이 지나면, kubelet이 파드를 자동으로 인식하고 다시 시작하는
것을 볼 수 있다.

```shell
# kubelet 이 동작하고 있는 노드에서 이 명령을 수행한다.
crictl stop 129fd7d382018 # 예제를 수행하는 사용자의 컨테이너 ID로 변경한다.
sleep 20
crictl ps
```
```console
CONTAINER       IMAGE                                 CREATED           STATE      NAME    ATTEMPT    POD ID
89db4553e1eeb   docker.io/library/nginx@sha256:...    19 seconds ago    Running    web     1          34533c6729106
```

## 스태틱 파드의 동적 추가 및 제거

실행 중인 kubelet 은 주기적으로, 설정된 디렉터리(예제에서는 `/etc/kubernetes/manifests`)에서 변경 사항을 스캔하고, 이 디렉터리에 새로운 파일이 생성되거나 삭제될 경우, 파드를 생성/삭제 한다.

```shell
# 예제를 수행하는 사용자가 파일시스템이 호스팅하는 스태틱 파드 설정을 사용한다고 가정한다.
# kubelet 이 동작하고 있는 노드에서 이 명령을 수행한다.
#
mv /etc/kubernetes/manifests/static-web.yaml /tmp
sleep 20
crictl ps
# 구동 중인 nginx 컨테이너가 없는 것을 확인한다.
mv /tmp/static-web.yaml  /etc/kubernetes/manifests/
sleep 20
crictl ps
```
```console
CONTAINER       IMAGE                                 CREATED           STATE      NAME    ATTEMPT    POD ID
f427638871c35   docker.io/library/nginx@sha256:...    19 seconds ago    Running    web     1          34533c6729106
```
