Helmをインストールして動作を確認する

#はじめに
Helmは「The package manager for Kubernetes」ということで、Kubernetesのパッケージマネージメントツールです。RH系のyumみたいなものですね。
通常Kubernetesで何らかのサービスをデプロイする場合は、Podをデプロイして、その設定情報をConfigMapやSecretで用意し、クラスタ外に通信するためのServiceをデプロイしたりします。Helmを使うとこれらをまとめてデプロイしてくれることになります。

今回はこのHelmをインストールしてパッケージをHelmからデプロイしてみたいと思います。

#Helmのインストール
以下に沿ってインストールします。
https://helm.sh/ja/docs/intro/install/

##インストールスクリプトのダウンロードと実行
```
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh
Error: could not find tiller
Helm v3.2.4 is available. Changing from version .
Downloading https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm
```
Helm Ver.3からはTillerが不要になったのですが、Tillerが見つからないとエラーが出ています。
インストールはできているようなので、無視して先に進みます。

バージョンを確認します。

```
$ helm version
version.BuildInfo{Version:"v3.2.4", GitCommit:"0ad800ef43d3b826f31a5ad8dfbb4fe05d143688", GitTreeState:"clean", GoVersion:"go1.13.12"}
```

#リポジトリとパッケージの検索
Helmではパッケージのことを「Chart」と呼びます。helmコマンドを使って、パッケージを検索してみます。

##パッケージの検索
`helm search hub`コマンドでHelm Hubを検索します。

```
$ helm search hub wordpress
URL                                                     CHART VERSION   APP VERSION     DESCRIPTION
https://hub.helm.sh/charts/bitnami/wordpress            9.4.0           5.4.2           Web publishing platform for building blogs and ...
https://hub.helm.sh/charts/presslabs/wordpress-...      0.10.2          0.10.2          Presslabs WordPress Operator Helm Chart
https://hub.helm.sh/charts/presslabs/wordpress-...      v0.10.0         v0.10.0         A Helm chart for deploying a WordPress site on ...
```

##ローカルリポジトリの追加
初期状態ではリポジトリが何も設定されていないので、ローカル環境にリポジトリを追加します。

```
$ helm repo list
Error: no repositories to show
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" has been added to your repositories
$ helm repo list
NAME    URL
stable  https://kubernetes-charts.storage.googleapis.com/
```

`helm search repo`コマンドでローカルリポジトリを検索します。

```
$ helm search repo wordpress
NAME                    CHART VERSION   APP VERSION     DESCRIPTION
stable/wordpress        9.0.3           5.3.2           DEPRECATED Web publishing platform for building...
```

#パッケージのインストール
##wordpress
インストールの準備ができましたので、リポジトリからパッケージをインストールします。

```
$ helm install wordpress stable/wordpress
WARNING: This chart is deprecated
NAME: wordpress
LAST DEPLOYED: Tue Aug  4 21:57:54 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
This Helm chart is deprecated

・・・

To access your WordPress site from outside the cluster follow the steps below:

1. Get the WordPress URL by running these commands:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace default -w wordpress'

   export SERVICE_IP=$(kubectl get svc --namespace default wordpress --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
   echo "WordPress URL: http://$SERVICE_IP/"
   echo "WordPress Admin URL: http://$SERVICE_IP/admin"

2. Open a browser and access WordPress using the obtained URL.

3. Login with the following credentials below to see your blog:

  echo Username: user
  echo Password: $(kubectl get secret --namespace default wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode
```

インストール後のアクセス方法なども出力されますね。

`helm list`でStatusなどが確認できます。

```
$ helm list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
wordpress       default         1               2020-08-04 21:57:54.573193726 +0900 JST deployed        wordpress-9.0.3 5.3.2
```

###Kubernetesのリソース確認
kubectlコマンドでKubernetesリソースを確認します。

```
$ kubectl get pod | grep word
wordpress-5667d74df4-bdkmm   0/1     Pending   0          4m44s
wordpress-mariadb-0          0/1     Pending   0          4m44s
$ kubectl get svc | grep word
wordpress           LoadBalancer   10.110.221.143   10.20.30.151   80:30801/TCP,443:32703/TCP   4m55s
wordpress-mariadb   ClusterIP      10.105.56.50     <none>         3306/TCP                     4m55s
```
PodとServiceが2つずつデプロイされていますね。ただ、PodはPending状態です。

Podの詳細を確認します。

```
$ kubectl describe pod wordpress-mariadb-0
Name:           wordpress-mariadb-0
Namespace:      default
・・・
Events:
  Type     Reason            Age                  From               Message
  ----     ------            ----                 ----               -------
  Warning  FailedScheduling  69s (x3 over 2m39s)  default-scheduler  running "VolumeBinding" filter plugin for pod "wordpress-mariadb-0": pod has unbound immediate PersistentVolumeClaims
```
PVがClaimできてないようです。もう一つのPodも同じ状態でした。

PVCまではパッケージングされていますが、PVは事前に用意しておかないといけないようですね。

```
$ kubectl get pvc
NAME                       STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
data-wordpress-mariadb-0   Pending                                                     6m
wordpress                  Pending                                                     6m
```

##nginx
事前準備がいらなさそうなものとしてnginxをインストールしてみます。

リポジトリを追加してからインストールします。

```
$  helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
$ helm repo list
NAME    URL
stable  https://kubernetes-charts.storage.googleapis.com/
bitnami https://charts.bitnami.com/bitnami
```

```
$ helm install nginx-helm bitnami/nginx
NAME: nginx-helm
LAST DEPLOYED: Tue Aug  4 22:18:07 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Get the NGINX URL:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace default -w nginx-helm'

  export SERVICE_IP=$(kubectl get svc --namespace default nginx-helm --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
  echo "NGINX URL: http://$SERVICE_IP/"
```

###Kubernetesのリソース確認
同様にリソースを確認します。

```
$ kubectl get pod nginx-helm-5bc5bb68b9-5g8nh
NAME                          READY   STATUS    RESTARTS   AGE
nginx-helm-5bc5bb68b9-5g8nh   1/1     Running   0          60s
$ kubectl get svc nginx-helm
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                      AGE
nginx-helm   LoadBalancer   10.100.171.112   10.20.30.152   80:31116/TCP,443:31492/TCP   12m
```
PodとServiceが一つずつデプロイされています。

疎通も確認します。

```
$ curl -s 10.20.30.152:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
・・・
```

#まとめ
マニフェストファイルを用意しないで、コマンド一発でPodとServiceなどをデプロイしてくれるのは便利ですね。
ただ、全てのパッケージがHelmだけでデプロイできる訳ではなく、事前準備が必要なものもあるということがわかりました。