使用Helm通过PostgreSQL将微服务部署到Kubernetes

时间:2020-02-21 05:23:13

标签: postgresql kubernetes kubernetes-helm

我们有几个微服务,所有这些微服务都有自己的头盔图和SCM存储库。我们在每个阶段和生产环境中都有两个不同的集群。其中一个微服务需要使用PostgreSQL。根据公司政策,我们有一个单独的团队为Postgre创建了Helm Charts,我们应该使用它,并且需要独立地部署到我们的k8s集群中。由于我们没有自己的Helm存储库,我想我们需要使用ConfigMap或Secrets或两者都使用,以将PostgreSQL集成到我们的微服务中。

这可能是一个普遍的问题,但是我无法找到不使用依赖项如何集成数据库的特定示例。因此,我猜我需要将数据库信息作为ENV添加到deploy.yaml中,如下所示,但是使用Configmap或Secrets的最佳实践是什么,以及它们在模板中的外观如何,以及应如何传递url,username,password安全的环境吗?

  env:
    - name: SPRING_DATASOURCE_URL
      valueFrom:
        configMapKeyRef: 
          name: postgres-production
          key: jdbc-url
    - name: SPRING_DATASOURCE_USERNAME
      valueFrom:
        secretKeyRef:
          name: postgres-production
          key: username
    - name: SPRING_DATASOURCE_PASSWORD
      valueFrom:
        secretKeyRef:
          name: postgres-production
          key: password

微服务的树

├── helm
│   └── oneapihub-mp
│       ├── Chart.yaml
│       ├── charts
│       ├── templates
│       │   ├── NOTES.txt
│       │   ├── _helpers.tpl
│       │   ├── deployment.yaml
│       │   ├── ingress.yaml
│       │   ├── networkpolicy.yaml
│       │   ├── service.yaml
│       │   ├── serviceaccount.yaml
│       │   └── tests
│       │       └── test-connection.yaml
│       ├── values.dev.yaml
│       ├── values.prod.yaml
│       ├── values.stage.yaml

2 个答案:

答案 0 :(得分:0)

我认为这个mysql helm chart回答了您的问题。

您应该检查3支。

您可以在values.yaml中创建自己的密码。

 ## Create a database user
 ##  
 # mysqlUser:
 ## Default: random 10 character string
 # mysqlPassword:

其中将秘密使用encodedbase64

mysql-password:{{.Values.mysqlPassword | b64enc |引用}}

然后它将被部署使用。

- name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: {{ template "mysql.secretName" . }}
              key: mysql-password

有关基于kubernetes documentation的机密的更多信息。

Kubernetes Secrets使您可以存储和管理敏感信息,例如密码,OAuth令牌和ssh密钥。与逐字记录在Pod定义或容器映像中相比,将机密信息存储在Secret中更安全,更灵活

根据我的知识,应该怎么做。


编辑

我添加mysql作为示例,有postgres chart。想法还是一样。

我很困惑我该如何在应用程序中创建配置和秘密Yaml?

您可以在图表之前创建密钥,但是您可以在模板中创建secret.yaml并在其中创建密钥,安装图表时,它将与其余Yamls一起创建,并将从values.dev中获取凭据, prod,stage.yamls。

仅使用此env变量就足够了吗?

是的,如您在答案中看到的那样,如果您在values.yaml中创建了一些密码,那么它将通过使用secretKeyRef进行部署而秘密获取。

我应该在同一个名称空间中部署我的应用程序吗?

我不明白这个问题,您可以为应用程序指定名称空间,也可以在默认名称空间中部署所有内容。

希望它能回答您的问题。让我知道您是否还有其他问题。

答案 1 :(得分:0)

如果需要独立于容器安装和管理数据库,则实际上需要将其视为外部数据库。除了特定的主机名之外,数据库是在相同名称空间,不同名称空间还是在群集之外运行都没有任何区别。

如果您的运营团队的PostgreSQL容器生成您在问题中显示的特定的ConfigMap和Secret对,并且它们始终位于同一Kubernetes命名空间中,那么我唯一要做的更改就是使其在完全可参数化的位置部署是。

# values.yaml

# postgresName has the name of the PostgreSQL installation.
postgresName: postgres-production
env:
  - name: SPRING_DATASOURCE_URL
    valueFrom:
      configMapKeyRef: 
        name: {{ .Values.postgresName }}
        key: jdbc-url

如果将这些作为配置值提供给Helm ...

# values.yaml
postgres:
  url: ...
  username: ...
  password: ...

...我可能会将用户名和密码部分放在一个秘密中,并按照此处的说明将它们合并。不过,我可能会直接注入URL部分。在这里使用ConfigMap并没有什么错,它与您在没有Helm的情况下的工作方式相匹配,但是对额外的间接层没有很多明显的价值。

env:
  - name: SPRING_DATASOURCE_URL
    value: {{ .Values.postgres.url | quote }}
  - name: SPRING_DATASOURCE_USERNAME
    valueFrom:
      secretKeyRef:
        name: {{ template "chart.name" . }}
        key: postgresUsername

当您部署图表时,可以提供一组覆盖的Helm值。在图表的values.yaml文件中添加一些合理的默认值,然后为每个环境维护一个单独的值文件。

helm upgrade --install myapp . -f values.qa.yaml
# where values.qa.yaml has database settings for your test environment