kubectl docs に従って、kubectl rollout restart
は、デプロイメント、デーモンセット、ステートフルセットに適用できます。デプロイメントで期待どおりに機能します。ただし、ステートフルセットの場合は、2つのポッドのうち1つのポッドのみが再起動されます。
✗ k rollout restart statefulset alertmanager-main (playground-fdp/monitoring)
statefulset.apps/alertmanager-main restarted
✗ k rollout status statefulset alertmanager-main (playground-fdp/monitoring)
Waiting for 1 pods to be ready...
Waiting for 1 pods to be ready...
statefulset rolling update complete 2 pods at revision alertmanager-main-59d7ccf598...
✗ kgp -l app=alertmanager (playground-fdp/monitoring)
NAME READY STATUS RESTARTS AGE
alertmanager-main-0 2/2 Running 0 21h
alertmanager-main-1 2/2 Running 0 20s
ご覧のように、ポッドalertmanager-main-1が再起動され、その年齢は20歳です。一方、ステートフルセットアラートマネージャー内の他のポッド、つまりポッドアラートマネージャーmain-0は再起動されておらず、年齢は21時間です。ステートフルセットによって使用されるいくつかのconfigmapが更新された後で、ステートフルセットを再起動する方法はありますか
【更新1】ステートフルセットの設定です。ご覧のとおり、.spec.updateStrategy.rollingUpdate.partition
が設定されていません。
apiVersion: apps/v1
kind: StatefulSet
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"monitoring.coreos.com/v1","kind":"Alertmanager","metadata":{"annotations":{},"labels":{"alertmanager":"main"},"name":"main","namespace":"monitoring"},"spec":{"baseImage":"10.47.2.76:80/alm/alertmanager","nodeSelector":{"kubernetes.io/os":"linux"},"replicas":2,"securityContext":{"fsGroup":2000,"runAsNonRoot":true,"runAsUser":1000},"serviceAccountName":"alertmanager-main","version":"v0.19.0"}}
creationTimestamp: "2019-12-02T07:17:49Z"
generation: 4
labels:
alertmanager: main
name: alertmanager-main
namespace: monitoring
ownerReferences:
- apiVersion: monitoring.coreos.com/v1
blockOwnerDeletion: true
controller: true
kind: Alertmanager
name: main
uid: 3e3bd062-6077-468e-ac51-909b0bce1c32
resourceVersion: "521307"
selfLink: /apis/apps/v1/namespaces/monitoring/statefulsets/alertmanager-main
uid: ed4765bf-395f-4d91-8ec0-4ae23c812a42
spec:
podManagementPolicy: Parallel
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
alertmanager: main
app: alertmanager
serviceName: alertmanager-operated
template:
metadata:
creationTimestamp: null
labels:
alertmanager: main
app: alertmanager
spec:
containers:
- args:
- --config.file=/etc/alertmanager/config/alertmanager.yaml
- --cluster.listen-address=[$(POD_IP)]:9094
- --storage.path=/alertmanager
- --data.retention=120h
- --web.listen-address=:9093
- --web.external-url=http://10.47.0.234
- --web.route-prefix=/
- --cluster.peer=alertmanager-main-0.alertmanager-operated.monitoring.svc:9094
- --cluster.peer=alertmanager-main-1.alertmanager-operated.monitoring.svc:9094
env:
- name: POD_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
image: 10.47.2.76:80/alm/alertmanager:v0.19.0
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 10
httpGet:
path: /-/healthy
port: web
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 3
name: alertmanager
ports:
- containerPort: 9093
name: web
protocol: TCP
- containerPort: 9094
name: mesh-tcp
protocol: TCP
- containerPort: 9094
name: mesh-udp
protocol: UDP
readinessProbe:
failureThreshold: 10
httpGet:
path: /-/ready
port: web
scheme: HTTP
initialDelaySeconds: 3
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 3
resources:
requests:
memory: 200Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/alertmanager/config
name: config-volume
- mountPath: /alertmanager
name: alertmanager-main-db
- args:
- -webhook-url=http://localhost:9093/-/reload
- -volume-dir=/etc/alertmanager/config
image: 10.47.2.76:80/alm/configmap-reload:v0.0.1
imagePullPolicy: IfNotPresent
name: config-reloader
resources:
limits:
cpu: 100m
memory: 25Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/alertmanager/config
name: config-volume
readOnly: true
dnsPolicy: ClusterFirst
nodeSelector:
kubernetes.io/os: linux
restartPolicy: Always
schedulerName: default-scheduler
securityContext:
fsGroup: 2000
runAsNonRoot: true
runAsUser: 1000
serviceAccount: alertmanager-main
serviceAccountName: alertmanager-main
terminationGracePeriodSeconds: 120
volumes:
- name: config-volume
secret:
defaultMode: 420
secretName: alertmanager-main
- emptyDir: {}
name: alertmanager-main-db
updateStrategy:
type: RollingUpdate
status:
collisionCount: 0
currentReplicas: 2
currentRevision: alertmanager-main-59d7ccf598
observedGeneration: 4
readyReplicas: 2
replicas: 2
updateRevision: alertmanager-main-59d7ccf598
updatedReplicas: 2
シナリオ全体を提供しませんでした。 Readiness Probe またはUpdate Strategy
に依存する場合があります。
StatefulSet
ポッドをインデックス0 to n-1
から再起動します。詳細は こちら をご覧ください。
理由1 *
Statefulset
have 4 更新戦略 。
Partition
updateには、次の情報があります。
パーティションが指定されている場合、StatefulSetの
.spec.template
が更新されると、パーティション以上の序数を持つすべてのポッドが更新されます。序数がパーティションよりも小さいすべてのポッドは更新されず、削除されても、以前のバージョンで再作成されます。 StatefulSetの.spec.updateStrategy.rollingUpdate.partition
が.spec.replicas
より大きい場合、その.spec.template
への更新はポッドに伝播されません。ほとんどの場合、パーティションを使用する必要はありませんが、更新をステージングしたり、カナリアをロールアウトしたり、段階的なロールアウトを実行したりする場合に役立ちます。
したがって、StatefulSet
のどこかにupdateStrategy.rollingUpdate.partition: 1
を設定した場合、インデックス1以上のすべてのポッドが再起動されます。
partition: 3
の例
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 30m
web-1 1/1 Running 0 30m
web-2 1/1 Running 0 31m
web-3 1/1 Running 0 2m45s
web-4 1/1 Running 0 3m
web-5 1/1 Running 0 3m13s
理由2
Readiness probe
の構成。
initialDelaySeconds
およびperiodSeconds
の値が高い場合、別の値が再起動されるまでに時間がかかることがあります。これらのパラメーターの詳細については、 ここ を参照してください。
以下の例では、ポッドは実行されるまで10秒待機し、readiness probe
は2秒ごとにこれをチェックしています。値によっては、この動作の原因となる場合があります。
readinessProbe:
failureThreshold: 3
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 2
successThreshold: 1
timeoutSeconds: 1
理由3
各ポッドに2つのコンテナがあることを確認しました。
NAME READY STATUS RESTARTS AGE
alertmanager-main-0 2/2 Running 0 21h
alertmanager-main-1 2/2 Running 0 20s
docs で説明されているように:
Running
-ポッドがノードにバインドされ、すべてのコンテナが作成されました。 で、少なくとも1つのコンテナがまだ実行中、または開始中または再起動中です。
containers
(readinessProbe/livenessProbe、再起動など)の両方で問題がないかどうかを確認することをお勧めします。
削除する必要があります。ステートフルセットは、序数インデックスが最も高い序数インデックスから順に削除されます。
また、更新された構成マップを再度読み取るためにポッドを再起動する必要はありません。これは自動的に行われます(しばらくすると)。