ダウンタイムゼロでkubernetes nginxを導入しようとしています。そのプロセスの一部は、少なくとも1つのポッドが常にnginxを実行していることを確認するrollingUpdateを開始することでした。これは完璧に機能します。Kubernetes Nginx:停止時間ゼロの展開方法
古いnginxポッドが終了しているときにエラーが発生しています。 termination上kubernetesのドキュメントによると、kubernetesはします:終了は停止前のフックを呼び出す
- は、サービスのエンドポイントのリストからポッドを削除します定義されていれば完了するまで待ちます。
- 残っているすべてのプロセスにSIGTERMを送信します。
- 猶予期間が終了した後、残りのプロセスにSIGKILLを送信します。
コマンドnginx -s quit
は、マスターが終了する前にすべてのワーカーが要求を完了するのを待って、正常にnginxを終了させることを理解しています。 SIGQUITコマンドは正常に応答しますが、SIGTERMコマンドを実行すると暴力的に終了します。
lifecycle:
preStop:
exec:
command: ["/usr/sbin/nginx", "-s", "quit"]
をしかし、私はnginx -s quit
すぐに戻って、代わりの労働者が完了するのを待っていることを発見した、このコマンドをテストから:他のフォーラムには、それはあなたの展開に以下のPRESTOPフックを追加するのと同じくらい簡単であると言います。また、私が望んでいたマスタープロセスのPIDも返しません。
kubernetesは、nginx -s quit
を呼び出して、適切なSIGQUITをワーカーの子に送信しますが、それらを待たないようにします。コンプリート。代わりに、それはステップ3へと右にジャンプし、代わりにそれらのプロセスを呼び出すため、暴力的な終了が発生し、接続が失われます。
質問:ローリング展開中に正常にnginxコントローラをシャットダウンし、停止時間をゼロにするには良い方法がありましたか? sleep
回避策は十分ではありません。もっと頑強なものを探しています。
以下は完全な展開のYAMLである:私は私自身の質問に答える嫌い
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-ingress-controller
spec:
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
template:
metadata:
labels:
app: nginx-ingress-lb
spec:
terminationGracePeriodSeconds: 60
serviceAccount: nginx
containers:
- name: nginx-ingress-controller
image: gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.8
imagePullPolicy: Always
readinessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
livenessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
timeoutSeconds: 5
args:
- /nginx-ingress-controller
- --default-backend-service=$(POD_NAMESPACE)/default-backend
- --v=2
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- containerPort: 80
lifecycle:
preStop:
exec:
command: ["/usr/sbin/nginx", "-s", "quit"]