如何为Web应用程序构建Kubernetes项目?

时间:2018-11-22 09:10:43

标签: kubernetes gcloud

我喜欢用kubernetes创建一个应用。

  • 我有api服务器,前端服务器,一些抓取工具等等。
  • 我想将api和前端放在同一个容器中,所有刮板都放在另一个容器中。
  • 我希望能够部署单个项目,例如仅部署api或特定的刮板。
  • 每个应用程序都具有一个docker文件和circle ci配置用于部署

我应该如何构建我的项目?
每个应用程序都应该位于自己的存储库中,还是应该使用monorepo?
我应该将k8s.yaml保存在哪里(因为它与所有项目有关)?
我应该在哪里应用k8s配置?是否应该在每次部署中发生? 如何为每个服务轻松配置域名?

2 个答案:

答案 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仅使用一个子域。