如何在同一个 kubernetes 集群中部署依赖于数据库的微服务(可能是多个实例)?
How to deploy a microservice ( possible multiple instances) dependent on database in the same kubernetes cluster?
我想要运行一个使用数据库的微服务。数据库也需要使用 PVC/PV 部署在同一个 kubernetes 集群中。什么是 kubernetes 服务 name/command 用来实现这样的逻辑:
- 部署数据库实例
- 如果 1 次成功,则部署微服务,否则 return 到 1 并尝试(如果 100 次失败 - 然后停止并报警)
- 如果 2 成功,使用它,如果需要自动缩放(autoscale kubernetes 选项)
我主要关心的是 1-2:如果没有 DB,服务无法工作,但同时需要在不同的 pods 中(或者我错了,最好放 2 个容器:DB和服务在同一个 pod?)
我会说你应该添加 initContainer 到你的微服务,它会搜索数据库服务,当它准备好时,微服务就会启动。
例如
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
至于命令,只需将 kubectl apply 与您的 yaml 一起使用(在您的应用程序中配置了 initContainer)。
如果您想以更自动化的方式做到这一点,您可以考虑使用 fluxCD/argoCD。
关于评论中的问题,containers that run before the main container runs and the main container must be in the same pod?
是的,它们必须在同一个 pod 中。由于 init 容器将正常工作,除非 f.e。数据库服务可用,然后主容器将启动。在上面的 initContainer 文档中有一个很好的例子。
我想要运行一个使用数据库的微服务。数据库也需要使用 PVC/PV 部署在同一个 kubernetes 集群中。什么是 kubernetes 服务 name/command 用来实现这样的逻辑:
- 部署数据库实例
- 如果 1 次成功,则部署微服务,否则 return 到 1 并尝试(如果 100 次失败 - 然后停止并报警)
- 如果 2 成功,使用它,如果需要自动缩放(autoscale kubernetes 选项)
我主要关心的是 1-2:如果没有 DB,服务无法工作,但同时需要在不同的 pods 中(或者我错了,最好放 2 个容器:DB和服务在同一个 pod?)
我会说你应该添加 initContainer 到你的微服务,它会搜索数据库服务,当它准备好时,微服务就会启动。
例如
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
至于命令,只需将 kubectl apply 与您的 yaml 一起使用(在您的应用程序中配置了 initContainer)。
如果您想以更自动化的方式做到这一点,您可以考虑使用 fluxCD/argoCD。
关于评论中的问题,containers that run before the main container runs and the main container must be in the same pod?
是的,它们必须在同一个 pod 中。由于 init 容器将正常工作,除非 f.e。数据库服务可用,然后主容器将启动。在上面的 initContainer 文档中有一个很好的例子。