在 kubernetes 初始部署中如何对副本进行排序
On kubernetes inital deployment how to sequence replica's
我有一个 pod,它带有一个连接到外部数据库的应用程序服务器。为了冗余,我想 运行 多个 pods,因此我使用 rolingupdate 策略(maxSurge = 1 和 maxUnavailable = 1)将部署扩展到 3 个。
有时(大部分时间)pods 在第一次创建时失败,因为我使用的是 liquibase,并且所有 pods 尝试同时锁定数据库。
对我来说最简单的解决方案似乎是 pods 按顺序启动。所以启动 pod 1,等待 60 秒,然后启动 pod 2 等
这是一个有效的解决方案吗?我怎样才能在 k8s (v1.14) 中实现它?
这是 kubectl describe deploy
的输出:
Name: jx-apollon
Namespace: jx-staging
CreationTimestamp: Sun, 27 Oct 2019 21:28:07 +0100
Labels: chart=apollon-1.0.348
draft=draft-app
jenkins.io/chart-release=jx
jenkins.io/namespace=jx-staging
jenkins.io/version=4
Annotations: deployment.kubernetes.io/revision: 3
jenkins.io/chart: env
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"extensions/v1beta1","kind":"Deployment","metadata":{"annotations":{"jenkins.io/chart":"env"},"labels":{"chart":"apollon-1.0...
Selector: app=jx-apollon,draft=draft-app
Replicas: 0 desired | 0 updated | 0 total | 0 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 1 max unavailable, 1 max surge
Pod Template:
Labels: app=jx-apollon
draft=draft-app
Init Containers:
postgres-listener-short:
Image: alpine
Port: <none>
Host Port: <none>
Command:
sh
-c
echo 'Waiting in init container for DB to become available.'; echo $DB; for i in $(seq 1 5); do echo 'nc ping' $i && nc -z -w3 $DB 5432 && echo 'DB is available, continuing now to application initialization.' && exit 0 || sleep 3; done; echo 'DB is not yet available.'; exit 1
Environment:
DB: jx-apollon-postgresql-db-alias
Mounts: <none>
postgres-listener-longer:
Image: alpine
Port: <none>
Host Port: <none>
Command:
sh
-c
echo 'Waiting in init container for DB to become available.'; echo $DB; for i in $(seq 1 100); do echo 'nc ping' $i && nc -z -w3 $DB 5432 && echo 'DB is available, continuing now to application initialization.' && exit 0 || sleep 3; done; echo 'DB is not yet available.'; exit 1
Environment:
DB: jx-apollon-postgresql-db-alias
Mounts: <none>
Containers:
apollon:
Image: <redacted>
Ports: 8080/TCP, 8443/TCP
Host Ports: 0/TCP, 0/TCP
Limits:
cpu: 2
memory: 6Gi
Requests:
cpu: 100m
memory: 3584Mi
Liveness: http-get http://:8080/ delay=60s timeout=1s period=10s #success=1 #failure=3
Readiness: http-get http://:8080/ delay=0s timeout=1s period=10s #success=1 #failure=3
Environment:
DB: jx-apollon-postgresql-db-alias
POSTGRES_PASSWORD: <redacted>
RULES_CLIENT: demo
_JAVA_OPTIONS: -XX:+UseContainerSupport -XX:MaxRAMPercentage=90.0 -XX:+UseG1GC
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: jx-apollon-95b4c77cb (0/0 replicas created)
Events: <none>
我将 initContainer 部分更改为这段代码,它一直等到它从 liquibase 创建的数据库更改日志锁 table 中读取错误值。
initContainers:
- name: postgres-listener
image: postgres
env:
- name: DB
value: jx-apollon-postgresql-db-alias
command: ['sh', '-c', '\
until psql -qtAX -h $DB -d postgres -c \
"select count(locked) from databasechangeloglock where locked = false group by locked";
do echo waiting for dbchangeloglock of postgres db to be false; sleep 2; done;
']
我有一个 pod,它带有一个连接到外部数据库的应用程序服务器。为了冗余,我想 运行 多个 pods,因此我使用 rolingupdate 策略(maxSurge = 1 和 maxUnavailable = 1)将部署扩展到 3 个。
有时(大部分时间)pods 在第一次创建时失败,因为我使用的是 liquibase,并且所有 pods 尝试同时锁定数据库。
对我来说最简单的解决方案似乎是 pods 按顺序启动。所以启动 pod 1,等待 60 秒,然后启动 pod 2 等
这是一个有效的解决方案吗?我怎样才能在 k8s (v1.14) 中实现它?
这是 kubectl describe deploy
的输出:
Name: jx-apollon
Namespace: jx-staging
CreationTimestamp: Sun, 27 Oct 2019 21:28:07 +0100
Labels: chart=apollon-1.0.348
draft=draft-app
jenkins.io/chart-release=jx
jenkins.io/namespace=jx-staging
jenkins.io/version=4
Annotations: deployment.kubernetes.io/revision: 3
jenkins.io/chart: env
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"extensions/v1beta1","kind":"Deployment","metadata":{"annotations":{"jenkins.io/chart":"env"},"labels":{"chart":"apollon-1.0...
Selector: app=jx-apollon,draft=draft-app
Replicas: 0 desired | 0 updated | 0 total | 0 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 1 max unavailable, 1 max surge
Pod Template:
Labels: app=jx-apollon
draft=draft-app
Init Containers:
postgres-listener-short:
Image: alpine
Port: <none>
Host Port: <none>
Command:
sh
-c
echo 'Waiting in init container for DB to become available.'; echo $DB; for i in $(seq 1 5); do echo 'nc ping' $i && nc -z -w3 $DB 5432 && echo 'DB is available, continuing now to application initialization.' && exit 0 || sleep 3; done; echo 'DB is not yet available.'; exit 1
Environment:
DB: jx-apollon-postgresql-db-alias
Mounts: <none>
postgres-listener-longer:
Image: alpine
Port: <none>
Host Port: <none>
Command:
sh
-c
echo 'Waiting in init container for DB to become available.'; echo $DB; for i in $(seq 1 100); do echo 'nc ping' $i && nc -z -w3 $DB 5432 && echo 'DB is available, continuing now to application initialization.' && exit 0 || sleep 3; done; echo 'DB is not yet available.'; exit 1
Environment:
DB: jx-apollon-postgresql-db-alias
Mounts: <none>
Containers:
apollon:
Image: <redacted>
Ports: 8080/TCP, 8443/TCP
Host Ports: 0/TCP, 0/TCP
Limits:
cpu: 2
memory: 6Gi
Requests:
cpu: 100m
memory: 3584Mi
Liveness: http-get http://:8080/ delay=60s timeout=1s period=10s #success=1 #failure=3
Readiness: http-get http://:8080/ delay=0s timeout=1s period=10s #success=1 #failure=3
Environment:
DB: jx-apollon-postgresql-db-alias
POSTGRES_PASSWORD: <redacted>
RULES_CLIENT: demo
_JAVA_OPTIONS: -XX:+UseContainerSupport -XX:MaxRAMPercentage=90.0 -XX:+UseG1GC
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: jx-apollon-95b4c77cb (0/0 replicas created)
Events: <none>
我将 initContainer 部分更改为这段代码,它一直等到它从 liquibase 创建的数据库更改日志锁 table 中读取错误值。
initContainers:
- name: postgres-listener
image: postgres
env:
- name: DB
value: jx-apollon-postgresql-db-alias
command: ['sh', '-c', '\
until psql -qtAX -h $DB -d postgres -c \
"select count(locked) from databasechangeloglock where locked = false group by locked";
do echo waiting for dbchangeloglock of postgres db to be false; sleep 2; done;
']