【k8s】Kubernetes Helmでnginxを起動してみよう!

## 概要
k8sを使用した開発なり運用なりしていると、yamlファイルをとにかく
書きまくります！

podのyaml書いて、ServiceやDeploymentも同様に・・・。
もう少し簡単にk8sを使い倒すためのツールとして、**Helm**というものがあります。


## Helmとは？
Kubernetes（以下k8s）のパッケージマネージャーで、
k8sリソースを簡単にデプロイ・管理できるツールを指します！

https://helm.sh/

:::note info
### k8sリソース例
- pod
- Deployment
- Service
- ConfigMap
etc
:::

## Helmの構成

さてHelmを使用するにあたり、登場人物が多いので軽く記載しておきます！
- context: 操作対象のk8sクラスタを設定します(今回はdocker-desktopを使用)
- tiller: helmコマンドから命令を受け取り、k8sクラスタにデプロイします
- Chart: k8sアプリのパッケージ 
- Helm Repository: ざっくり言うと、Chartを保存する場所を指します

:::note info
今回はBitnamiが提供する、NginxのHelm Cahrtを使用します！
:::

## ハンズオン
今回はk8sにnginxをデプロイし、PCのローカルで起動することをゴールにします！
Helmのインストールから実施していきます。

### 前提
- 今回はDocker Desktopを使用します
- 筆者はMac PCを使用します
- Windowsの方もDocker Desktopは使用できますので、下記記事を参考に構築いただけますと！

https://qiita.com/zembutsu/items/a98f6f25ef47c04893b3

:::note info
余談ですが、この記事によると以前みたいに
WSL2のセットアップが不要なんですね・・・！
:::

### Docker Desktopをインストール
まず公式からインストールをお願いします！

https://docs.docker.com/docker-for-mac/

### k8sを有効化
お馴染みですが、デフォルト設定ではk8sは有効になってないので
Docker Desktopの設定からk8sの有効化をお願いします！

:::note info
### 手順
1. Docker Desktopを開く
1. Settings（設定） > Kubernetes
1. 「Enable Kubernetes」 にチェックを入れる
1. 「Apply & Restart」 を押す
:::

![スクリーンショット 2025-03-09 1.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/2ad199d4-0ee0-4ba1-9e26-ce6e18283555.png)


### kubectlのインストール
まだインストールしていない方は、Homebrewを使用して
準備をお願いします！

#### Homebrewはこちら

https://brew.sh/

#### kubectlのインストール

```
$ brew install kubectl
$ kubectl version
```

#### kubectlのインストール後、コンテキスト設定

```
$ kubectl config get-contexts
CURRENT   NAME                  CLUSTER               AUTHINFO              NAMESPACE
*         docker-desktop        docker-desktop        docker-desktop
```

CURRENTがdocker-desktopになっていなかった場合、
docker-desktopに切り替えましょう！

```
$ kubectl config use-context docker-desktop
Switched to context "docker-desktop".
```

### Helmのインストール
ようやくHelmの設定になります。
まずはインストールしましょう！

```
$ brew install kubernetes-helm
$ helm version
```

#### インストールしたらまずはアップデート

```
$ helm repo update
```
### HelmでNginxをデプロイしよう！

まずは公式リポジトリ（Bitnami）を入れましょう!

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

一応リポジトリを更新しておきます。。

```
$ helm repo update
```

ちなみに登録可能なリポジトリを一覧化できます！
```
$ helm repo list
NAME                	URL
prometheus-community	https://prometheus-community.github.io/helm-charts
bitnami             	https://charts.bitnami.com/bitnami
```

#### Chartを検索！
次に利用可能なChartを検索します！

```
$ helm search repo nginx
NAME                                          	CHART VERSION	APP VERSION	DESCRIPTION
bitnami/nginx                                 	19.0.1       	1.27.4     	NGINX Open Source is a web server that can be a...
bitnami/nginx-ingress-controller              	11.6.11      	1.12.0     	NGINX Ingress Controller is an Ingress controll...
bitnami/nginx-intel                           	2.1.15       	0.4.9      	DEPRECATED NGINX Open Source for Intel is a lig...
prometheus-community/prometheus-nginx-exporter	1.0.1        	1.4.1      	A Helm chart for NGINX Prometheus Exporter
```

