解放開發者!3款工具實現快速K8S開發

RancherLabs發表於2020-10-23

本文轉自Rancher Labs

關注我們,即可第一時間獲取K8S教程哦

簡 介

時至今日,Kubernetes正在變得越來越重要,不僅僅是運維需要Kubernetes,在開發的世界裡Kubernetes也不可或缺。因此能夠熟練掌握Kubernetes知識會備受追捧。然而問題是,開發人員是否需要直接上手操作Kubernetes,他們是否必須完全瞭解Kubernetes。

規避這一問題的常見方法是通過提供一個平臺或CI/CD流水線,將Kubernetes的複雜性從開發人員身上抽象出來,使開發人員更容易在Kubernetes內測試應用程式,而無需直接訪問Kubernetes。

然而,允許開發人員直接訪問Kubernetes,讓他們直接在Kubernetes內部開發一些應用程式往往是有意義的,因為這樣可以在一個非常接近生產的環境中工作。

這就出現了一個問題,即如何讓開發人員使用Kubernetes工作,同時又不因其複雜性而使他們不堪重負。這個問題的答案可能是需要使用為Kubernetes而準備的開發者工具,例如DevSpace。在這篇文章中,我們將探討開發人員如何使用DevSpace和Rancher來簡化Kubernetes開發。

DevSpace: 使用Rancher輕鬆開發

DevSpace是一款面向Kubernetes的客戶端、開源的開發者工具。它可以:

  • 直接在Kubernetes內部構建、測試和除錯應用程式

  • 通過更新正在執行的容器而不需要重建映象或重啟容器來進行熱過載開發

  • 在團隊內部以及在開發、暫存和生產中統一部署工作流程

  • 自動完成映象構建和部署的重複性任務

DevSpace作為開發者的客戶端工具,是對Rancher的補充。開發者在Rancher內獲得分配的專案,然後直接在Kubernetes內開發或測試應用。這使開發環境更接近生產環境,讓開發人員在釋出新功能時更有把握,相信一切都能夠在生產環境中執行良好。

設定DevSpace

首先需要下載DevSpace二進位制檔案,接下來,在一個已經容器化的專案中通過執行devspace init建立一個新的專案。如果你現在手邊沒有一個可以用來進行試驗的專案,你可以使用我們的示例專案:

https://devspace.sh/cli/docs/getting-started/initialize-project#choose-a-project

$ devspace init

     ____              ____
    |  _ \  _____   __/ ___| _ __   __ _  ___ ___
    | | | |/ _ \ \ / /\___ \| '_ \ / _` |/ __/ _ \
    | |_| |  __/\ V /  ___) | |_) | (_| | (_|  __/
    |____/ \___| \_/  |____/| .__/ \__,_|\___\___|
                            |_|


? How do you want to initialize this project?
 Use the Dockerfile in ./Dockerfile

? Which registry do you want to use for storing your Docker images?
 Use hub.docker.com => you are logged in as devspacecloud

? Which image name do you want to use on Docker Hub? devspacecloud/quickstart

? Which port is your application listening on? (Enter to skip) 8080

[done] √ Project successfully initialized

在你回答了幾個關於應該被初始化的專案的問題之後,DevSpace將為你建立一個devspace.yaml。這個檔案包含了如何使用DevSpace部署和開發專案,看起來如下所示:

version: v1beta9
# This section defines the images that should be built
images:
  app:
    image: devspacecloud/quickstart
    preferSyncOverRebuild: true
    # this option tells devspace to automatically wrap the Dockerfile entrypoint in memory
    # with a small restart helper script so that the process can be easily restarted from within the
    # container.
    injectRestartHelper: true
# Defines an array of everything (component, Helm chart, Kubernetes maninfests)
# that will be deployed with DevSpace in the specified order
deployments:
- name: quickstart
  helm:
    # Uses a special helm chart provided by devspace to complement projects that don't have an own
    # helm chart
    componentChart: true
    values:
      containers:
      - image: devspacecloud/quickstart
      service:
        ports:
        - port: 8080
# Configuration that will be used for developing the application
dev:
  # Port forward certain ports from the application to the local computer
  ports:
  - imageName: app
    forward:
    - port: 8080
  # Hot reload changes instead of rebuilding the complete docker image all the time
  sync:
  - imageName: app
    # This tells devspace to restart the container after a file was synced into it
    onUpload:
      restartContainer: true
profiles:
...

現在,你可以跨團隊分享這個配置。它指定了如何在Kubernetes內部獨立於本地設定開發應用程式。

要開始開發應用程式,你需要訪問一個Kubernetes叢集或Rancher專案。最佳實踐是為每個開發人員建立一個Rancher專案或者為一個共享叢集內的開發者團隊建立一個單一專案。

為了在不同專案和名稱空間之間確保簡單的隔離,使用常見的Kubernetes資源,如Resource Quotas、網路策略、Pod安全策略和Limit Ranges等。

