我喜欢用kubernetes创建一个应用。
我应该如何构建我的项目?
每个应用程序都应该位于自己的存储库中,还是应该使用monorepo?
我应该将k8s.yaml保存在哪里(因为它与所有项目有关)?
我应该在哪里应用k8s配置?是否应该在每次部署中发生?
如何为每个服务轻松配置域名?
答案 0 :(得分:2)
这实际上取决于您的用例,但我建议您采取一些简化生活的方法:
我想将api和前端放在同一个容器中, 其他吊舱中的刮刀。
请勿在同一个吊舱中放置多个容器(除非是像导管,istio等类似的边车),因为对吊舱执行健康检查非常困难(如果一个容器倒下了,另一个在上,豆荚是...半健康?)
我希望能够部署一个项目,只有api用于 示例或特定的刮板。
我应该将k8s.yaml保存在哪里(因为它与所有项目有关)?
将yaml文件分离到它们自己的项目目录中,以便您可以独立部署它们并提高可读性。
使用monorepo有其优势,代码位于一个地方,等等...但是,如果您拥有CI,则随着repo变大,您的构建可能会变慢,因此您要么需要优化(使用构建缓存)等等),或者为您可能拥有的每个业务域或逻辑组使用单独的CI。
我应该如何构建我的项目?
将基础设施与应用程序分开,因此如果有一天您希望从GCE切换到AWS或Azure,还可以提高可读性。
我应该在哪里应用k8s配置?它应该发生在每个 部署?如何为每个服务轻松配置域名?
Kubernetes在将配置注入应用程序的所有方式中确实有大量示例示例,这实际上取决于您的用例。
您无需为每个服务配置域名,只需为暴露于外界的域名配置。您可以使用Ingress
对象或代理。
您需要考虑的事情:
记录-这是一个非常重要的主题,因为拥有可扩展的pod可能会很棘手。我真的会花时间部署一些紧密的分布式日志记录。
环境-开发/生产或开发/分期/生产或...?无论您选择什么,请确保它们之间的差异最小,并且每个步骤都可以轻松部署。
答案 1 :(得分:2)
有几点:
我想将api和前端放置在同一个容器中,所有刮板都放置在另一个容器中。
没关系。只要它们位于同一吊舱中的不同容器中即可。使用本地主机地址可以相互访问多个容器容器。和pod可以通过DNS互相看到。 (是的,一半健康意味着不健康)
我应该如何构建我的项目?
我对不同的容器使用不同的仓库。但是每个Pod = 1个仓库就可以了。 这样更容易维护,并且您拥有独立的CI / CD构建,可让您分别更新每个应用程序。在回购的根目录中存储每个Deployment清单YAML文件是一个好主意。因为一个部署意味着1个应用程序(一组Pod)。
我应该在哪里应用k8s配置?是否应该在每次部署中发生?如何为每个服务轻松配置域名?
在部署清单文件中,您可以将配置存储在ENV中或使用配置映射。您无需为每个部署使用kubectl apply
。
在您的CI中,您可以为每个部署执行此操作:
- docker build -t {registry}:{version} .
- docker push {registry}:{version}
- kubectl set image deployment/{API_NAME} {containername}={registry}:{version} -n {NAMESPACE}
您需要在API之前将反向代理作为网关,最好的选择是Ingress,它易于部署和配置。它知道您的豆荚。 入口配置可以像这样:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: api
namespace: production
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: api.yourdomain.com
http:
paths:
- path: /application1
backend:
serviceName: app1-production
servicePort: 80
- path: /application2
backend:
serviceName: app2-production
servicePort: 80
,或者根据您的喜好,每个api仅使用一个子域。