bitnamiのリポジトリを加えたことで、
nginxのChartが使えるみたいですね！

#### Chartをインストール！

```
$ helm install my-nginx bitnami/nginx
```

こんな感じでnginxのChartをk8sにインストールできます！
**my-nginx**の箇所は任意の名前にご変更ください！

:::note info
これでNginxをk8sにデプロイできました！
ここからはPCで起動していきましょう！
:::

## Nginxを起動しよう！
まずはデプロイが正しくされたか確認しましょう！
(STATUSがRunningになるまで時間がかかるかもしれません)
```
$ kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-5b5586f6df-ddh7v   1/1     Running   0          44m
```

```
$ kubectl get svc
NAME         TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)                      AGE
my-nginx     ClusterIP   10.97.0.86   localhost     80:30657/TCP,443:32451/TCP   45m
```

svc(サービス)の情報を確認し、
**EXTERNAL-IP**に**localhost**があればOK！

### ローカルでNginxにアクセス！

ではアクセスしましょう！
※**svc/my-nginx**はサービス名です
```
$ kubectl port-forward svc/my-nginx 8080:80
```

これで、**http://localhost:8080** にアクセスすれば、
Nginxのページが見えるはず！

![スクリーンショット 2025-03-09 1.25.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/dbf486db-35f7-4213-ad14-bd14bfc6b54c.png)


## port-forwardとは？
ちなみに**port-forward**しないとk8sのServiceには
アクセスできません！

そのためのport-forwardです！

### なぜアクセスできないのか？
:::note info
**結論**
デフォルトでは、k8sのService（ClusterIP）は
クラスタ内部でしかアクセスできないから！
:::

### Service情報を確認！
もう一度k8sにデプロイされたServiceを見てみましょう。

```
$ kubectl get svc
NAME         TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)                      AGE
my-nginx     ClusterIP   10.97.0.86   localhost     80:30657/TCP,443:32451/TCP   45m
```

TYPEが**ClusterIP**になっているのがお分かりでしょうか？
**http://localhost:8080** へのアクセスはローカルPCから実施しています。

しかしClusterIPとして作成されたServiceに対しては、
k8sの同じクラスタからしかアクセス出来ません。

:::note info
### 整理しよう！
- デフォルトでは、Service は ClusterIP として作成される
- ClusterIP の場合、クラスタ内部のPodやServiceからしかアクセスできない
- 外部（ローカルPCやインターネット）からは直接アクセスできない！
:::

### port-forwardの役割
**kubectl port-forward** を使うと、ローカルPCのポート（例：8080）と
k8s内のPod・Serviceのポート（例：80）を トンネリング できる。

#### 今回のケース↓

```
$ kubectl port-forward svc/my-nginx 8080:80
```
これでローカルPCの8080ポートを、クラスタ内部の
**my-nginx** Serviceに接続できます！

:::note warn
port-forwardなしで外部からアクセスする方法も
ありますが、ここでは割愛します。

下記記事がとても参考になりそうなので、
貼っておきます！
:::

https://qiita.com/superbrothers/items/0dca5d2a10727fc14734

## お片付け
デプロイされたNginxやk8sリソースを削除しましょう。

### Helmリソース削除

```
$ helm uninstall my-nginx
```

- my-nginx は、インストール時に指定したリリース名
- 上記コマンドで、Helmによってインストールされたリソース（Pod、Serviceなど）が全て削除されます

### Helmリポジトリの削除
Helmリポジトリを削除するには、helm repo remove コマンドを使います。

```
helm repo remove <リポジトリ名>
```

#### 例：Bitnamiリポジトリを削除したい場合

```
helm repo remove bitnami
```
これで、Helmリポジトリが削除されます！