1. 程式人生 > 其它 >kafka叢集 kubernetes_為什麼 Kubernetes 如此受歡迎?

kafka叢集 kubernetes_為什麼 Kubernetes 如此受歡迎?

技術標籤:kafka叢集 kubernetes

在撰寫本文時,Kubernetes 已有 6 年曆史[1]了,在過去的兩年中,它的流行度不斷提高,一直是最受歡迎的平臺之一[2]。今年,它成為最受歡迎的第三大平臺[3]。如果您還沒有聽說過 Kubernetes,告訴你它是一個平臺,可以讓您執行和協調容器工作負載。

容器最初是一個 Linux 核心程序隔離結構,其中包含 2007 年的 cgroups[4] 和 2002 年的 namespaces[5](名稱空間)。當 LXC[6] 在 2008 年可用時,容器變得越來越重要,而 Google 開發了自己的內部“在容器中執行所有機制”系統,稱為 Borg[7]。快進到 2013 年,Docker 正式釋出,並完全面向大眾。當時,Mesos[8] 是編排容器的主要工具,但並未得到廣泛採用。Kubernetes 於 2015 年釋出,並迅速成為事實上的容器編排標準。

為了嘗試瞭解 Kubernetes 的受歡迎程度,請考慮一些問題。開發人員最後一次可以在何時達成部署生產應用程式的方式?您知道有多少開發人員開箱即用地執行工具?如今有多少雲運營工程師不瞭解應用程式如何工作?我們將在本文中探討答案。

以資料(YAML)為基礎的的架構

來自 Puppet[9] 和 Chef[10] 的世界,Kubernetes 的重大轉變之一就是從以程式碼為基礎的基礎架構過渡到以資料為基礎的基礎架構(特別是 YAML)。Kubernetes 中的所有資源,包括 Pod,配置,部署,卷等,都可以簡單地在 YAML 檔案中表示。

apiVersion:v1kind:Podmetadata:name:sitelabels:app:webspec:containers:-name:front-endimage:nginxports:-containerPort:80

這種表示形式使 DevOps 或站點可靠性工程師可以更輕鬆地完全表達其工作負載,而無需使用 Python,Ruby 或 Javascript 等程式語言編寫程式碼。

以資料為基礎的架構的其他好處包括:

  • GitOps 或 Git Operations 版本控制。使用這種方法,您可以將所有 Kubernetes YAML 檔案保留在 git 儲存庫下,這使您可以準確地知道何時進行更改,由誰進行更改以及究竟進行了哪些更改。這樣可以避免整個組織需要成員去尋找可能模稜兩可的內容,從而提高了整個組織的透明度並提高了效率。同時,通過合併請求,可以更輕鬆地自動更改 Kubernetes 資源。
  • 可擴充套件性。將資源定義為 YAML,使叢集運營商可以非常輕鬆地更改 Kubernetes 資源中的一個或兩個數字來更改縮放行為。Kubernetes 具有水平 Pod 自動縮放器,可幫助您確定特定部署必須能夠處理的最小和最大數量的 Pod,才能處理低流量和高流量時間。例如,如果您執行的部署可能由於流量突然增加而可能需要更多容量,則可以將 maxReplicas 從 10 更改為 20:
apiVersion:autoscaling/v2beta2kind:HorizontalPodAutoscalermetadata:name:myappnamespace:defaultspec:scaleTargetRef:apiVersion:apps/v1kind:Deploymentname:myapp-deploymentminReplicas:1maxReplicas:20metrics:-type:Resourceresource:name:cputarget:type:UtilizationaverageUtilization:50
  • 安全和控制。YAML 是驗證在 Kubernetes 中部署什麼以及如何部署的好方法。例如,有關安全性的主要問題之一是您的工作負載是否以非 root 使用者身份執行。我們可以使用 conftest[11](一種 YAML /JSON 驗證器)之類的工具以及Open Policy Agent[12](一種策略驗證器)來檢查您的工作負載的 SecurityContext[13] 是否允許容器作為 root 執行。為此,使用者可以使用一個簡單的開放策略代理重新註冊策略,如下所示:
packagemaindeny[msg]{input.kind="Deployment"notinput.spec.template.spec.securityContext.runAsNonRoot=truemsg="Containersmustnotrunasroot"}
  • 雲提供商整合。科技行業的主要趨勢之一是在公有云提供商中執行工作負載。藉助雲提供商元件,Kubernetes 允許每個群集與其執行的雲提供商進行整合。例如,如果使用者正在 AWS 的 Kubernetes 中執行某個應用程式,並且希望通過服務訪問該應用程式,則雲提供商將幫助自動建立 LoadBalancer 服務,該服務將自動設定 Amazon Elastic Load Balancer 來將流量轉發給應用程式 pods。

