【PHP x Kubernetes】availabilityを意識したdeployment定義

PHPをKubernetes上で稼働させるときに、availabilityを高めるための設定をいろいろ調べたのでまとめておきます。

前提

httpdコマンドでApacheを起動するのを想定しています。

アプリケーション起動コマンドは「/usr/sbin/httpd -D FOREGROUND」です。

ポートは「80」でHTTPリクエストを受け付けるものとします。

結論

以下のように、livenessProbe, readinessProbe, preStopを設定しましょう!

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-app
  labels:
    app: php-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: php-app
  template:
    metadata:
      labels:
        app: php-app
    spec:
      containers:
        - name: main
          image: <docker image>
          readinessProbe:
            tcpSocket:
              port: 80
            initialDelaySeconds: 5
            periodSeconds: 10
          livenessProbe:
            tcpSocket:
              port: 80
            initialDelaySeconds: 15
            periodSeconds: 20
          lifecycle:
            preStop:
              exec:
                # cf. https://httpd.apache.org/docs/2.4/stopping.html#gracefulstop
                command: [ "/usr/sbin/httpd", "-k", "graceful-stop" ]

readinessProbe / livenessProbe

readinessProbeとlivenessProbeでは、アプリケーションが処理可能な状態かをチェックします。

PHPではapacheさえ起動していればアクセス可能な状態なはずなので、
TCPでアプリケーションポート(例では80番ポート)と疎通ができたらOKとしています。

メモ
もし、readinessProbeとlivenessProbeを設定していないと?
・Apache起動までにHTTPリクエストが到達し、一部ユーザにエラーを返す可能性があります。
→ readinessProbeを設定すると、疎通ができることを確認してからサービスインされます。
・何かしらの原因でリクエスト受付不可となったときに、エラーを返し続ける可能性があります。
→ livenessProveを設定すると、疎通不可となったときにサービスアウトされます。

preStop

preStopでは、HTTPリクエストを処理し切ってからアプリケーションを終了するように設定をします。

httpdには-k graceful-stopオプションでGraceful Shutdownをさせることができます!

メモ
もし、preStopを設定していないと?
・何かしらの要因でpodの再起動 / 削除が起きると、HTTPリクエストの処理状況によらず強制終了となり、一部ユーザにエラーを返す可能性があります。
→ preStopを設定するとHTTPリクエストを処理し切ってから終了させることができます(コマンドの選定が重要)

コメントを残す

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