tjtjtjのメモ

自分のためのメモです

helm リベンジ

リベンジの前に

ここを読んだ。

qiita.com

準備

前回の失敗は persistent volume を確保していないことが原因だった。

ここ を見ると stable/mysqlpersistence.size:8Gi RAW とあるので8G用意しておく。storageclass は指定しない。

my-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
  labels:
    type: local
spec:
  capacity:
    storage: 8Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

apply

$ kubectl apply -f my-pv.yaml
persistentvolume/my-pv created
$ kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
my-pv   8Gi        RWO            Retain           Available                                   9s

helm install

helm install

$ helm install stable/mysql
$helm install stable/mysql
NAME:   messy-waterbuffalo
LAST DEPLOYED: Thu Aug 15 19:49:26 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/ConfigMap
NAME                           DATA  AGE
messy-waterbuffalo-mysql-test  1     0s

==> v1/PersistentVolumeClaim
NAME                      STATUS  VOLUME  CAPACITY  ACCESS MODES  STORAGECLASS  AGE
messy-waterbuffalo-mysql  Bound   my-pv   8Gi       RWO           0s

==> v1/Pod(related)
NAME                                       READY  STATUS    RESTARTS  AGE
messy-waterbuffalo-mysql-6c85b99b48-zldhx  0/1    Init:0/1  0         0s

==> v1/Secret
NAME                      TYPE    DATA  AGE
messy-waterbuffalo-mysql  Opaque  2     0s

==> v1/Service
NAME                      TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)   AGE
messy-waterbuffalo-mysql  ClusterIP  10.97.225.217  <none>       3306/TCP  0s

==> v1beta1/Deployment
NAME                      READY  UP-TO-DATE  AVAILABLE  AGE
messy-waterbuffalo-mysql  0/1    1           0          0s


NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
messy-waterbuffalo-mysql.default.svc.cluster.local

To get your root password run:

    MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default messy-waterbuffalo-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 messy-waterbuffalo-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 command to route the connection:
    kubectl port-forward svc/messy-waterbuffalo-mysql 3306

    mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}

kubectl で確認

$ kubectl get svc
NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes                 ClusterIP   10.96.0.1       <none>        443/TCP    15d
messy-waterbuffalo-mysql   ClusterIP   10.97.225.217   <none>        3306/TCP   4m15s
$ kubectl get deploy
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
messy-waterbuffalo-mysql   1/1     1            1           4m23s
$ kubectl get po
NAME                                        READY   STATUS    RESTARTS   AGE
messy-waterbuffalo-mysql-6c85b99b48-zldhx   1/1     Running   0          4m27s

node22 の /mnt/data にそれっぽいのができている。

$ ls -al /mnt/data
total 188496
drwxr-xr-x. 5  999 render     4096 Aug 15 19:49 .
drwxr-xr-x. 3 root root       4096 Aug 15 19:49 ..
-rw-r-----. 1  999 render       56 Aug 15 19:49 auto.cnf
-rw-r-----. 1  999 render     1329 Aug 15 19:49 ib_buffer_pool
-rw-r-----. 1  999 render 50331648 Aug 15 19:49 ib_logfile0
-rw-r-----. 1  999 render 50331648 Aug 15 19:49 ib_logfile1
-rw-r-----. 1  999 render 79691776 Aug 15 19:49 ibdata1
-rw-r-----. 1  999 render 12582912 Aug 15 19:49 ibtmp1
drwxr-x---. 2  999 render     4096 Aug 15 19:49 mysql
drwxr-x---. 2  999 render     4096 Aug 15 19:49 performance_schema
drwxr-x---. 2  999 render    12288 Aug 15 19:49 sys

helm status を確認。mysql-client のインストール方法まで載っている。kubectl port-forward そんなのが!

$ helm status messy-waterbuffalo
LAST DEPLOYED: Thu Aug 15 19:49:26 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/ConfigMap
NAME                           DATA  AGE
messy-waterbuffalo-mysql-test  1     7m13s

==> v1/PersistentVolumeClaim
NAME                      STATUS  VOLUME  CAPACITY  ACCESS MODES  STORAGECLASS  AGE
messy-waterbuffalo-mysql  Bound   my-pv   8Gi       RWO           7m13s

==> v1/Pod(related)
NAME                                       READY  STATUS   RESTARTS  AGE
messy-waterbuffalo-mysql-6c85b99b48-zldhx  1/1    Running  0         7m13s

==> v1/Secret
NAME                      TYPE    DATA  AGE
messy-waterbuffalo-mysql  Opaque  2     7m13s

==> v1/Service
NAME                      TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)   AGE
messy-waterbuffalo-mysql  ClusterIP  10.97.225.217  <none>       3306/TCP  7m13s

==> v1beta1/Deployment
NAME                      READY  UP-TO-DATE  AVAILABLE  AGE
messy-waterbuffalo-mysql  1/1    1           1          7m13s


NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
messy-waterbuffalo-mysql.default.svc.cluster.local

To get your root password run:

    MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default messy-waterbuffalo-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 messy-waterbuffalo-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 command to route the connection:
    kubectl port-forward svc/messy-waterbuffalo-mysql 3306

    mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}

pod に入ってmysqlを確認

mysql が動いていました。

$ kubectl get po
NAME                                        READY   STATUS    RESTARTS   AGE
messy-waterbuffalo-mysql-6c85b99b48-zldhx   1/1     Running   0          41m
$ kubectl exec -it messy-waterbuffalo-mysql-6c85b99b48-zldhx sh
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 499
Server version: 5.7.14 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select user, host from user order by user, host;
+------+------+
| user | host |
+------+------+
| root | %    |
+------+------+
1 row in set (0.00 sec)

k8sクラスタ外から

サービス確認

$ kubectl get svc
NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes                 ClusterIP   10.96.0.1       <none>        443/TCP    16d
messy-waterbuffalo-mysql   ClusterIP   10.97.225.217   <none>        3306/TCP   38m

nodeport 作ってみる

apiVersion: v1
kind: Service
metadata:
  name: np
spec:
  selector:
    app: mysql
  type: NodePort
  ports:
  - port: 3306
    nodePort: 33306
$ kubectl apply -f np.yaml
service/np created
$ kubectl get svc
NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes                 ClusterIP   10.96.0.1       <none>        443/TCP          16d
messy-waterbuffalo-mysql   ClusterIP   10.97.225.217   <none>        3306/TCP         53m
np                         NodePort    10.104.38.32    <none>        3306:32306/TCP   8s

クラスタ外からは接続に失敗。service復習しないと。。。

$ mysql -h 192.168.0.21 --port=32306 -u root -p
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.0.21' (111)

お掃除

$ kubectl delete -f np.yaml
service "np" deleted
$ helm ls
NAME                    REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE
messy-waterbuffalo      1               Thu Aug 15 19:49:26 2019        DEPLOYED        mysql-1.3.0     5.7.14          default
$ helm delete --purge messy-waterbuffalo
release "messy-waterbuffalo" deleted
$ ls
my-pv.yaml  np.yaml
$ kubectl delete -f my-pv.yaml
persistentvolume "my-pv" deleted

とりあえず

とりあえず helm install できた。install したものは helm delete でアンインストールできることも分かった。 最初runningまでいかなかったが、それも一発で消せた。 このくらいならまだ kubectl apply -f kubectl delete -f できそうだが、helm は複雑なサービスを構成できそうなのはわかった。