フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【手順あり】実際に使ってみて学ぼう「kubernetes Helm」とは?

f:id:lirlia:20200415031332p:plain

この記事では

  • Helmとは?
  • Helmをインストールして、実際にパッケージをいれる手順

を紹介していきます。

環境

名前 バージョン
OS CentOS Linux release 7.6.1810 (Core)
kubelet v1.18.1
kubeadm v1.18.1
docker v1.13.1
Helm v2.16.5

Helmとは?

Helmとはkubernetesのパッケージマネージャーです。

RedHat系でいうところのyumであり、Debian系のaptに相当します。

例えばApache+PHP+MySQLのLAMP構成をmanifestで作る場合は(作りにもよりますが)これらが必要です。

apache.yaml / php.yaml / mysql.yaml

kubernetesのいろいろな機能を使おうと思ったらこれ以上になることも珍しくありません。


こうなると「同じ環境を再現するのが大変だよね」とか「一回でいれたいよね」という要望がでてきます。これを解決するのがHelmです。

Helmを使えば先ほどの3つのyamlを含むChart(チャート)をインストールするだけで同じことが実現できるようになります。

作業手順

実際にHelmを使ってみましょう。(kubernetesクラスタを用意してください)

kubernetesをkubeadmでVagrant上のCentOS7にインストールする - フラミナル

Helm Clientのインストール

まずはHelmを扱うためのCLIツールをインストールしましょう。

ここからダウンロードして、/usr/local/binに移動します。

wget https://get.helm.sh/helm-v2.16.5-linux-amd64.tar.gz
tar xvfpz helm-v2.16.5-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/
export PATH=$PATH:/usr/local/bin/
source <(helm completion bash)

Helm を開始する

続いてHelmが実行できるようにhelm-adminユーザを作り、ClusterRole(Cluster-Admin)の権限を付与しましょう。

[root@master vagrant]# kubectl -n kube-system create serviceaccount helm-admin
serviceaccount/helm-admin created
  
[root@master vagrant]# kubectl create --save-config clusterrolebinding helm-admin --clusterrole=cluster-admin --user="system:serviceaccount:kube-system:helm-admin"
clusterrolebinding.rbac.authorization.k8s.io/helm-admin created

そしてHelmの利用を開始するためにhelmのリポジトリをローカルに作成します。

[root@master vagrant]# helm init --service-account helm-admin
Creating /root/.helm 
Creating /root/.helm/repository 
Creating /root/.helm/repository/cache 
Creating /root/.helm/repository/local 
Creating /root/.helm/plugins 
Creating /root/.helm/starters 
Creating /root/.helm/cache/archive 
Creating /root/.helm/repository/repositories.yaml 
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com 
Adding local repo with URL: http://127.0.0.1:8879/charts 
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://v2.helm.sh/docs/securing_installation/

コマンドを叩くと早速/root/.helm/repository/repositories.yamlhttps://kubernetes-charts.storage.googleapis.com/というHelm Chartが保存されているURLが登録されました。

Jenkinsをインストールしてみよう

まずは検索してみます。

[root@master vagrant]# helm search jenkins
NAME            CHART VERSION   APP VERSION     DESCRIPTION                                                 
stable/jenkins  1.12.0          lts             Open source continuous integration server. It supports mu...

するとJenkinsのChartバージョン1.12.0が存在することがわかります。これをインストールしてみましょう。


[root@master vagrant]# helm install stable/jenkins --version 1.12.0 --name jenkins-test --set persistence.enabled=false
  
NAME:   jenkins-test
LAST DEPLOYED: Tue Apr 14 14:51:31 2020
NAMESPACE: default
STATUS: DEPLOYED
  
RESOURCES:
==> v1/ConfigMap
NAME                DATA  AGE
jenkins-test        5     1s
jenkins-test-tests  1     1s
  
==> v1/Deployment
NAME          READY  UP-TO-DATE  AVAILABLE  AGE
jenkins-test  0/1    1           0          1s
  
==> v1/Pod(related)
NAME                           READY  STATUS    RESTARTS  AGE
jenkins-test-5bfc44d9c8-9rv5q  0/1    Init:0/1  0         1s
  
==> v1/Role
NAME                          CREATED AT
jenkins-test-schedule-agents  2020-04-14T14:51:32Z
  
==> v1/RoleBinding
NAME                          ROLE                               AGE
jenkins-test-schedule-agents  Role/jenkins-test-schedule-agents  1s
  