可擴充套件性

Kubernetes 具有很好的可擴充套件性,開發人員對此非常滿意。內建一些資源,例如 Pod,Deployment,StatefulSet,Secrets,ConfigMap 等。同時使用者和開發人員可以通過“自定義資源定義[14]”新增更多資源。例如,如果我們想定義 CronTab 資源,則可以使用以下方法來做到這一點:

apiVersion:apiextensions.k8s.io/v1kind:CustomResourceDefinitionmetadata:name:crontabs.my.orgspec:group:my.orgversions:-name:v1served:truestorage:trueSchema:openAPIV3Schema:type:objectproperties:spec:type:objectproperties:cronSpec:type:stringpattern:'^(d+|*)(/d+)?(s+(d+|*)(/d+)?){4}$'replicas:type:integerminimum:1maximum:10scope:Namespacednames:plural:crontabssingular:crontabkind:CronTabshortNames:-ct

我們可以稍後使用以下內容建立 CronTab 資源:

apiVersion:"my.org/v1"kind:CronTabmetadata:name:my-cron-objectspec:cronSpec:"*****/5"image:my-cron-imagereplicas:5

Kubernetes 可擴充套件性的另一種形式是開發人員編寫自己的 Operators[15] 的能力,Operator 是在 Kubernetes 叢集中執行的,遵循 control loop pattern[16] 的特定程序。操作員允許使用者通過與 Kubernetes API 進行對話來自動管理 CRD(自定義資源定義)。

該社群有幾種工具,允許開發人員建立自己的 Operators。這些工具之一是 Operator Framework[17] 及其 Operator SDK[18]。SDK 為開發人員提供了一個框架,使他們可以快速開始建立 operator。例如,您可以從命令列[19]輸入以下命令開始:

$operator-sdknewmy-operator--repogithub.com/myuser/my-operator

它將為您的 operator 建立整個樣板,包括 YAML 檔案和 Go 程式碼:

.|____cmd||____manager|||____main.go|____go.mod|____deploy||____role.yaml||____role_binding.yaml||____service_account.yaml||____operator.yaml|____tools.go|____go.sum|____.gitignore|____version||____version.go|____build||____bin|||____user_setup|||____entrypoint||____Dockerfile|____pkg||____apis|||____apis.go||____controller|||____controller.go

然後,您可以新增 API 和類似的控制器:

$operator-sdkaddapi--api-version=myapp.com/v1alpha1--kind=MyAppService$operator-sdkaddcontroller--api-version=myapp.com/v1alpha1--kind=MyAppService

最後構建並將 operator 推送到您的容器登錄檔:

$operator-sdkbuildyour.container.registry/youruser/myapp-operator

如果開發人員需要更多控制權,則可以修改 Go 檔案中的樣板程式碼。例如,要修改控制器的詳細資訊,他們可以對 controller.go 檔案進行更改。

另一個專案 KUDO[20] 允許您僅使用宣告性 YAML 檔案來建立運算子。例如,Apache Kafka 的運算子將定義為以下內容[21],它允許使用者使用以下命令在 Kubernetes 上安裝 Kafka 叢集:

$kubectlkudoinstallzookeeper$kubectlkudoinstallkafka

然後還使用另一個命令對其進行調整:

$kubectlkudoinstallkafka--instance=my-kafka-name-pZOOKEEPER_URI=zk-zookeeper-0.zk-hs:2181-pZOOKEEPER_PATH=/my-path-pBROKER_CPUS=3000m-pBROKER_COUNT=5-pBROKER_MEM=4096m-pDISK_SIZE=40Gi-pMIN_INSYNC_REPLICAS=3-pNUM_NETWORK_THREADS=10-pNUM_IO_THREADS=20

革新

在過去的幾年中,Kubernetes 每三四個月釋出一次主要版本,這意味著每年都有三到四個主要版本。推出的新功能的數量並未減慢,最新版本[22]的 30 多種新增功能和更改證明了這一點。此外,Kubernetes 專案 GitHub 活動表明[23],即使在這些困難時期,貢獻也沒有放緩的跡象。

這些新功能使叢集運營商在執行各種不同的工作負載時具有更大的靈活性。軟體工程師還喜歡擁有更多控制元件,以將其應用程式直接部署到生產環境中。

社群

