Docker/Kubernetes 実践コンテナ開発入門@36日目

Docker/Kubernetes 実践コンテナ開発入門:書籍案内|技術評論社

前回はパッケージ管理ツールの Helm をインストールしました。

今回は Charts のインストール等を進めていきます。

7.3.2 Helm の概念

  • Helm
    • クライアント(cli)とサーバ(k8s クラスタにインストールされている Tiller)で構成
    • クライアントは、サーバに対して命令を行う役割
    • サーバは k8s クラスタに対してパッケージのインストールや更新、削除の処理を k8s クラスタ上で行う
  • Chart
    • マニフェストファイルを構築するためのテンプレート群をパッケージとしてまとめたもの

Helm リポジトリ

  • local

    • Helm のクライアントがインストールされているローカルリポジトリ
    • ローカルで作成した Chart が配置される
  • stable

    • 安定した品質を持った Chart が配置されるリポジトリ
    • GitHub リポジトリに配置されている Chart を利用できる
  • incubator

    • stable の要件を満たしていない Chart が配置されるリポジトリ
  • stable リポジトリはデフォルトで利用可能

  • incubator リポジトリはデフォルトで利用不可

  • incubator リポジトリを利用するには、次の対応をする必要がある。

$ helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com/
"incubator" has been added to your repositories
  • リポジトリから利用できる Chart を検索
$ helm search
NAME                                            CHART VERSION   APP VERSION                     DESCRIPTION
incubator/artifactory                           5.2.2           5.2.0                           DEPRECATED Universal Repository Manager supporting all ma...
incubator/aws-alb-ingress-controller            1.0.4           v1.1.8                          DEPRECATED A Helm chart for AWS ALB Ingress Controller
incubator/azuremonitor-containers               2.7.8           7.0.0-1                         DEPRECATED Helm chart for deploying Azure Monitor contain...
incubator/burrow                                0.3.3           0.17.1                          Burrow is a permissionable smart contract machine
......

Chart の構成

chart_name/ --- templates/ マニフェストファイルのテンプレートディレクトリ
             | |- xxxxx.yaml 各種Kubernetesリソースのマニフェストテンプレート
             | |- _helper.tpl マニフェスト構築に利用されるテンプレートヘルパー
             | |- NOTE.txt Chartの利用方法等のドキュメントのテンプレート
             |
             |- charts/    依存するChartのディレクトリ
             |- Chart.yaml Chart情報の定義ファイル
             |- values.yaml Chartのデフォルトvalueファイル
  • values.yaml

    • デフォルト設定
  • デフォルト設定を上書きするにはカスタム value ファイルを作成する

7.3.3 Chart をインストールする

  • Helm を利用して k8s クラスタへアプリケーションをインストール
  • Redmine の Chart(stable/redmine)をインストールする
  • helm install コマンドで行う
  • 更新・削除する際にリリース名が必要になるので、–name でクラスタ内で一意になるリリース名をつける
helm install [--name リリース名] Chartリポジトリ/Chart名
  • helm install 時、Chart に含まれる values.yaml の設定に基づいてインストールされる。

  • しかし、カスタム value ファイルでデフォルトの設定値を上書きして利用することがほとんど

  • stable 版の Redmine の GitHub リポジトリ

  • 今回もデフォルト値を上書きしてインストールする

  • redmine.yaml

redmineUsername: gihyo # ユーザー名をgihyo
redminePassword: gihyo # パスワードをgihyo
redmineLanguage: ja # 言語を日本語

serviceType: NodePort # Ingressを利用せずにNodePort Serviceを使ってServiceを公開
  • -f オプションでカスタム value ファイルを指定して Redmine をインストール
$ helm install -f redmine.yaml --name redmine stable/redmine --version 4.0.0
Error: validation failed: [unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1", unable to recognize "": no matches for kind "StatefulSet" in version "apps/v1beta1"]
Return the appropriate apiVersion for deployment.
*/}}
{{- define "redmine.deployment.apiVersion" -}}
{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}}
{{- print "extensions/v1beta1" -}}
{{- else -}}
{{- print "apps/v1" -}}
{{- end -}}
{{- end -}}
  • バージョン固定しているため、古い apiversino になっているのか??
  • バージョンを消して再試行。またエラー。
