kubernetesでmysqlとphpMyAdminを動かしてみる (docker for windows)

勉強のためkubernetes(以下k8s)でwebアプリを構築できるようにしたい。現状dockerを扱うことすら怪しいので、まずはdockerで既存のイメージを使った確認から。その次にk8sの構成を作って動かす2ステップでやってみる。

構成の扱いに慣れるのが目的なので、簡単のため使うdockerイメージは既存のイメージを使う。また、webアプリにはDBは必須となるだろうから、mysqlが動くようにする。アプリケーションはphpMyAdmin。この2つが動くようになればwebアプリ構築のための最低限の知見は得られそう。

dockerでmysqlとphpMyAdminを動かしてみる (docker for windows)

docker for windowsを使ったローカルでmysqlとphpmyadminのコンテナを動かしてみる。

参考は公式。

dockerネットワーク作成

かつてはdockerのlink機能でコンテナ間で通信できるようにしていたらしいが、deprecated。今はnetworkを作ってやる必要があるらしい。参考:https://qiita.com/tamanobi/items/8b8dd64ae1f959f9ff9f

というわけで試しにdockerネットワーク作成。

 docker network create test_network

そして、コンテナ側。dockerコマンドの --expose--port の違いは、前者が他のcontainerに対して、後者はホストマシンに対して。参考:https://qiita.com/sp4ghet/items/99536ef3a1fdf7b44f49

mysqlのコンテナ起動

mysqlのコンテナ起動は最終的にこうなった。
phpmyadminのコンテナからアクセスできるよう、ポート3306をexpose。

 docker run --rm --name mysql --net test_network --expose 3306 -e MYSQL_ROOT_PASSWORD=password -d mysql:8.0

phpmyadminのコンテナ起動


今度はホストPCからブラウザでアクセスしたいので、ホストの8080からコンテナの80へポートフォーワード指定。

docker run --rm --name phpmyadmin -d -e PMA_HOST=mysql -p 8080:80 --net test_network phpmyadmin

これでとりあえずhttp://localhost:8080/ でphpmyadminの画面が表示でき、dbにも接続できていた。

kubernetesでmysqlとphpMyAdminを動かしてみる (docker for windows)

docker for windowsのkubernetesを有効にしてwindowsローカルで動かしてみる。

kubernetesでのmysqlデプロイ設定

PersistentVolumeまわりが少々難解。このあたりは動かすクラウドプラットホームによっても設定内容は変わりそう。

PersistentVolume

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---

PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

Service

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:

  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: password

        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes: #
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

途中、serviceから指定しているpodのlabelが一致しておらず、localhostでNodePortにアクセスしてもEmpty replyとなってアクセスできずかなりハマった。
参考:https://www.mtioutput.com/entry/kube-curlerror-emptyreply

パスワードなども一旦適当で、動くようになった。実際に本格稼働させるなら、複数台構成で冗長化なども考慮すべきなんだろう。

kubernetesでのphpMyAdminデプロイ設定

概ねmysql同様。

Service

Serviceのtypeは指定しなければデフォルトでClusterIP となるが、ホストOSであるwindowsから直接 http://localhost:8080 のようにアクセスはできない。そこで、ServiceをNodePort にしてやることでNode、つまりここではローカルマシン(でいいのかな)のIPに対して静的なポートで公開されアクセスできるようになる。ポート番号は30000-32767の間で自動、portsの設定のnodePort を指定すると固定可能(あまり多用すべきではないと思う)
ちなみに、NodePortにした場合はその転送先に自動的にClusterIP Serviceが作られるらしい。

apiVersion: v1
kind: Service
metadata:
  name: phpmyadmin-service
spec:
  type: NodePort
  selector:
    app: phpmyadmin
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80

      nodePort: 30011

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: phpmyadmin-deployment
  labels:
    app: phpmyadmin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: phpmyadmin
  template:
    metadata:
      labels:
        app: phpmyadmin
    spec:
      containers:
        - name: phpmyadmin
          image: phpmyadmin/phpmyadmin
          ports:
            - containerPort: 80
          env:
            - name: PMA_HOST
              value: mysql    # クラスタ内ではService名がhostnameになっている
            - name: PMA_PORT
              value: "3306"
            - name: MYSQL_ROOT_PASSWORD
              value: password

コメント

タイトルとURLをコピーしました