HelmをインストールしてMysqlを動かすまで

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で解消されている点が良いと思った。
しかしながら、誰かがパッケージ化しなければならないので、そこも試してみないと導入可能化どうかはまだわからない。
次は、どうやってパッケージするのかを調べよう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください