この記事では
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.yaml
にhttps://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
にアクセスしてみましょう。
するとこのページが表示されます。
早速ログインしてみましょう
- ユーザ:admin
- パスワード:先ほどコマンドに表示したもの(例:KZAPSZZ5At)
ログインに成功するとこの画面になります。
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に直接つなぐクライアントとして起動してみます。イラストにするとこんな感じです。
[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をもう少し学んでみたい方向けの書籍です。