在现代的微服务架构中,Kubernetes(简称K8s)已成为容器编排的标准选择。而在软件开发和部署流程中,持续集成和持续交付(CI/CD)工具如GitHub Actions也变得越来越重要。今天我们将探讨如何在使用GitHub Actions和Docker Compose部署到Kubernetes集群时,管理环境变量,特别是.Net Core 8 APIs的场景。

背景

假设我们有一个由多个.Net Core 8 APIs构成的应用,这些API使用Docker Compose文件来定义服务,然后通过Kubernetes部署。在部署过程中,我们希望能够动态地更改appsettings.json中的配置项,比如数据库用户名和密码。这些配置项可以通过环境变量来覆盖。

问题描述

在GitHub Actions工作流中,尝试将环境变量通过GitHub Secrets注入到容器中,但发现这些变量并未如预期那样被应用到API中,导致API启动失败。

解决方案

根据Docker Compose文档的推荐,我们可以采用以下步骤在GitHub Actions中创建一个.env文件,并将Secrets注入到其中:

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Create .env file
      run: |
        touch .env
        echo DATABASEUSERNAME=${{ secrets.DATABASEUSERNAME }} >> .env
        echo DATABASEPASSWORD=${{ secrets.DATABASEPASSWORD }} >> .env
    # 其他构建和推送步骤

解析

  1. 创建.env文件:在GitHub Actions工作流中,我们使用touch命令创建一个名为.env的文件。

  2. 注入Secrets:使用echo命令将存储在GitHub Secrets中的环境变量值写入.env文件。

  3. Docker Compose使用.env文件:当执行docker-compose up时,Docker Compose会自动读取.env文件并将环境变量注入到容器中。

实例

假设我们的appsettings.json文件包含以下内容:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=myDb;User Id=admin;Password=admin123;"
  }
}

我们希望将数据库用户名和密码动态化:

  • 在GitHub Secrets中定义DATABASEUSERNAMEmyUserDATABASEPASSWORDmyPassword123

  • 在GitHub Actions中,创建并填充.env文件后,.env文件内容如下:

DATABASEUSERNAME=myUser
DATABASEPASSWORD=myPassword123
  • ProgramExtensions.cs中,我们确保如果环境变量存在,API将使用这些变量来覆盖appsettings.json中的值。

总结

通过这种方法,我们成功地将GitHub Secrets注入到Kubernetes中运行的容器环境中,使得.Net Core 8 APIs能够在部署时动态获取配置信息,确保了API的安全性和灵活性。在实际项目中,可以根据需要进一步扩展这种方法来管理更多的环境变量和配置项。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