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リクエストを処理し切ってから終了させることができます(コマンドの選定が重要)