第469回ではKubernetesの環境を構築しました。今回はそのKubernetes上にソフトウェアスタックを構築する上で便利なパッケージ管理ツール
Kubernetesでパッケージ管理ツールを使う理由
「Helm」
UbuntuのAPTシステムでいうところのDebパッケージファイルがChartで、helm
だとイメージすれば良いでしょう。
Kubernetesにはその役割に応じてさまざまなリソースの概念が存在します。たとえば
kubectl
コマンドはこれら個々のリソースを区別することなく、kubectl create -f YAML
」
ただし、
そこで出てくるのが今回紹介するHelmです。Helmでは、kubectl
コマンドが使うYAMLファイルから設定可能な部分を別YAMLファイルとして分離できます。テンプレートエンジンを使って、kubectl
コマンドに提供するYAMLファイルに反映するのです。また、
パッケージそのものはひとつのアーカイブファイルとして構築します。アクセス可能な箇所であればネットワーク越しにダウンロードしてインストールすることも可能ですし、git clone
したディレクトリをインストール対象としても指定できます。またローカルパッケージリポジトリをKubernetes上に構築可能です。
いずれにせよKubernetesを使うのであれば、
Helmのインストールと初期設定
HelmそのものはGo言語で構築されたひとつのバイナリファイルとして提供されています。よってそのインストール方法は、bin
ディレクトリに展開するだけです。
$ wget https://storage.googleapis.com/kubernetes-helm/helm-v2.4.1-linux-amd64.tar.gz $ tar xvf helm-v2.4.1-linux-amd64.tar.gz $ cp linux-amd64/helm ~/bin/ $ which kubectl /home/willem/bin/helm
Helmを使う前に、helm init
)、helm repo update
)。
$ helm init Creating /home/willem/.helm Creating /home/willem/.helm/repository Creating /home/willem/.helm/repository/cache Creating /home/willem/.helm/repository/local Creating /home/willem/.helm/plugins Creating /home/willem/.helm/starters Creating /home/willem/.helm/repository/repositories.yaml $HELM_HOME has been configured at /home/willem/.helm. Tiller (the helm server side component) has been installed into your Kubernetes Cluster. Happy Helming! $ helm repo update Hang tight while we grab the latest from your chart repositories... ...Skip local chart repository ...Successfully got an update from the "stable" chart repository Update Complete. ⎈ Happy Helming!⎈
この時点でのリポジトリのパッケージリストは、~/.helm/
です。
helm init
によってローカルリポジトリサーバーにインスタンス
$ kubectl --namespace=kube-system get pods NAME READY STATUS RESTARTS AGE kube-dns-806549836-nmn71 3/3 Running 0 8d tiller-deploy-1491950541-h3g40 1/1 Running 0 8m $ kubectl --namespace=kube-system get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns 10.152.183.10 <none> 53/UDP,53/TCP 8d tiller-deploy 10.152.183.252 <none> 44134/TCP 8m
Jenkinsパッケージのインストール
実際の使用例として、
まずリポジトリの検索はhelm search
を、helm inspect
を使います。
$ helm search jenkins NAME VERSION DESCRIPTION stable/jenkins 0.6.2 Open source continuous integration server. It s... $ helm inspect stable/jenkins description: Open source continuous integration server. It supports multiple SCM tools including CVS, Subversion and Git. It can execute Apache Ant and Apache Maven-based projects as well as arbitrary scripts. home: https://jenkins.io/ icon: https://wiki.jenkins-ci.org/download/attachments/2916393/logo.png maintainers: - email: lachlan@deis.com name: Lachlan Evenson - email: viglesias@google.com name: Vic Iglesias name: jenkins sources: - https://github.com/jenkinsci/jenkins - https://github.com/jenkinsci/docker-jnlp-slave version: 0.6.2 (以下略)
helm inspect
はパッケージのメタデータに加えて、helm inspect values Chart名
」
設定値は--set
」--values
」
$ helm install --name chtholly --set Master.ServiceType=ClusterIP,Persistence.Enabled=false stable/jenkins NAME: chtholly LAST DEPLOYED: Fri May 5 07:09:16 2017 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/Secret NAME TYPE DATA AGE chtholly-jenkins Opaque 2 2s ==> v1/ConfigMap NAME DATA AGE chtholly-jenkins-tests 1 2s chtholly-jenkins 3 2s ==> v1/Service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE chtholly-jenkins 10.152.183.160 <none> 8080/TCP,50000/TCP 2s ==> v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE chtholly-jenkins 1 1 1 0 2s NOTES: 1. Get your 'admin' user password by running: printf $(kubectl get secret --namespace default chtholly-jenkins -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 "component=chtholly-jenkins-master" -o jsonpath="{.items[0].metadata.name}") echo http://127.0.0.1:8080 kubectl 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. ##### #################################################################################
インストール後の作業も表示してくれる親切設計です。これはChartのNOTES.
ちなみにHelmではインストールしたパッケージのインスタンスを--name chtholly
」
「--name
」--name
」
インストール済みのパッケージはhelm list
」
$ helm list NAME REVISION UPDATED STATUS CHART NAMESPACE chtholly 1 Fri May 5 07:09:16 2017 DEPLOYED jenkins-0.6.2 default
またkubectl
コマンドを使えば、
$ kubectl get pods NAME READY STATUS RESTARTS AGE default-http-backend-x6f4f 1/1 Running 0 8d nginx-ingress-controller-100lz 1/1 Running 0 8d nginx-ingress-controller-8prr9 1/1 Running 0 8d nginx-ingress-controller-vcmz7 1/1 Running 0 8d chtholly-jenkins-1794764249-2jlc7 1/1 Running 0 4m $ kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE default-http-backend 10.152.183.176 <none> 80/TCP 8d kubernetes 10.152.183.1 <none> 443/TCP 8d chtholly-jenkins 10.152.183.160 <none> 8080/TCP,50000/TCP 4m
Jenkinsは外部へのウェブインターフェースとして8080番ポートを、kubectl port-forward
で設定する方法がアナウンスされていますが、jenkins-ingress.
ファイルを作成します。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: jenkins-ingress
spec:
rules:
- host: jenkins.example.org
http:
paths:
- path: /
backend:
serviceName: chtholly-jenkins
servicePort: 8080
これをkubectl
コマンドに渡します。
$ kubectl create -f jenkins-ingress.yaml $ kubectl get ingress NAME HOSTS ADDRESS PORTS AGE jenkinsk-ingress jenkins.example.org 10.183.107.11... 8080 11s
あとはjenkins.
」
$ printf $(kubectl get secret --namespace default chtholly-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo DLdjk0Uv3W
無事にフロントページにアクセスできれば、
パッケージの削除
Helmでインストールしたパッケージを削除するには、helm delete
コマンドにリリースの名前を渡すだけです。リリース名
$ helm delete chtholly
なおパッケージを削除したとしてもリリース名は予約されたままとなります。もし同じ名前で再インストールしたい場合は、--purge
」
$ helm delete --purge=true chtholly
削除したけれども名前は残っているリリースも含むすべてのリリースの一覧はhelm list --all
」