我们有几个微服务,所有这些微服务都有自己的头盔图和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
答案 0 :(得分:0)
我认为这个mysql helm chart回答了您的问题。
您应该检查3支。
您可以在values.yaml中创建自己的密码。
## Create a database user
##
# mysqlUser:
## Default: random 10 character string
# mysqlPassword:
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