23 張圖細講使用 Devtron 簡化 K8S 中應用開發

23 張圖細講使用 Devtron 簡化 K8S 中應用開發

在本文中,您將學習如何在多集羣環境中使用 Devtron 在 K8S 上進行應用開發。

https://devtron.ai/

Devtron 附帶用於構建、部署和管理微服務的工具。它通過提供直觀的 UI 和 Helm 圖表支持來簡化 K8S 上的部署。今天,我們將使用自定義 Helm 圖表運行一個示例 Spring Boot 應用程序。將它部署在跨多個 K8S 集羣的不同命名空間中。示例應用程序連接到數據庫,該數據庫在 K8S 上運行並已使用 Devtron Helm 圖表部署。

在 K8S 上安裝 Devtron

第一步,在 K8S 上安裝 Devtron。有兩種安裝選項:帶 CI/CD 模塊或不帶它。本文不會構建 CI/CD 流程,但是這個模塊中包含了一些重要功能。首先,添加 Devtron Helm 存儲庫:

$ helm repo add devtron https://helm.devtron.ai

然後,執行以下 Helm 命令:

$ helm install devtron devtron/devtron-operator \
    --create-namespace --namespace devtroncd \
    --set installer.modules={cicd}

有關詳細的安裝說明,請參閱 Devtron 文檔。

https://docs.devtron.ai/getting-started/install/install-devtron-with-cicd

使用 Kind 創建第二個 K8S 集羣

爲了在本地機器上準備多集羣環境,我們將使用 Kind, 通過執行以下命令來創建第二個 K8S 集羣 c1 :

https://kind.sigs.k8s.io/

$ kind create cluster --name c1

第二個集羣的上下文是:kind-c1。創建 Kind 集羣后,它將成爲默認上下文。

現在,我們的目標是將新創建的 Kind 集羣添加爲 Devtron 的託管集羣。一個 Devtron 實例可以管理多個 K8S 集羣。當然,默認情況下,它只管理一個本地集羣。在我們將 Kind 集羣添加到 Devtron 儀表板之前,應該首先在該集羣上配置權限。以下腳本將生成一個bearer token用於身份驗證,以便 Devtron 能夠與目標集羣通信:

$ curl -O https://raw.githubusercontent.com/devtron-labs/utilities/main/kubeconfig-exporter/kubernetes_export_sa.sh && bash kubernetes_export_sa.sh cd-user devtroncd https://raw.githubusercontent.com/devtron-labs/utilities/main/kubeconfig-exporter/clusterrole.yaml

bearer token打印在該命令的輸出中,複製它。

我們還必須提供目標集羣的 master API 的 URL。由於在 Kind 上運行 K8S,我需要獲取包含 Kind 的 Docker 容器的內部地址。爲了獲得它,我們需要運行以下命令:

$ docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' c1-control-plane

這是我的 Kind 集羣的 IP 地址:

現在,我們擁有了在 Devtron 儀表板中添加新託管集羣所需的所有數據。爲此,導航到Global Configuration部分。然後選擇Clusters and Environments項並單擊Add cluster按鈕。需要填寫 Kind 集羣 URL 和之前生成的bearer token

如果一切正常,您應該會在託管集羣列表中看到第二個集羣。現在,您還需要根據下面顯示的消息在 Kind 上安裝 Devtron 代理:

創建環境

我們將定義三個環境。在 Devtron 環境中分配給集羣。我們將在本地集羣(local)上創建一個環境,和另外兩個 Kind 集羣 ( remote-dev, remote-devqa) 。每個環境都有一個目標命名空間。爲了簡化,命名空間的名稱與環境名稱相同。當然,您可以設置任何想要的名稱。

現在,切換到Clusters視圖。

如您所見,現在有兩個集羣連接到 Devtron:

我們可以看一下每個集羣的詳細信息。在這裏,您可以看到kind-c1集羣的詳細視圖:

添加自定義 Helm 存儲庫

Devtron 最重要的功能之一是對 Helm 圖表的支持。默認情況下,Devtron 中有幾個可用的 Helm 存儲庫,包括bitnamielastic,也可以添加自定義存儲庫。這裏使用我自己的 Helm 存儲庫,其中包含用於部署 Spring Boot 應用程序的圖表。我已經將它放在 GitHub 上:

https://piomin.github.io/helm-charts/

我們的圖表名稱是spring-boot-api-app,最新版本是0.3.2

爲了在 Devtron 中添加自定義存儲庫,我們需要再次進入Global Configurations部分。然後轉到Chart repositories菜單項,然後單擊Add repository按鈕。如下所示,我添加了一個新存儲庫piomin

創建存儲庫後,您可以轉到Chart Store部分以驗證新圖表是否可用。

使用 Devtron 部署 Spring Boot 應用程序

現在,我們可以進行實踐中最重要的部分:應用程序部署。我們的示例 Spring Boot 應用程序位於 GitHub 上的以下存儲庫中:

https://github.com/piomin/sample-spring-kotlin-microservice.git

這是一個用 Kotlin 編寫的簡單 REST 應用程序。它公開了一些用於添加和返回人員的 HTTP 端點,並使用內存存儲。這是 Spring @RestController

@RestController
@RequestMapping("/persons")
class PersonController(val repository: PersonRepository) {

