勉強のため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デプロイ設定
- こちらがわかりやすく、参考にさせていただきました
- k8s公式のドキュメントも。
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
コメント