実例: Laravelアプリを構成してみよう#

前期(AS構築Ⅰ)にて作ったメモアプリを実際に構成してみましょう。 ソース一式は以下のリンクに存在しますが、ここから作ったイメージを走らせるということにします。

なお、下記のマニフェストは docker-compose.yml ファイルをベースに構築しています。

バックエンド#

データベース部分を考えます。データベースは普通にMySQL/MariaDBとなります。 まずは「とりあえず動かす」とします、セキュリティ部分はちょっと後回し。

ストレージの確保#

ストレージはPVCで確保しておきます、512MiBとでもしておきましょうか。

Listing 102 ストレージ部分#
# mariadbのDBストレージ部分
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: db-store
spec:
  resources:
    requests:
      storage: 512Mi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce

データベース部分#

続いてデータベースですが、この時点ではまだsecretを使わない形にしておきます。

Listing 103 バックエンド(データベース)#
# バックエンド(mariadb)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: mariadb:10.9.4
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        # 現時点では環境変数渡し
        env:
          - name: MARIADB_RANDOM_ROOT_PASSWORD
            value: "1"
          - name: MARIADB_DATABASE
            value: sample
          - name: MARIADB_USER
            value: memoadmin
          - name: MARIADB_PASSWORD
            value: admin
        volumeMounts:
          - mountPath: /var/lib/mysql
            name: db-store
        ports:
        - containerPort: 3306
        readinessProbe:
          exec:
            command:
              - mysqladmin
              - ping
              - "-u"
              - memoadmin
              - "--password=admin"
              - "-h"
              - "127.0.0.1"
      volumes:
        - name: db-store
          persistentVolumeClaim:
            claimName: db-store

ここまででいちど適用して、データベースが起動できるかをみておきます。

サービス公開#

今回はフロントエンド(Web/PHP)だけで見えれば良いので、ClusterIPでいいでしょう。

Listing 104 ClusterIPでdeploy/backendを公開#
# クラスタ内でbackendを見せる
apiVersion: v1
kind: Service
metadata:
  name: backend
spec:
  selector:
    app: backend
  ports:
  - port: 3306
    targetPort: 3306
  type: ClusterIP

アクセスできるかのテストに関しては、alpineのイメージでシェルを建てて確認するぐらいで良いかと思います。

PS> kubectl run --rm --image=alpine -it alpine -- sh
/ # nslookup backend
Server:         10.96.0.10
Address:        10.96.0.10:53 # アドレスが取得できていればOK
... 以下略
/ # exit

フロントエンド#

フロントエンドはLaravelによるコードの入ったイメージを作っているので、それを呼び出しましょう。

Listing 105 フロントエンド側#
# Laravelでのアプリ(frontend)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: frontend
        image: densukest/hello-laravel
        resources:
          limits:
            memory: "256Mi"
            cpu: "500m"
        ports:
        - containerPort: 80
        command:
          - php
          - artisan
          - serve
          - "--port=80"
          - "--host=0.0.0.0"
      initContainers:
        - name: init
          image: densukest/hello-laravel
          command:
            - php
            - artisan
            - migrate

サービスも設定しましょう。 こちらはNodePortで設定し、外側とも接点を作っておきます。

Listing 106 フロントエンド側サービス(NodePort)#
apiVersion: v1
kind: Service
metadata:
  name: frontend
spec:
  selector:
    app: frontend
  ports:
  - port: 80
    targetPort: 80
  type: NodePort

両者を適用後、minikube serviceでホスト側と接続してあげてみてください。