   val log: Logger = LoggerFactory.getLogger(PersonController::class.java)

   @GetMapping("/{id}")
   fun findById(@PathVariable id: Int): Person? {
      log.info("findById({})", id)
      return repository.findById(id)
   }

   @GetMapping("/age/{age}")
   fun findByAge(@PathVariable age: Int): List<Person> {
      log.info("findByAge({})", age)
      return repository.findByAge(age)
   }

   @GetMapping
   fun findAll(): List<Person> = repository.findAll()

   @PostMapping
   fun add(@RequestBody person: Person): Person = repository.save(person)

   @PutMapping
   fun update(@RequestBody person: Person): Person = repository.update(person)

   @DeleteMapping("/{id}")
   fun remove(@PathVariable id: Int): Boolean = repository.removeById(id)

}

假設我們正在開發最新版本,想將其部署在 K8S 上以執行一些開發測試。第一步,將在本地構建應用程序並使用 Jib Maven 插件將鏡像推送到容器註冊表。這是所需的配置:

<plugin>
  <groupId>com.google.cloud.tools</groupId>
  <artifactId>jib-maven-plugin</artifactId>
  <version>3.3.0</version>
  <configuration>
    <to>
      <image>piomin/sample-spring-kotlin-microservice</image>
      <tags>
        <tag>1.1</tag>
      </tags>
    </to>
    <container>
      <user>999</user>
    </container>
  </configuration>
</plugin>

讓我們使用以下命令構建鏡像並將其推送到容器註冊表:

$ mvn clean compile jib:build -Pjib,tomcat

除了 YAML 模板,Helm 存儲庫還包含一個用於values.yaml 驗證的 JSON schema 。多虧了該 schema ,我們將能夠利用 Devtron GUI 從圖表創建應用程序。讓我們看看它是如何工作的。

單擊自定義圖表後,將被重定向到包含詳細信息的頁面。最新版本的圖表是0.3.2. 只需單擊部署按鈕。

在下一頁上,需要提供應用程序的配置。目標環境是存在於主集羣上的local。多虧 Devtron 對 Helm values.schema.json 的支持,使得我們使用 GUI 表單定義所有值。例如,可以增加更改鏡像的值到最新的:1.1

部署應用程序後,我們可以驗證其狀態:

讓我們進行一些測試調用。示例 Spring Boot 公開了 Swagger UI,因此我們可以輕鬆發送 HTTP 請求。要與運行在 K8S 上的應用程序交互,應該爲服務啓用端口轉發kubectl port-forward svc/sample-spring-boot-api 8080:8080。執行該命令後,您可以通過 http://localhost:8080/swagger-ui.html 訪問地址 Swagger UI:

Devtron 允許我們查看 pod 日誌。還可以用 grep。下面展示了與測試調用相關的日誌。

將應用部署到遠程集羣

現在,我們將示例 Spring Boot 應用程序部署到遠程集羣。爲了做到這一點,請轉到與以前相同的頁面,但不要選擇本地環境,而是選擇remote-dev,它與kind-c1集羣相關聯。

現在,有兩個相同的應用程序在兩個不同的集羣上運行。我們可以對在 Kind 集羣上運行的應用程序和本地集羣執行相同的操作,例如驗證其狀態或檢查日誌。

部署應用組

假設我們要部署連接到數據庫的應用程序。我們可以使用名爲Chart Group的 Devtron 功能一步完成。使用該功能,我們可以將 Spring Boot 的 Helm 圖表和 Postgres 的圖表放在同一個邏輯組中。然後,我們可以將整個組部署到目標環境中。要創建圖表組,請轉到 Chart Store 菜單,然後單擊Create Group按鈕。您應該設置組的名稱並選擇將包含的圖表。對我來說,就是bitnami/postgresql圖表和我的自定義 Helm 圖表。

創建組後,您將在Chart Store主頁面上看到它。現在,只需單擊它即可部署應用程序。

單擊帶有圖表組的磁貼後,您將被預測到部署頁面。

單擊Deploy to…按鈕後,Devtron 會將您重定向到下一頁。您可以爲該組的所有成員圖表設置目標項目和環境。我們會將它們從集羣部署到kind-c1集羣的remote-devqa命名空間中。其中的鏡像,可以填寫我的 Docker 帳戶中的:piomin/person:1.1

默認情況下,它會嘗試連接到postgres主機上的數據庫。唯一需要注入應用容器的是 postgresql Secret(由 Bitnami Helm 圖表生成)中postgres用戶密碼。要注入該Secret中的環境變量,請在自定義 Spring Boot 圖表中使用extraEnvVarsSecret參數。最後,讓我們通過單擊Deploy按鈕在remove-devqa命名空間中部署 Spring Boot 和 Postgres 。

這是本次實踐中已部署應用程序的最終列表:

總結

  • 藉助 Devtron,可以使用 Helm 圖表輕鬆地支持跨多個 K8S 集羣部署應用程序。
  • Devtron 簡化了 K8S 的開發,可以通過圖表組功能部署所有需要的應用程序。
  • 可以使用 GUI 儀表板管理和監控應用程序。
  • 可以在儀表板中執行所有操作,而無需自己傳遞任何 YAML 清單或執行kubectl命令。

本文由mdnice多平臺發佈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章