# Helm으로 Nginx 배포

## 1. 차트 저장소 업데이트

Helm은 [차트](https://github.com/helm/helm/blob/master/docs/charts.md)라는 패키징 형식을 사용합니다. 차트는 쿠버네티스 리소스를 설명하는 파일과 템플릿들의 모음집 입니다.

차트는 독립형 웹 서버를 기술하는 것과 같이 간단한 것 부터 웹 서버를 포함한 전체 웹 애플리케이션 스택, 데이터베이스, 프록시 등을 나타내는 것과 같이 더 복잡한 것을 다룰 수 있습니다.

`kubectl`을 통해 쿠버네티스 리소스를 수동으로 설치하는 대신 Helm을 사용하여 오류나 다른 가능성을 줄이면서 사전 정의 된 차트를 더 빠르게 설치할 수 있습니다.

차트 저장소는 업데이트 및 새롭게 추가되는 기능으로 인해 자주 변경됩니다. Helm의 로컬 목록을 이러한 모든 변경 사항으로 업데이트 되도록 유지하기 위해 [repository update](https://helm.sh/docs/helm/helm_repo_update) 명령을 실행 해야 합니다.

Helm의 로컬 차트 목록을 업데이트 하려면 다음을 실행하십시오.

```
# first, add the default repository, then update
helm repo add stable https://charts.helm.sh/stable
helm repo update

```

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhCdNctbwXauxES9D3F%2Fimage.png?alt=media\&token=8e3affbb-69d3-4688-ab27-bbc285c7f228)

## 2. 차트 저장소 검색

이제 저장소 차트 목록이 업데이트 되었으므로 [차트에서 검색](https://helm.sh/docs/helm/#helm-search/) 할 수 있습니다. 모든 차트를 나열 하려면 다음의 명령어를 입력합니다.

```
helm search repo
```

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhCdp1E3T9aSMehTkjn%2Fimage.png?alt=media\&token=3e7e03f7-629f-47c1-9234-371bf2b159bb)

출력에서 우리가 추가 한 모든 차트 목록을 확인 할 수 있습니다. 키워드를 포함하여 훨씬 더 유용한 검색을 할 수 있습니다.

다음으로 nginx 웹 서버 차트를 검색합니다.

```
helm search repo nginx
```

그 결과는 다음과 같습니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhCe8onaGtnopb75hJX%2Fimage.png?alt=media\&token=025cd9b9-2d7e-44c3-91f9-da067168eb54)

{% hint style="info" %}
명령어에 대한 추가 정보는 [이곳](https://helm.sh/docs/helm/helm_search_repo/)에서 찾을 수 있습니다.
{% endhint %}

## 3. Bitnami 저장소 추가

이전 단계에서 NGINX가 기본 Helm 차트 저장소를 통해 여러개의 다른 제품을 제공하는 것을 알 수 있었습니다. NGINX 독립형 웹 서버는 그 중 하나 입니다.

빠른 웹 검색으로 [Bitnami Chart 저장소](https://github.com/bitnami/charts)를 통해 사용 가능한 NGINX 독립형 웹 서버에 대한 차트가 있음을 발견 하였습니다.

검색 가능한 차트의 로컬 목록에 Bitnami 차트 리포지토리를 추가 하기 위해 아래 명령어를 수행합니다.

```
helm repo add bitnami https://charts.bitnami.com/bitnami
```

완료되면 모든 Bitnami 차트를 검색 할 수 있습니다:

```
helm search repo bitnami
```

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhCfPJ2G4G2u_IvmgdG%2Fimage.png?alt=media\&token=d9807a35-c379-4acc-adac-52b32065c8e9)

nginx를 다시 한 번 검색하면:

```
helm search repo nginx
```

이제 두 저장소에서 더 많은 nginx 옵션을 볼 수 있습니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhCfecPPwNB7uF-ZJvP%2Fimage.png?alt=media\&token=4040a645-0d34-41fe-a058-6e325139ec6b)

nginx에 대해 Bitnami 저장소에서 검색할 수 도 있습니다.

```
helm search repo bitnami/nginx
```

우

```
NAME                                    CHART VERSION   APP VERSION     DESCRIPTION
bitnami/nginx                           5.1.6           1.16.1          Chart for the nginx server
bitnami/nginx-ingress-controller        5.3.4           0.29.0          Chart for the nginx Ingress...
```

In both of those last two searches, we see

```
bitnami/nginx
```

as a search result. That’s the one we’re looking for, so let’s use Helm to install it to the EKS cluster.

다른 방법으로 nginx에 대해 Bitnami 저장소에서 검색 하여 검색 범위를 좁힐 수 있습니다.

```
helm search repo bitnami/nginx
```

검색 결과에서 실습에 필요한 nginx를 찾았으므로, Helm을 사용하여 EKS 클러스터에 설치합니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhCgNkTpQvur7KWJ-LU%2Fimage.png?alt=media\&token=f6e633b7-771c-40ad-88bc-0f570a6f4caf)

## 4. bitnami/nginx 설치

