嘿哈布爾!
在夏末,我們想提醒您,我們將繼續致力於這個主題
享受閱讀!
在撰寫本文時,Kubernetes 的歷史大約是 XNUMX 年。
容器最初是用於隔離 Linux 進程的特殊設計; 自 2007 年以來,容器已包括在內
為了嘗試了解 Kubernetes 為何如此受歡迎,讓我們試著回答幾個問題。 開發人員最後一次就如何將應用程式部署到生產環境達成一致是什麼時候? 您知道有多少開發人員使用開箱即用的工具? 如今有多少雲端管理員不了解應用程式的工作原理? 我們將在本文中看看這些問題的答案。
YAML 形式的基礎設施
在從 Puppet 和 Chef 到 Kubernetes 的世界中,最大的變化之一是從「基礎設施即程式碼」到「基礎設施即資料」的轉變——特別是 YAML。 Kubernetes 中的所有資源,包括 Pod、設定、部署的實例、磁碟區等,都可以在 YAML 檔案中輕鬆描述。 例如:
apiVersion: v1
kind: Pod
metadata:
name: site
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
這種視圖使 DevOps 或 SRE 專業人員可以更輕鬆地充分錶達他們的工作負載,而無需使用 Python 或 Javascript 等語言編寫程式碼。
將基礎設施組織為資料的其他優點包括:
- GitOps 或 Git 操作版本控制。 這種方法可讓您將所有 Kubernetes YAML 檔案保存在 git 儲存庫中,以便您可以準確追蹤更改的時間、更改者以及更改的具體內容。 這提高了整個組織運作的透明度,並透過消除歧義來提高營運效率,特別是在員工應尋找所需資源的地方。 同時,透過簡單地合併拉取請求,自動更改 Kubernetes 資源變得更加容易。
- 可擴展性。 當資源被定義為 YAML 時,叢集操作員可以非常輕鬆地更改 Kubernetes 資源中的一兩個數字,從而改變其擴充方式。 Kubernetes 提供了一種 pod 水平自動縮放機制,可用於方便地確定特定部署配置中處理低流量和高流量所需的最小和最大 pod 數量。 例如,如果您部署的配置因流量突然激增而需要額外容量,則 maxReplicas 可以從 10 變更為 20:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: myapp
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp-deployment
minReplicas: 1
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- 安全和管理。 YAML 非常適合評估 Kubernetes 中的部署方式。 例如,一個主要的安全問題涉及您的工作負載是否以非管理員使用者身分執行。 在這種情況下,我們可能需要諸如
會議測試 ,YAML/JSON 驗證器,加上開放策略代理 ,一個策略驗證器,以確保上下文安全情境 您的工作負載不允許容器以管理員權限執行。 如果需要,使用者可以應用一個簡單的策略雷戈 , 像這樣:
package main
deny[msg] {
input.kind = "Deployment"
not input.spec.template.spec.securityContext.runAsNonRoot = true
msg = "Containers must not run as root"
}
- 與雲端提供者整合的選項。 當今高科技最顯著的趨勢之一是在公有雲供應商上運行工作負載。 使用組件
雲端提供者 Kubernetes 允許任何叢集與其運行的雲端提供者整合。 例如,如果用戶在 AWS 上的 Kubernetes 中運行應用程式並希望透過服務公開該應用程序,雲端供應商會協助自動建立該服務LoadBalancer
這將自動提供負載平衡器亞馬遜彈性負載平衡器 將流量重定向到應用程式 Pod。
可擴展性
Kubernetes 的可擴展性非常好,開發人員喜歡它。 有一組可用資源,例如 Pod、部署、 StatefulSets
, 秘密, ConfigMaps
, ETC。 確實,使用者和開發人員可以在表單中添加其他資源
例如,如果我們要定義一個資源 CronTab
,那麼你可以這樣做:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: crontabs.my.org
spec:
group: my.org
versions:
- name: v1
served: true
storage: true
Schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
cronSpec:
type: string
pattern: '^(d+|*)(/d+)?(s+(d+|*)(/d+)?){4}$'
replicas:
type: integer
minimum: 1
maximum: 10
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
稍後我們可以建立一個 CronTab 資源,如下所示:
apiVersion: "my.org/v1"
kind: CronTab
metadata:
name: my-cron-object
spec:
cronSpec: "* * * * */5"
image: my-cron-image
replicas: 5
Kubernetes 中可擴充性的另一個選擇是開發人員可以編寫自己的語句。
社群中有許多工具可以讓開發人員輕鬆創建自己的運算符。 他們之中 -
$ operator-sdk new my-operator --repo github.com/myuser/my-operator
這將為您的操作員建立所有樣板程式碼,包括 YAML 檔案和 Golang 程式碼:
.
|____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-sdk add api --api-version=myapp.com/v1alpha1 --kind=MyAppService
$ operator-sdk add controller --api-version=myapp.com/v1alpha1 --kind=MyAppService
最後,組裝操作符並將其發送到容器的註冊表:
$ operator-sdk build your.container.registry/youruser/myapp-operator
如果開發人員想要更多控制,可以更改 Go 檔案中的樣板程式碼。 例如,要修改控制器的細節,您可以變更文件 controller.go
.
另一個項目
$ kubectl kudo install zookeeper
$ kubectl kudo install kafka
然後用另一個命令配置它:
$ kubectl kudo install kafka --instance=my-kafka-name
-p ZOOKEEPER_URI=zk-zookeeper-0.zk-hs:2181
-p ZOOKEEPER_PATH=/my-path -p BROKER_CPUS=3000m
-p BROKER_COUNT=5 -p BROKER_MEM=4096m
-p DISK_SIZE=40Gi -p MIN_INSYNC_REPLICAS=3
-p NUM_NETWORK_THREADS=10 -p NUM_IO_THREADS=20
創新
在過去的幾年裡,Kubernetes 的主要版本每隔幾個月就會發布一次,即每年發布三到四個主要版本。 它們各自引入的新功能數量並沒有減少。 而且,即使在這些困難時期,也沒有放緩的跡象——看看現在的情況
新功能可讓您更靈活地跨不同工作負載進行叢集操作。 此外,程式設計師在將應用程式直接部署到生產環境時享有更大的控制權。
社區
Kubernetes 受歡迎的另一個主要方面是其社區的實力。 2015 年,Kubernetes 達到 1.0 版本後,得到了以下代理商的贊助:
還有各種社區
雲端原生基金會也主辦 CloudNativeCon/KubeCon,在撰寫本文時,這是世界上最大的開源會議。 它通常每年舉辦三次,匯集了數千名想要改進 Kubernetes 及其生態系統的專業人士,並學習每三個月出現的新功能。
此外,雲端原生基金會還
最後,我相信,如果沒有整個社群的自覺努力,Kubernetes 不會如此成功,人們團結在一起,但同時也歡迎新人加入。
未來
開發人員未來必須應對的主要挑戰之一是能否專注於程式碼本身的細節,而不是其運作的基礎設施。 它符合這些趨勢
在本文中,我們只觸及了 Kubernetes 目前狀態的表面——事實上,這只是冰山一角。 Kubernetes 使用者可以使用許多其他資源、功能和配置。
來源: www.habr.com