# 클러스터 내 모든 컨테이너 이미지 목록 보기

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

---

<!-- overview -->

이 문서는 kubectl을 이용하여 클러스터 내 모든 컨테이너 이미지 목록을
조회하는 방법에 관해 설명한다.

## 시작하기 전에 

<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>


<!-- steps -->

이 작업에서는 kubectl을 사용하여 클러스터 내 모든 파드의 정보를
조회하고, 결과값의 서식을 변경하여 각 파드에 대한 컨테이너 이미지 목록으로
재구성할 것이다.

## 모든 네임스페이스의 모든 컨테이너 이미지 가져오기

- `kubectl get pods --all-namespaces` 를 사용하여 모든 네임스페이스의 모든 파드 정보를 가져온다.
- 컨테이너 이미지 이름만 출력하기 위해 `-o jsonpath={.items[*].spec['initContainers', 'containers'][*].image}` 를 사용한다.
  이 명령어는 결과값으로 받은 json을 반복적으로 파싱하여,
  `image` 필드만을 출력한다.
  - jsonpath를 사용하는 방법에 대해 더 많은 정보를 얻고 싶다면
    [Jsonpath 지원](/ko/docs/reference/kubectl/jsonpath/)을 확인한다.
- 다음의 표준 툴을 이용해서 결과값을 처리한다. `tr`, `sort`, `uniq`
  - `tr` 을 사용하여 공백을 줄 바꾸기로 대체한다.
  - `sort` 를 사용하여 결과값을 정렬한다.
  - `uniq` 를 사용하여 이미지 개수를 합산한다.

```shell
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec['initContainers', 'containers'][*].image}" |\
tr -s '[[:space:]]' '\n' |\
sort |\
uniq -c
```
이 jsonpath는 다음과 같이 해석할 수 있다.

- `.items[*]`: 각 결과값에 대하여
- `.spec`: spec 값을 가져온다.
- `['initContainers', 'containers'][*]`: 각 컨테이너에 대하여
- `.image`: image 값을 가져온다.


<div class="alert alert-info" role="note"><h4 class="alert-heading">참고:</h4>명령어로 하나의 파드를 가져올 때, 예를 들어 <code>kubectl get pod nginx</code> 라면,
jsonpath에서 <code>.items[*]</code> 부분은 생략해야 하는데, 이는 명령어가 아이템 목록이 아닌
단 한 개의 아이템(여기선 파드)으로 결과값을 주기 때문이다.</div>


## 각 파드의 컨테이너 이미지 보기

`range` 연산을 사용하여 명령어의 결과값에서 각각의 요소들을
반복하여 출력할 수 있다.

```shell
kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\
sort
```

## 파드 레이블로 필터링된 컨테이너 이미지 목록 보기

특정 레이블에 맞는 파드를 지정하기 위해서 -l 플래그를 사용한다. 아래의
명령어 결과값은 `app=nginx` 레이블에 일치하는 파드만 출력한다.

```shell
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" -l app=nginx
```

## 파드 네임스페이스로 필터링된 컨테이너 이미지 목록 보기

특정 네임스페이스의 파드를 지정하려면, 네임스페이스 플래그를 사용한다.
아래의 명령어 결과값은 `kube-system` 네임스페이스에 있는 파드만 출력한다.

```shell
kubectl get pods --namespace kube-system -o jsonpath="{.items[*].spec.containers[*].image}"
```

## jsonpath 대신 Go 템플릿을 사용하여 컨테이너 이미지 목록 보기

jsonpath의 대안으로 Kubectl은 [Go 템플릿](https://pkg.go.dev/text/template)을 지원한다.
다음과 같이 결과값의 서식을 지정할 수 있다.

```shell
kubectl get pods --all-namespaces -o go-template --template="{{range .items}}{{range .spec.containers}}{{.image}} {{end}}{{end}}"
```

## 다음 내용

### 참조

* [Jsonpath](/ko/docs/reference/kubectl/jsonpath/) 참조
* [Go 템플릿](https://pkg.go.dev/text/template) 참조
