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

如何为Web应用程序构造Kubernetes项目?,kubernetes,gcloud,Kubernetes,Gcloud,我喜欢用kubernetes创建一个应用程序 我有api服务器,前端服务器,一些刮板等等 我想把api和前端放在同一个吊舱里,所有的刮板放在另一个吊舱里 我希望能够部署单个项目,例如仅部署api或特定的scraper 每个应用程序都有用于部署的docker文件和circle ci配置 我应该如何组织我的项目? 每个应用程序都应该在自己的存储库中,还是应该使用monorepo? k8s.yaml应该保存在哪里(因为它涉及所有项目)? 我应该在哪里应用k8s配置?是否应该在每次部署时都执行此操作

我喜欢用kubernetes创建一个应用程序

  • 我有api服务器,前端服务器,一些刮板等等
  • 我想把api和前端放在同一个吊舱里,所有的刮板放在另一个吊舱里
  • 我希望能够部署单个项目,例如仅部署api或特定的scraper
  • 每个应用程序都有用于部署的docker文件和circle ci配置
我应该如何组织我的项目?
每个应用程序都应该在自己的存储库中,还是应该使用monorepo?
k8s.yaml应该保存在哪里(因为它涉及所有项目)?
我应该在哪里应用k8s配置?是否应该在每次部署时都执行此操作?
如何为每项服务轻松配置域名?

这实际上取决于您的使用情况,但我建议您采取一些措施,让生活更轻松:

我想把api和前端放在同一个pod中,所有的 另一个舱的刮刀

不要在同一个吊舱中放置多个容器(除非是导管、istio等侧车),因为对吊舱进行健康检查非常困难(如果一个容器放下,另一个容器升起,吊舱……半健康?)

我希望能够部署单个项目,只部署用于 示例或特定刮刀

我应该将k8s.yaml保存在哪里(因为它涉及所有项目)

将yaml文件分离到它们自己的项目目录中,以便您可以独立部署它们并获得更好的可读性

使用monorepo有它的优点,代码在一个地方,等等。。。但是,如果您将拥有CI,随着repo变得更大,您的构建可能会变得更慢,因此您可能需要优化(使用构建缓存等),或者为您可能拥有的每个业务域或逻辑组拥有一个单独的CI

我应该如何组织我的项目

将基础设施与应用程序分开,以便将来您希望从GCE切换到AWS或Azure,同时提高可读性

我应该在哪里应用k8s配置?这应该发生在每个人身上吗 部署如何为每个服务轻松配置域名

Kubernetes提供了一个非常广泛的示例列表,介绍了可以将配置注入应用程序的所有方法,这取决于您的用例。 您不需要为每个服务配置域名,只需要为那些暴露于外部世界的服务配置域名。您可以使用
ingres
对象或代理

您需要考虑的事项:

日志记录-这是一个非常重要的主题,因为拥有可扩展的POD可能是一项棘手的工作。我会花时间部署一些紧凑的分布式日志记录

环境-开发/生产或开发/登台/生产或?无论您选择什么,请确保它们之间的差异最小,并且每个步骤都可以轻松部署。

有几点:

我想把api和前端放在同一个吊舱里,所有的刮板放在另一个吊舱里

没关系。只要它们在同一个豆荚中的不同容器上。多容器吊舱可以通过localhost地址相互访问。而豆荚可以通过DNS看到彼此。(是的,半健康意味着不健康)

我应该如何组织我的项目

我对不同的容器使用不同的回购协议。但对于每一个pod=1回购协议来说都是可以的。 这样维护起来更容易,而且您有单独的CI/CD版本,可以单独更新每个应用程序。将每个部署清单YAML文件存储在repo的根目录中是一个好主意。因为一个部署意味着一个应用程序(一组POD)

我应该在哪里应用k8s配置?是否应该在每次部署时都执行此操作?如何为每个服务轻松配置域名

在部署清单文件中,您可以将配置存储在环境中或使用配置映射。对于每个部署,您不需要使用
kubectl apply
。 在CI中,您可以为每个部署执行以下操作:

- docker build -t {registry}:{version} .
- docker push {registry}:{version}
- kubectl set image deployment/{API_NAME} {containername}={registry}:{version} -n {NAMESPACE}
在API前面需要一个反向代理作为网关,最好的选择是易于部署和配置的入口。它知道你的豆荚。 入口配置可以类似于:

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只使用一个子域

谢谢!我应该把yaml放在哪里?在定义项目pod的同一yaml文件中?如果我不在每次部署中
kubectl应用
,它将如何发布?假设我有两个repo用于两个项目-前端和后端。他们应该在同一个舱里。我应该将k8s配置放在哪里?我通常将所有部署保存在一个名为Kube deployments的不同repo中。@Naor和kubectl set image完成这项工作