本記事ではKubernetesの周辺技術の一つとして使われているHelmを、実際に触って理解をしたい方向けにハンズオンを掲載しています。
やること
- DockerでKubernetes構築(kubernetes-dashboardのデプロイ)
- Helmでnginxのデプロイ
対象者
・Kubernetes、Helmの概要を知りたい方
・概要だけでなくKubernetes、Helmを実際に動かして理解したい方
・Kubernetesはなんとなく分かってきたけど、Helmはまだ触ったことがない方
前提(バージョン)
###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」を押下する。
2.kubernetesを有効にする
kubernetesを有効にする。
Enable Kubernetesにチェックを入れてapplyをクリック
(※kubernetesの起動に少々時間がかかります。)
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/」 でアクセスを行ってください。
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」と入力して表示が以下のようになっていればデプロイ完了です。
#お掃除
最後にデプロイしたリソースを削除しましょう。
$ 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