$ helm install -f redmine.yaml --name redmine stable/redmine
Error: failed to download "stable/redmine" (hint: running `helm repo update` may help)
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.8", GitCommit:"9f2892aab98fe339f3bd70e3c470144299398ace", GitTreeState:"clean", BuildDate:"2020-08-13T16:12:48Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"16+", GitVersion:"v1.16.13-gke.404", GitCommit:"81e2afbf51b876d15f0af546998c670207fdd592", GitTreeState:"clean", BuildDate:"2020-10-30T23:52:44Z", GoVersion:"go1.13.9b4", Compiler:"gc", Platform:"linux/amd64"}
  • Helm のバージョンはクリアしている
$ helm version
Client: &version.Version{SemVer:"v2.14.0", GitCommit:"05811b84a3f93603dd6c2fcfe57944dfa7ab7fd0", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.0", GitCommit:"05811b84a3f93603dd6c2fcfe57944dfa7ab7fd0", GitTreeState:"clean"}
$ helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories

$ helm install -f redmine.yaml --name redmine bitnami/redmine
NAME:   redmine
LAST DEPLOYED: Sat Nov 21 00:45:06 2020
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/ConfigMap
NAME             DATA  AGE
redmine-mariadb  1     1s

==> v1/Deployment
NAME     READY  UP-TO-DATE  AVAILABLE  AGE
redmine  0/1    1           0          0s

==> v1/PersistentVolumeClaim
NAME     STATUS   VOLUME    CAPACITY  ACCESS MODES  STORAGECLASS  AGE
redmine  Pending  standard  1s

==> v1/Pod(related)
NAME                      READY  STATUS   RESTARTS  AGE
redmine-6c4f898966-nqbtq  0/1    Pending  0         0s
redmine-mariadb-0         0/1    Pending  0         0s

==> v1/Secret
NAME             TYPE    DATA  AGE
redmine          Opaque  2     1s
redmine-mariadb  Opaque  2     1s

==> v1/Service
NAME             TYPE          CLUSTER-IP     EXTERNAL-IP  PORT(S)       AGE
redmine          LoadBalancer  10.55.247.140  <pending>    80:30277/TCP  0s
redmine-mariadb  ClusterIP     10.55.251.137  <none>       3306/TCP      1s

==> v1/ServiceAccount
NAME     SECRETS  AGE
redmine  1        1s

==> v1/StatefulSet
NAME             READY  AGE
redmine-mariadb  0/1    0s


NOTES:


1. Get the Redmine 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 redmine'


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

2. Login with the following credentials

  echo Username: gihyo
  echo Password: $(kubectl get secret --namespace default redmine -o jsonpath="{.data.redmine-password}" | base64 --decode)
  • リリース一覧でインストールできたことを確認する。
$ helm ls
NAME    REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE
redmine 1               Sat Nov 21 00:45:06 2020        DEPLOYED        redmine-14.2.13 4.1.1           default
  • リソース確認
    • リリース名を redmine にしたけど、db しか確認できない…
$ kubectl get service,deployment --selector release=redmine
NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/redmine-mariadb   ClusterIP   10.55.251.137   <none>        3306/TCP   13m
  • また、NodePort になっているはずだけど、LoadBalancer のまま…
$ kubectl get service,deployment
NAME                      TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
service/basic-auth        NodePort       10.55.248.194   <none>           80:30060/TCP   3d
service/kubernetes        ClusterIP      10.55.240.1     <none>           443/TCP        3d2h
service/redmine           LoadBalancer   10.55.247.140   35.xxx.xxx.xxx   80:30277/TCP   19m
service/redmine-mariadb   ClusterIP      10.55.251.137   <none>           3306/TCP       19m

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/basic-auth   1/1     1            1           3d
deployment.apps/redmine      1/1     1            1           19m
  • 一旦、EXTERNAL-IP から確認できた。

Redmine

7.3.4 Chart でアプリケーションをアンインストールする

  • リリース名を指定して Chart を削除する
$ helm delete redmine
release "redmine" deleted
  • Helm にはロールバック機能がある。指定したリビジョンに戻れる。
  • リビジョン番号を確認する
$ helm ls --all
NAME    REVISION        UPDATED                         STATUS  CHART           APP VERSION     NAMESPACE
redmine 1               Sat Nov 21 00:45:06 2020        DELETED redmine-14.2.13 4.1.1           default
  • ロールバックする場合
$ helm rollback redmine 1
  • リビジョンの記録を残さず削除する場合
$ helm del --purge redmine

今日の学び

  • helm install で Chart をインストールしてくると、そのまま Chart のマニフェストファイルを使ってクラスタにアプリケーションが展開される。設定等は大変だと思うが、出来てしまえばワンコマンドでアプリケーション構築が出来てしまう夢のようなツール
Hugo で構築されています。
テーマ StackJimmy によって設計されています。