==> v1/Secret
NAME          TYPE    DATA  AGE
jenkins-test  Opaque  2     1s
  
==> v1/Service
NAME                TYPE       CLUSTER-IP      EXTERNAL-IP  PORT(S)    AGE
jenkins-test        ClusterIP  10.101.135.166  <none>       8080/TCP   1s
jenkins-test-agent  ClusterIP  10.108.163.160  <none>       50000/TCP  1s
  
==> v1/ServiceAccount
NAME          SECRETS  AGE
jenkins-test  1        1s
  
  
NOTES:
1. Get your 'admin' user password by running:
  printf $(kubectl get secret --namespace default jenkins-test -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
2. Get the Jenkins URL to visit by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/component=jenkins-master" -l "app.kubernetes.io/instance=jenkins-test" -o jsonpath="{.items[0].metadata.name}")
  echo http://127.0.0.1:8080
  kubectl --namespace default port-forward $POD_NAME 8080:8080
  
3. Login with the password from step 1 and the username: admin
  

For more information on running Jenkins on Kubernetes, visit:
https://cloud.google.com/solutions/jenkins-on-container-engine
#################################################################################
######   WARNING: Persistence is disabled!!! You will lose your data when   #####
######            the Jenkins pod is terminated.                            #####
#################################################################################

さてうまくいったようです。--set persistence.enabled=falseをつけたのはkubernetes用のPV(ディスク)が存在しない場合エラーになってしまうからです。(pod has unbound immediate PersistentVolumeClaimsっていうエラーがでます)

さて出力をみると下の方に何かありますね。これはJenkinsに接続するための方法です。やってみましょう。

Jenkinsに接続してみる

[root@master vagrant]# printf $(kubectl get secret --namespace default jenkins-test -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
  
KZAPSZZ5At
[root@master vagrant]# 
[root@master vagrant]# export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/component=jenkins-master" -l "app.kubernetes.io/instance=jenkins-test" -o jsonpath="{.items[0].metadata.name}")
[root@master vagrant]# 
[root@master vagrant]# kubectl --namespace default port-forward --address 0.0.0.0 $POD_NAME 8080:8080

この状態でhttp://[仮想マシンのIPアドレス]:8080にアクセスしてみましょう。

するとこのページが表示されます。

f:id:lirlia:20200415000428p:plain

早速ログインしてみましょう

  • ユーザ:admin
  • パスワード:先ほどコマンドに表示したもの(例:KZAPSZZ5At)

ログインに成功するとこの画面になります。

f:id:lirlia:20200415000131p:plain

Jenkinsを削除する

Helmでいれたものはまとめて削除することができます

[root@master vagrant]# helm del --purge jenkins-test
release "jenkins-test" deleted

MySQLを入れてみる

同じ要領で今度はMySQLを入れてみましょう。

[root@master vagrant]# helm install stable/mysql --set mysqlRootPassword=password,mysqlDatabase=mydb,persistence.enabled=false --name mysql-test

これで入りました。簡単にやりたいのでrootのパスワードをpasswordにして、mydbというテーブルを作成しています。


そしてmysqlに接続してみます。コンテナ(pod)をうまく使うとOSにソフトをインストールしなくてもコマンドを叩くことができます。

今回はmysqlコンテナを作成しmysqlに直接つなぐクライアントとして起動してみます。イラストにするとこんな感じです。

f:id:lirlia:20200415032930p:plain

[root@master vagrant]# kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql-test -u root -ppassword -P 3306
If you don't see a command prompt, try pressing enter.
  
<Enterを押す>  
  
mysql> 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

このように簡単にMySQLを作成することができました。


ではお片づけをしましょう。

[root@master vagrant]# helm del --purge mysql-test;release 
"mysql-test" deleted

変数は外だしして記載できる

先ほどのコマンドですが--set以下が長くなると大変ですよね。

helm install stable/mysql --set mysqlRootPassword=password,mysqlDatabase=mydb,persistence.enabled=false --name mysql-test

そこでhelmではvalues.yamlを作ってこれを--values values.yamlとすることで対応できます。

mysqlRootPassword: password
mysqlDatabase: mydb
persistence:
  enabled: False
helm install stable/mysql --name mysql-test --values values.yaml

いかがだったでしょうか。なんとなくHelmがわかったんじゃないかなと思います。

参考

こちらはHelmをもう少し学んでみたい方向けの書籍です。