【ハンズオン】Docker+KubernetesでHelmを使ってみよう

![noname.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178837/3f9870ba-ce51-958e-00a8-840b70f0666c.png)

本記事ではKubernetesの周辺技術の一つとして使われているHelmを、実際に触って理解をしたい方向けにハンズオンを掲載しています。

# やること
- DockerでKubernetes構築（kubernetes-dashboardのデプロイ）
- Helmでnginxのデプロイ

# 対象者
・Kubernetes、Helmの概要を知りたい方
・概要だけでなくKubernetes、Helmを実際に動かして理解したい方
・Kubernetesはなんとなく分かってきたけど、Helmはまだ触ったことがない方

# 前提(バージョン)
###docker desktop　2.2.0.3
<img width="757" alt="スクリーンショット 2020-02-18 0.38.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178837/7d916e57-ede0-1535-1df5-6ec1a154a98d.png">

###Kubernetes　v1.15.5
<img width="1042" alt="スクリーンショット 2020-02-18 0.37.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178837/1148e246-70dd-debe-35b6-c764554b27c7.png">

###kubectl

```

$  kubectl version --short --client
Client Version: v1.17.1
```

####helm

```

$ helm version
version.BuildInfo{Version:"v3.1.0", GitCommit:"b29d20baf09943e134c2fa5e1e1cab3bf93315fa", GitTreeState:"clean", GoVersion:"go1.13.8"}
```

#本ハンズオンを行う上での注意事項
本ハンズオンでは、Helm3を利用しています。
Helm2で行った場合、本記事で記載している方法と実行方法が異なることがあるためできる限り上記のバージョンに合わせてハンズオンを実施いただくことを推奨します。

# Kubernetesを使ってみる
Kubernetesとは、デプロイ、スケーリング、アプリやコンテナの運用自動化を実現するオープンソースのプラットフォームです。
リソースを定義したyaml形式のファイルを利用してアプリやミドルウェアを構築します。
またリソースの使用状態に合わせて安定的にスケーリングさせることが可能です。

## 1.Docker Desktop for Macをインストールする。
https://hub.docker.com/editions/community/docker-ce-desktop-mac
「Get Docker」を押下する。
<img width="1336" alt="スクリーンショット 2020-02-17 23.28.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178837/2383203d-920f-e345-f39b-c37df6b1a5ed.png">

## 2.kubernetesを有効にする
dockerアプリからpreferencesを開き。
<img width="282" alt="スクリーンショット 2020-02-17 23.37.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178837/12c59ca0-dda1-171b-ca1b-7d1dddb60ee9.png">

kubernetesを有効にする。
Enable Kubernetesにチェックを入れてapplyをクリック
(※kubernetesの起動に少々時間がかかります。)
<img width="1032" alt="スクリーンショット 2020-02-17 23.39.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178837/92f2c3aa-8205-7841-ec16-872034d59bf8.png">

## 3.起動確認 context切り替え
「docker-desktop」 が存在することを確認します。

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

次にcontextを切り替えます。

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

## 4.kubectlコマンドでkubernetes-dashboardのデプロイ
kubectlコマンドでkubernetes-dashboardというアプリケーションをデプロイしてみましょう。

```
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc5/aio/deploy/recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
```

## 5.起動確認
localhostとKubernetes API Serverの間にプロキシサーバーまたはアプリケーションレベルのゲートウェイを作成して、アプリケーションにアクセスします。

```
$ kubectl proxy
Starting to serve on 127.0.0.1:8001
```

ブラウザから以下のURLでアクセスしてください。
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
※「8001」というポート番号だけは5の手順で行った「127.0.0.1:8001」の8001に合わせてください。仮に「127.0.0.1:8002」だった場合、「http://localhost:8002/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/」 でアクセスを行ってください。

アクセスをすると以下のような画面になるかと思います。
<img width="1345" alt="スクリーンショット 2020-02-17 23.55.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178837/71c19ac5-0563-d8f9-55d0-f3607d0fc776.png">

## 6.トークンの取得
ダッシュボード へアクセスするにはアクセストークンを発行する必要があります。
ターミナルを新規ウィンドウで立ち上げて以下のコマンドを実行して取得しましょう。

```
$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep eks-admin | awk '{print $1}')
```