使用DevSpace開發應用程式

執行命令devspace.dev來開啟開發流程。這將起到以下作用:

  • 構建和部署你的應用程式

  • 流式傳輸在部署過程中部署的所有容器日誌

  • 轉發在devspace.yaml中的dev.ports指定的所有埠

  • 根據dev.sync中的同步配置來同步所有的檔案更改,這樣你就可以在執行的容器中重啟應用程式,而無需重建映象或重新部署任何東西

$ devspace dev -n test
[info]   Using kube context 'docker-desktop'
[info]   Using namespace 'test'
[done] √ Created namespace: test
[info]   Building image 'myusername/devspace:C5992q4' with engine 'docker'
Step 1/7 : FROM node:13.12-alpine
...
[done] √ Done processing image 'myusername/devspace'
[done] √ Deployed helm chart (Release revision: 0)
[done] √ Successfully deployed quickstart with helm
[done] √ Port forwarding started on 3000:3000
[done] √ Sync started on /devspace/examples/quickstart <-> . (Pod: test/quickstart-5d7f4d8fd-w95cx)

#########################################################
[info]   DevSpace UI available at: http://localhost:8090
#########################################################

[info]   Starting log streaming for containers that use images defined in devspace.yaml

[quickstart]
[quickstart] > node-js-sample@0.0.1 start /app
[quickstart] > nodemon index.js
[quickstart]
[quickstart] [nodemon] 1.19.4
[quickstart] [nodemon] to restart at any time, enter `rs`
[quickstart] [nodemon] watching dir(s): *.*
[quickstart] [nodemon] watching extensions: js,mjs,json
[quickstart] [nodemon] starting `node index.js`
[quickstart] Example app listening on port 3000!

本地修改檔案後,檔案會同步到容器中。容器重啟後無需通過Docker完全重建,大大加快了開發程式。

然後DevSpace會啟動一個本地UI,你可以訪問和檢查建立的pod。這簡化了與Kubernetes的互動,特別是對於不熟悉kubectl的使用者。

除了devspace devdevspace deploy命令可以用於打包和部署應用程式,而不需要熱過載、埠轉發或日誌流。DevSpace提供了許多自定義功能,以根據你的用例和設定調整其行為,包括:

  • 依賴項,可以讓你開發和部署依賴於其他專案的專案

  • Profiles,可以在一個devspace.yaml中進行多種配置

  • 允許指定動態配置值的變數

  • 允許為專案配置自定義命令的命令

  • 可以在特定的DevSpace事件上執行某些功能的Hooks

  • 自動為devspace命令新增標誌(flag)的環境變數

  • 擴充套件DevSpace和其命令的外掛

DevSpace標準化和簡化了開發人員與Kubernetes的互動方式的同時,Rancher在伺服器端管理著開發者如何在Kubernetes內部工作。Rancher可以讓你啟動開發叢集並將它們分到不同的專案中,在這些專案中開發團隊可以一起工作和測試。

Resource Quotas專案除了常見的Kubernetes隔離資源外,還可以在資源方面約束團隊,讓團隊在共享Kubernetes叢集中得到公平的使用。共享Kubernetes叢集可以減少基礎設施的開銷並且可以直接在Kubernetes內部進行有效開發。

再為快速開發添磚加瓦:loft

loft是另一個很有用的工具,它可以在開發過程中新增一些比較方便的功能,包括:

  • 虛擬叢集,比“真實的”叢集成本更低,並且可以在數秒內建立並再次清理,而且功能比簡單的名稱空間更強大

  • 在共享叢集中為開發人員提供名稱空間的自助服務(self-service)

  • 睡眠模式,在一定時間不活動後,將名稱空間置於睡眠狀態,以節省計算成本

你可以通過安裝loft helm chart 輕鬆地將loft新增到Rancher。loft CLI也可以作為DevSpace的外掛。

總 結

對於開發人員而言,熟練上手使用Kubernetes並不簡單,目前許多企業仍然在努力尋找一種方法來抽象Kubernetes的複雜性。這往往導致定製化的平臺缺乏許多功能,限制了Kubernetes的潛力,並且是另一個維護負擔。

將DevSpace、Rancher和loft結合起來,讓開發者可以直接訪問Kubernetes,並且只需要一個命令:devspace dev

Rancher十分擅長建立和管理多個叢集,DevSpace擅長為開發者提供工具。將Rancher和DevSpace相結合是十分簡單的,並且可以顯著提升開發人員的生產力。

此外,loft為開發團隊提供了更多有用的功能,讓開發者可以隨時獲得Kubernetes的工作環境,同時保持低成本。將Rancher、DevSpace和loft這三個工具結合起來,對於使用Kubernetes的開發團隊來說,是一個十分理想的設定。

相關文章