Kubernetes 受歡迎的另一個重要方面是其強大的社群。首先,Kubernetes 在 2015 年釋出 1.0 版本時捐贈給了一個與供應商無關的家庭:Cloud Native Computing Foundation[24]。

隨著專案的推進,針對 Kubernetes 中的不同區域還有各種各樣的社群 SIG[25](特殊興趣小組)。他們不斷新增新功能,並使其對使用者更加友好。

Cloud Native Foundation 還組織了 CloudNativeCon/KubeCon,截至撰寫本文時,CloudNativeCon/KubeCon 是世界上最大的開源活動。該活動通常每年舉行三屆,吸引了數千名希望改善 Kubernetes 及其生態系統以及利用每三個月釋出的新功能的技術人員和專業人士。

此外,Cloud Native Foundation 擁有一個技術監督委員會[26],與 SIGs[27] 一起,研究基金會在雲原生生態系統中的新專案和現有專案[28]。大多數專案都有助於增強 Kubernetes 的價值主張。

最後,我相信,如果沒有社群的有意識的努力來互相包容並歡迎任何新來者,Kubernetes 就不會取得成功。

未來

開發人員未來面臨的主要挑戰之一是如何將更多的精力放在程式碼的細節上,而不是程式碼執行所在的基礎結構上。為此,無伺服器[29]正在成為應對這一挑戰的領先架構範例之一。已經有非常高階的框架,例如 Knative[30] 和 OpenFaas[31],它們使用 Kubernetes 從開發人員那裡提取基礎架構。

我們在本文中對 Kubernetes 進行了簡要介紹,但這只是冰山一角。使用者可以利用更多資源,功能和配置。我們將持續看到可增強或發展 Kubernetes 的新開源專案和技術,正如我們所提到的,貢獻和社群無處不在。

原文連結:https://stackoverflow.blog/2020/05/29/why-kubernetes-getting-so-popular/

作者:Ricardo Aravena[32]

譯者:Go語言中文網 polaris

參考資料

[1]

已有 6 年曆史: https://en.wikipedia.org/wiki/Kubernetes

[2]

最受歡迎的平臺之一: https://insights.stackoverflow.com/survey/2019#most-loved-dreaded-and-wanted

[3]

第三大平臺: https://dev.insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-platforms

[4]

cgroups: https://en.wikipedia.org/wiki/Cgroups

[5]

namespaces: https://en.wikipedia.org/wiki/Linux_namespaces

[6]

LXC: https://en.wikipedia.org/wiki/LXC

[7]

Borg: https://kubernetes.io/blog/2015/04/borg-predecessor-to-kubernetes/

[8]

Mesos: http://mesos.apache.org/

[9]

Puppet: https://github.com/puppetlabs/puppet

[10]

Chef: https://github.com/chef/chef

[11]

conftest: https://www.conftest.dev/

[12]

Open Policy Agent: https://www.openpolicyagent.org/

[13]

SecurityContext: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/

[14]

自定義資源定義: https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/

[15]

Operators: https://kubernetes.io/docs/concepts/extend-kubernetes/operator/

[16]

control loop pattern: https://kubernetes.io/docs/concepts/#kubernetes-control-plane

[17]

Operator Framework: https://github.com/operator-framework

[18]

Operator SDK: https://github.com/operator-framework/operator-sdk

[19]

命令列: https://github.com/operator-framework/operator-sdk#create-and-deploy-an-app-operator

[20]

KUDO: https://kudo.dev/

[21]

以下內容: https://github.com/kudobuilder/operators/blob/master/repository/kafka/operator/operator.yaml

[22]

最新版本: https://kubernetes.io/docs/setup/release/notes/#changes-by-kind

[23]

GitHub 活動表明: https://k8s.devstats.cncf.io/d/12/dashboards?orgId=1&refresh=15m&from=now-1y&to=now-1h

[24]

Cloud Native Computing Foundation: https://www.cncf.io/

[25]

社群 SIG: https://github.com/kubernetes/community/blob/master/sig-list.md

[26]

技術監督委員會: https://github.com/cncf/toc

[27]

SIGs: https://github.com/cncf/toc/blob/master/sigs/README.md

[28]

現有專案: https://www.cncf.io/projects/

[29]

無伺服器: https://stackoverflow.blog/2020/05/18/you-want-efficient-application-scaling-go-serverless/

[30]

Knative: https://github.com/knative

[31]

OpenFaas: https://github.com/openfaas/faas

[32]

Ricardo Aravena: https://stackoverflow.blog/author/ricardo-aravena/

4e9b9354a8274063a737f93d51bbc004.png

火丁筆記,每天學習全棧知識