概要
k8sを使用した開発なり運用なりしていると、yamlファイルをとにかく
書きまくります!
podのyaml書いて、ServiceやDeploymentも同様に・・・。
もう少し簡単にk8sを使い倒すためのツールとして、Helmというものがあります。
Helmとは?
Kubernetes(以下k8s)のパッケージマネージャーで、
k8sリソースを簡単にデプロイ・管理できるツールを指します!
Helmの構成
さてHelmを使用するにあたり、登場人物が多いので軽く記載しておきます!
- context: 操作対象のk8sクラスタを設定します(今回はdocker-desktopを使用)
- tiller: helmコマンドから命令を受け取り、k8sクラスタにデプロイします
- Chart: k8sアプリのパッケージ
- Helm Repository: ざっくり言うと、Chartを保存する場所を指します
今回はBitnamiが提供する、NginxのHelm Cahrtを使用します!
ハンズオン
今回はk8sにnginxをデプロイし、PCのローカルで起動することをゴールにします!
Helmのインストールから実施していきます。
前提
- 今回はDocker Desktopを使用します
- 筆者はMac PCを使用します
- Windowsの方もDocker Desktopは使用できますので、下記記事を参考に構築いただけますと!
余談ですが、この記事によると以前みたいに
WSL2のセットアップが不要なんですね・・・!
Docker Desktopをインストール
まず公式からインストールをお願いします!
k8sを有効化
お馴染みですが、デフォルト設定ではk8sは有効になってないので
Docker Desktopの設定からk8sの有効化をお願いします!
kubectlのインストール
まだインストールしていない方は、Homebrewを使用して
準備をお願いします!
Homebrewはこちら
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の箇所は任意の名前にご変更ください!
これで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のページが見えるはず!
port-forwardとは?
ちなみにport-forwardしないとk8sのServiceには
アクセスできません!
そのためのport-forwardです!
なぜアクセスできないのか?
結論
デフォルトでは、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の同じクラスタからしかアクセス出来ません。
port-forwardの役割
kubectl port-forward を使うと、ローカルPCのポート(例:8080)と
k8s内のPod・Serviceのポート(例:80)を トンネリング できる。
今回のケース↓
$ kubectl port-forward svc/my-nginx 8080:80
これでローカルPCの8080ポートを、クラスタ内部の
my-nginx Serviceに接続できます!
port-forwardなしで外部からアクセスする方法も
ありますが、ここでは割愛します。
下記記事がとても参考になりそうなので、
貼っておきます!
お片付け
デプロイされた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リポジトリが削除されます!