HelmをインストールしてMysqlを動かすまで
目次
概要
kubernetes用のパッケージマネージャーとして有名なHelmをインストールしてみる。
Helmはchartを使って、アプリケーションを管理しようともの。chartというのは、アプリケーションを動かすのに必要なk8sのファイルを集めたもの。
stable/mysql
というアプリケーションを例に取ると、以下のオブジェクトが定義されている。
今までは、Dockerイメージ単位で他人で共有していたものが、すべてをパッケージした形で共有が可能となった。
今まで敷居が高くて、k8sを使ってなかった人にも簡単にデプロイが可能となるし、組織内で共有する際にもHowTo含めた全部入りで共有できる。
$ helm status wishing-orangutan
LAST DEPLOYED: Tue Jun 12 11:47:48 2018
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/PersistentVolumeClaim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
wishing-orangutan-mysql Bound pvc-fd251571-6dea-11e8-876d-005056af8ede 8Gi RWO vsphere-sc 12m
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wishing-orangutan-mysql ClusterIP 10.96.11.247 <none> 3306/TCP 12m
==> v1beta1/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
wishing-orangutan-mysql 1 1 1 1 12m
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
wishing-orangutan-mysql-7d9559678d-kb8q6 1/1 Running 0 12m
==> v1/Secret
NAME TYPE DATA AGE
wishing-orangutan-mysql Opaque 2 12m
==> v1/ConfigMap
NAME DATA AGE
wishing-orangutan-mysql-test 1 12m
Helm インストール
まずはQuick Startを確認。
kubectl
ができるマシンにHelmをインストール必要があるらしい。
Macの場合にはhomebrew
を使うことも可能。CentOS7にインストールして使用するので、Linuxのバイナリをダウンロードしてインストール。
# Use version 2.9.1
$ wget https://storage.googleapis.com/kubernetes-helm/helm-v2.9.1-linux-amd64.tar.gz
# Extract the file
$ tar xvzf helm-v2.9.1-linux-amd64.tar.gz
# Install binary to /usr/local/bin/
$ sudo mv linux-amd64/helm /usr/local/bin/helm
$ sudo chmod +x /usr/local/bin/helm
# Delete unnecessary file
$ rm -r ./helm-v2.9.1-linux-amd64.tar.gz linux-amd64/
続いて、Tiller用のServiceAccount
を作成して、Tillerをk8sクラスタにデプロイする。
今回はClusterAdminロールを使用。環境に合わせて制御が必要。
まず、kubectl get node
でk8sにつながることを確認しつつ、インストール。
# Check if cluster is available
$ kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready <none> 4d v1.10.3
k8s-node1 Ready <none> 4d v1.10.3
k8s-node2 Ready <none> 4d v1.10.3
k8s-node3 Ready <none> 4d v1.10.3
# Create yaml file for tiller service account
$ cat <<EOF > /tmp/tiller-svc.yml
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
EOF
# Create ServiceAccount for Tiller
$ kubectl apply -f /tmp/tiller-svc.yml
serviceaccount "tiller" unchanged
clusterrolebinding.rbac.authorization.k8s.io "tiller" configured
helm init
でTillerをクラスタにインストール
# Deploy Tiller to your cluster
$ helm init --service-account tiller
# Ceck status of tiller pod
$ kubectl -n kube-system get pod
NAME READY STATUS RESTARTS AGE
etcd-k8s-master 1/1 Running 0 4d
kube-apiserver-k8s-master 1/1 Running 0 4d
kube-controller-manager-k8s-master 1/1 Running 0 4d
kube-dns-6f4fd4bdf-mvlsb 3/3 Running 0 4d
kube-proxy-fgbrb 1/1 Running 1 4d
kube-proxy-rzbx8 1/1 Running 2 4d
kube-proxy-tlrbn 1/1 Running 1 4d
kube-proxy-xhl68 1/1 Running 1 4d
kube-scheduler-k8s-master 1/1 Running 0 4d
kubernetes-dashboard-5bd6f767c7-slgbs 1/1 Running 0 3d
tiller-deploy-75f5797b-s6vmn 1/1 Running 0 42m
Helmアプリケーションのインストール
いよいよアプリケーションのインストール。
今回はstable/mysql
を使用するので、デフォルトのStorageClass
が定義されていることが必要となる。
最初StorageClass
なしで、インストールしてPersistentVolumeClaim
がいつまでも作られなくて一度ハマった。
# Update helm repo
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Unable to get an update from the "stable" chart repository (https://kubernetes-charts.storage.googleapis.com):
Get https://kubernetes-charts.storage.googleapis.com/index.yaml: dial tcp [2404:6800:4004:80c::2010]:443: connect: network is unreachable
Update Complete. ⎈ Happy Helming!⎈
# Check if default StorageClass exists
$ kubectl get storageclass
NAME PROVISIONER AGE
vsphere-sc (default) kubernetes.io/vsphere-volume 32m
# Install mysql application
$ helm install stable/mysql
NAME: excited-rattlesnake
LAST DEPLOYED: Tue Jun 12 12:19:09 2018
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Secret
NAME TYPE DATA AGE
excited-rattlesnake-mysql Opaque 2 2s
==> v1/ConfigMap
NAME DATA AGE
excited-rattlesnake-mysql-test 1 2s
==> v1/PersistentVolumeClaim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
excited-rattlesnake-mysql Pending vsphere-sc 2s
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
excited-rattlesnake-mysql ClusterIP 10.108.135.169 <none> 3306/TCP 2s
==> v1beta1/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
excited-rattlesnake-mysql 1 1 1 0 2s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
excited-rattlesnake-mysql-59748c84b8-xnw8d 0/1 Init:0/1 0 2s
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
excited-rattlesnake-mysql.default.svc.cluster.local
To get your root password run:
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default excited-rattlesnake-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
To connect to your database:
1. Run an Ubuntu pod that you can use as a client:
kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il
2. Install the mysql client:
$ apt-get update && apt-get install mysql-client -y
3. Connect using the mysql cli, then provide your password:
$ mysql -h excited-rattlesnake-mysql -p
To connect to your database directly from outside the K8s cluster:
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
# Execute the following commands to route the connection:
export POD_NAME=$(kubectl get pods --namespace default -l "app=excited-rattlesnake-mysql" -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward $POD_NAME 3306:3306
mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
Helm アプリケーションの状態確認
$ helm ls
NAME REVISION UPDATED STATUS CHART NAMESPACE
excited-rattlesnake 1 Tue Jun 12 12:19:09 2018 DEPLOYED mysql-0.8.0 default
$ helm status wishing-orangutan
LAST DEPLOYED: Tue Jun 12 11:47:48 2018
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/PersistentVolumeClaim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
wishing-orangutan-mysql Bound pvc-fd251571-6dea-11e8-876d-005056af8ede 8Gi RWO vsphere-sc 12m
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wishing-orangutan-mysql ClusterIP 10.96.11.247 <none> 3306/TCP 12m
==> v1beta1/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
wishing-orangutan-mysql 1 1 1 1 12m
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
wishing-orangutan-mysql-7d9559678d-kb8q6 1/1 Running 0 12m
==> v1/Secret
NAME TYPE DATA AGE
wishing-orangutan-mysql Opaque 2 12m
==> v1/ConfigMap
NAME DATA AGE
wishing-orangutan-mysql-test 1 12m
<snip>
Helm アプリケーションの削除
$ helm ls
NAME REVISION UPDATED STATUS CHART NAMESPACE
excited-rattlesnake 1 Tue Jun 12 12:19:09 2018 DEPLOYED mysql-0.8.0 default
$ helm delete excited-rattlesnake
release "excited-rattlesnake" deleted
おわり
Helmを使って簡単なアプリケーションをデプロイした。
今までYamlを使ってアプリケーションをデプロイしていたがめんどくさいところがHelmで解消されている点が良いと思った。
しかしながら、誰かがパッケージ化しなければならないので、そこも試してみないと導入可能化どうかはまだわからない。
次は、どうやってパッケージするのかを調べよう。