[helm install](https://helm.sh/docs/helm/helm_install/) 명령어를 사용하여 Bitnami 독립형 nginx 웹 서버 차트를 설치 합니다.

Helm 차트는 쿠버네티스 클러스터 내에 여러 번 설치 할 수 있습니다. 이것은 차트의 설치가 사용자 별로 다른 목적에 맞게 변경 할 수 있기 때문 입니다. 따라서 설치 시 고유한 이름을 제공해야 합니다.

`helm` 유틸리티를 사용하여 `bitnami/nginx` 차트를 `설치` 하십시오. 쿠버네티스 배포에 ‘mywebserver’라는 이름을 지정합니다. [helm 설치](https://helm.sh/docs/intro/quickstart/#install-an-example-chart) 문서를 작성하거나`helm install --help` 명령을 실행 하여 명령 구문을 확인합니다.

```
helm install mywebserver bitnami/nginx
```

이 명령을 실행하면 출력에 다음과 같은 유사한 배포 상태, 개정, namespace 등에 대한 정보가 포함 됩니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhChQhzmNT4ZRAUWCFQ%2Fimage.png?alt=media\&token=53b26da4-0c63-447e-955f-57e149c45418)

기본 쿠버네티스 서비스, Pod 및 배포를 검토 하려면 다음을 실행 합니다.

```
kubectl get svc,po,deploy
```

{% hint style="warning" %}
다음`kubectl` 명령 예제에서 각 개체의 ‘DESIRED’및 ‘CURRENT’값이 일치 하는데 1,2분 정도 걸릴 수 있습니다. 첫 번째 시도에서 일치하지 않으면 몇 초간 기다린 다음 명령을 다시 실행하여 상태를 확인 하십시오.
{% endhint %}

이 출력에 표시된 첫 번째 개체는 [Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) 입니다. Deployment 객체는 다양한 버전의 롤아웃 (및 롤백) 애플리케이션을 관리 합니다.

다음 명령을 실행 하여 Deployment 객체를 더 자세히 확 할 수 있습니다.

```
kubectl describe deployment mywebserver
```

차트에 의해 생성 된 다음 개체는 [Pod](https://kubernetes.io/docs/concepts/workloads/pods/pod/) 입니다. Pod는 하나 이상의 컨테이너 그룹 입니다.

Pod 객체가 성공적으로 배포되었는지 확인하기 위해 다음 명령을 실행 할 수 있습니다.

```
kubectl get pods -l app.kubernetes.io/name=nginx
```

이 차트가 생성하는 세 번째 개체는 [Service](https://kubernetes.io/docs/concepts/services-networking/service/) 입니다. Service는 인터넷이나 Elastic Load Balancer(ELB)가 nginx 웹 서버에 연결할 수 있게 합니다.

이 Service의 전체 URL을 얻으려면 다음을 실행하십시오:

```
kubectl get service mywebserver-nginx -o wide
```

다음과 유사한 출력이 표시됩니다. `EXTERNAL-IP`의 값을 복사하고 웹 브라우저에서 새 탭에 붙여 넣습니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhCiVVwzXoy4RrI0w2-%2Fimage.png?alt=media\&token=de491385-addd-4129-a306-fb8c0483fd30)

{% hint style="warning" %}
ELB 및 관련 DNS 이름을 사용할 수있게되는 데 몇 분 정도 걸릴 수 있습니다. 오류가 발생하면 1 분 정도 기다렸다가 재로드를 누르십시오.
{% endhint %}

Service가 온라인 상태가 되면 다음과 유사한 환영 메시지가 표시됩니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhCig8PvRjbHvWz37JB%2Fimage.png?alt=media\&token=d4ff8e1d-6158-4268-8c3a-be97bf6eefef)

## 5. 정리하기

Helm 차트에서 생성한 모든 개체를 제거하려면 [Helm delete](https://helm.sh/docs/helm/helm_uninstall/)를 사용할 수 있습니다.

애플리케이션을 제거하기 전에 [Helm list](https://helm.sh/docs/helm/helm_list/) 명령을 통해 실행중인 항목을 확인할 수 있습니다.

```
helm list
```

다음과 유사한 mywebserver가 설치 되었음을 보여주는 출력이 표시 되어야 합니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhCivSfZfU0iy8d5gri%2Fimage.png?alt=media\&token=4b05b716-0899-4372-9f1e-c05463ea60cc)

제거 하기 위해서 다음 명령을 실행 합니다:

```
helm uninstall mywebserver
```

다음과 같은 결과를 확인 할 수 있습니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhByH33eTdjfCd2bCjB%2F-MhCj4UhSpNFKcbZbnae%2Fimage.png?alt=media\&token=d1823437-071b-4128-b63f-f27fa8587a60)

kubectl은 또한 pod와 service를 더 이상 사용할 수 없음을 보여줍니다.

```
kubectl get pods -l app.kubernetes.io/name=nginx
kubectl get service mywebserver-nginx -o wide
```

이것으로 정리가 완료되었습니다.