結果がたくさん出てくるかと思いますが、どこでも良いので「token: 」の値だけまるっとコピーしてください。

## 7.ダッシュボード へアクセス
「トークン」を選択し、先程の値を貼り付けて「サインイン」を押下してください。

# Helmを使ってみる
Kubernetesのパッケージマネージャーおよびアプリケーション管理ツールであり、複数のKubernetesリソースをChartと呼ばれるファイルにし、パッケージ管理することが可能です。シンプルなコマンドで複数回、Kubernetesリソースを展開したい場合や、他のアプリケーションおよびサービスの特定のバージョンを使用して、アプリケーションの依存関係を管理したい時に利用されます。

## 1.Helmのインストール
Homebrewでインストールします。

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

インストールされたか確認しましょう。

```
$ helm version
version.BuildInfo{Version:"v3.1.0", GitCommit:"b29d20baf09943e134c2fa5e1e1cab3bf93315fa", GitTreeState:"clean", GoVersion:"go1.13.8"}
```

念のためhelmのレポジトリを最新化させます。

```
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "stable" chart repository
...Successfully got an update from the "bitnami" chart repository
Update Complete. ⎈ Happy Helming!⎈ 
```

## 2.bitnamiをHelmクライアント環境へ追加する
helmレポジトリにbitnamiを追加します。このようにhelmレポジトリに資材が追加されることにより、yamlファイルを使用せずとも複数回同じリソースを展開することができるようになります。
※bitnamiとは？
BitnamiはWordPressやRedmineなどのウェブアプリケーションをPHPやMySQLなどのミドルウェアとともに一式設定済みでパッケージ化して提供してくれるソリューションです。

```
$ helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
```

## 3.新しいリリースの作成とKubernetesにデプロイ
Kubernetesにnginxをデプロイします。

```
$ helm install nginxserver bitnami/nginx 
NAME: nginxserver
LAST DEPLOYED: Tue Feb 18 00:10:51 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 nginxserver'

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

```

## 4.確認
 デプロイしたnginxを確認しましょう。

```
$ kubectl get pods -l app.kubernetes.io/name=nginx
NAME                           READY   STATUS    RESTARTS   AGE
nginxserver-7f8f4c554d-xfmzc   1/1     Running   0          5m26s

$ kubectl get service nginxserver
NAME          TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
nginxserver   LoadBalancer   10.104.187.33   localhost     80:30421/TCP,443:31118/TCP   5m45s
```

ブラウザで「localhost」と入力して表示が以下のようになっていればデプロイ完了です。
<img width="1339" alt="スクリーンショット 2020-02-17 22.45.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178837/ee37937b-59ad-4c99-5bf2-18ed7f6f79c2.png">

#お掃除
最後にデプロイしたリソースを削除しましょう。


```
$ kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc5/aio/deploy/recommended.yaml
$ kubectl delete svc nginxserver
```

#もっと実践的にKubernetes周辺技術を学びたい方へ
Amazon EKS Workshopの記載されている手順にしたがってハンズオンすることをお勧めします。
https://eksworkshop.com/

上記のハンズオンでは、

- Kubernetes
- Helm
- EKS
- RBAC
- Elasticsearch
- Grafana

など今求められているKubernetesの周辺技術を網羅的に学習できるため大変お勧めです。
時間があればぜひ試してみてください。


#おまけ
最初に注意事項でも書きましたが、Helm2ハンズオンを行いたい場合は以下の手順を参考ください。※古いバージョンとなるため動作は保証できませんのでご理解ください。

## 1.Helmのインストール

```
$ cd ~/downloads
$ curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
$ chmod +x get_helm.sh
$ ./get_helm.sh
```

## 2.tillerのインストール
helmコマンドを使用して、tillerをクラスターにインストールします。
これでクラスター内のリソースを管理するためのアクセスが許可されます。
※tillerとは？
Helmでリソースをサーバ側にchartをデプロイした場合、
chartが直接デプロイされるわけでなく、tillerという形でデプロイ先のサーバに置かれる

```
$ helm init --docker-desktop  tiller
```

## 3.Helmレポジトリへの追加

```
$ helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
```

## 4.nginxをインストールする。
ここがhelm3と異なっておりオプション「 --name 」を指定する必要があります。

```
$ helm install --name mywebserver bitnami/nginx
```