Kubernetes: kubectl apply是如何達到宣告式管理?

閱讀時間約 8 分鐘

前言

在 Kubernetes 中,kubectl apply 是一種用於部署資源物件的指令,它與宣告式管理密切相關,包括可以使用kubectl apply 在 Kubernetes 中創建、更新或刪除物件。

而宣告式管理是一種資源管理模式,透過宣告一份資源的定義檔(YAML/JSON),直接將定義檔提供給叢集,由叢集自行分析與判斷該如何部署資源。

所以宣告式管理的好處就是只需要告知我想要系統達到「甚麼狀態」就好,剩下的由系統自動幫你完成,也不必關心系統如何達到該狀態。

如何部署資源物件

首先先撰寫資源的yaml定義檔案

範例:nginx.yaml

apiVersion: v1
kind: Pod
metadata:
name: myweb
labels:
type : web-server
spec:
containers:
- name: nginx
image: nginx:latest

並在當前目錄(或附上完整檔案路徑)執行kubectl apply指令

kubectl apply -f nginx.yaml

當執行指令時發生了甚麼事?

kubectl apply 在決定要進行哪些更改之前會考慮本地配置文件the local configuration file、即時配置設定(a live object configuration)以及最後應用配置(the last applied configuration)

在後台,kubernetes 中會生成一個即時配置設定live object configuration,被kubernetes叢集即時觀察著,通常儲存在kubernetes的etcd內。

我們可以使用kubectl get指令將剛剛部屬的pod的live object configuration列印出來。

kubectl get pod -f nginx -o yaml > nginx_LiveObject.yaml

顯示nginx_LiveObject.yaml內容

apiVersion: v1
kind: Pod
metadata:
labels:
type: web-server
name: myweb
spec:
containers:
- image: nginx:latest
name: nginx
status:
conditions:
- lastProbeTime: null
status: "True"
type: Initialized

可以發現這個即時配置設定與我們在本地創建的文件幾乎一致,但它會包含該資源物件狀態的更多信息,存放在status中。


那當我們對本地配置文件yaml檔案進行更動修改刪除時,kubernetes叢集要怎麼知道我們是kubectl apply一個新的資源物件還是對現有資源進行更動呢?

本地配置文件的 YAML 版本會轉換為 JSON 格式,然後存儲為最後應用配置(the last applied configuration)

{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"labels": {
"type": "web-server"
},
"name": "myweb"
},
"spec": {
"containers": [
{
"image": "nginx:latest",
"name": "nginx"
}
]
}
}

那這個最後應用配置(the last applied configuration)其實會藏在即時配置設定(a live object configuration)的Metadata裡面,以annotations的方式儲存。

顯示nginx_LiveObject.yaml內容

apiVersion: v1
kind: Pod
metadata:
name: myweb
labels:
type: web-server
annotations:
# ...
# This is the json representation of simple_deployment.yaml
# It was written by kubectl apply when the object was created
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Pod",
"metadata":{"labels":{"type":"web-server"},"name":"myweb"},
"spec": {"containers": [{"image": "nginx:latest","name": "nginx"}]}}
spec:
containers:
- image: nginx:latest
name: nginx
status:
conditions:
- lastProbeTime: null
status: "True"
type: Initialized

假設我們本地配置文件the local configuration file中刪除了一個內容,比如label中的type被刪除了。當我們運行 kubectl apply 命令時,kubernetes叢集看到最後應用配置(the last applied configuration)有一個label,但它不存在於本地配置文件the local configuration file中。

這意味著需要從即時配置設定live object configuration中刪除label中的type。

總結

宣告式管理是一種管理方法,其中您描述系統或資源的期望狀態,而不必關心實際如何達到該狀態。kubectl apply 命令在 Kubernetes 中實現了這種宣告式管理方式,以下是執行指令時的運作流程:

  1. 建立或讀取描述檔案: 使用者創建一個描述檔案(YAML 或 JSON 格式),其中包含您想要在 Kubernetes 中創建或修改的資源的規格。
  2. 使用 kubectl apply: 您執行 kubectl apply -f <檔案名稱> 命令,指定剛創建的資源描述檔案。
  3. 對比當前狀態: Kubernetes 的control plane接收描述檔案並解析其中的資源規格。它將這些規格與實際在集群中運行的資源進行比較。
  4. 檢測差異: control plane檢測描述檔案(本地配置文件the local configuration file)中的資源規格與實際狀態(最後應用配置the last applied configuration即時配置設定live object configuration)之間的差異。
  5. 執行變更: 基於差異的比較,Kubernetes control plane會自動執行必要的操作,以使集群的實際狀態接近您描述的期望狀態,包括創建、更新或刪除資源。
  6. 更新註解: 在執行變更時,kubectl apply 會將描述檔案的內容記錄為實際資源的一個註解(annotations),稱為 kubectl.kubernetes.io/last-applied-configuration,幫助後續kubernetes叢集管理的比較和回滾。


如果你喜歡這篇文章歡迎幫我按愛心鼓勵一下喔!~閱讀愉快!

# Vocus的程式碼好像會把縮排全部吃掉==,yaml/json格式可能有跑版...

18會員
41內容數
歡迎來到「Marcos的方格子」!目前在「Marcos談科技」撰寫在職涯上學習到的知識,在「Marcos談書」分享我在日常的閱讀和心得,歡迎您的到來!!
留言0
查看全部
發表第一個留言支持創作者!
Marcos的方格子 的其他內容
Kubernetes 是一個開源的容器管理平台,它可以幫助您自動化容器應用程式的部署、擴展和管理。在 Kubernetes 中,有兩種主要的管理方式:命令式和宣告式。
什麼是dynatrace? dynatrace在Gartner的分類是屬於APM(應用程式效能監控)的類別。
隨著應用程式底層架構的演變,監控工具也在不斷發展。第二代監控工具(Gen 2)逐漸顯露出其限制和不足,而第三代監控工具(Gen 3)已經在許多方面取得了突破性的進展。
應用程式效能監控(APM)的演變 Gen1-APM隨著JAVA興起日漸重要 應用程式效能監控市場的發展歷程可追溯至1990s末期,當時Wily Technology(後來被CA收購)和Precise Software處於領先地位。 第一代的應用程式效能管理(APM)解決方案因應Java的快速興
Kubernetes 是一個開源的容器管理平台,它可以幫助您自動化容器應用程式的部署、擴展和管理。在 Kubernetes 中,有兩種主要的管理方式:命令式和宣告式。
什麼是dynatrace? dynatrace在Gartner的分類是屬於APM(應用程式效能監控)的類別。
隨著應用程式底層架構的演變,監控工具也在不斷發展。第二代監控工具(Gen 2)逐漸顯露出其限制和不足,而第三代監控工具(Gen 3)已經在許多方面取得了突破性的進展。
應用程式效能監控(APM)的演變 Gen1-APM隨著JAVA興起日漸重要 應用程式效能監控市場的發展歷程可追溯至1990s末期,當時Wily Technology(後來被CA收購)和Precise Software處於領先地位。 第一代的應用程式效能管理(APM)解決方案因應Java的快速興
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
安裝環境需求 64位元Linux,核心版本為3.1以上,且能滿足Ducker安裝環境。 機器之間要能夠互通。 外部存取權限。 硬體資源:兩核心CPU、8G記憶體、硬碟30GB以上。 安裝Kubeadm與Ducker Kubeadm是Kubernetes的一鍵部署工具。 增加Kube
Thumbnail
在實際生產中,容器化技術開始走向「容器編排技術」,如:Kubernetes。因為Docker無法獨立支撐大規模容器化部署。 Kubernetes起源於Borg系統,所以在大規模的叢集管理,優於其他容器編排技術。它提供拉取映像檔、拉取執行容器、路由閘道、水平擴充、監控和備份等,除外還可以自動化處理容
Thumbnail
本文記錄如何在Kubernetes環境下,部署Standalone架構的MySQL Database,並透過phpmyadmin進行管理。這篇文章將分成MySQL部署在K8S內的優勢、部署MySQL DB standalone、部署PhpMyAdmin (PMA)、結論四個部分進行說明與實作的流程。
Thumbnail
本篇說明如何利用Kubernetes特色,將PostgreSQL DB以HA的架構來提供服務,並說明相關的實作流程與說明。
Thumbnail
引言 在當今的技術世界中,Kubernetes 已成為容器化應用的領導平台。作為一個高效的容器編排系統,它不僅管理著容器的部署和擴展,還提供了必要的自動化支持,以保證應用的高可用性和性能。在這個框架中,自動擴展功能起著至關重要的作用,特別是在面對不斷變化的負載和需求時。
Thumbnail
在 Kubernetes 裡,Secret 就像是一個保險箱,可以放你任何不想公開的東西。比如說密碼、API 金鑰、憑證等,這樣的資料可能會被放在 Pod 裡,但你可以用 Secret 來避免直接在應用程式的程式碼中暴露這些機密資料。
Thumbnail
什麼是 Kubernetes Deployment? 一樣先來個官網解說 A Deployment provides declarative updates for Pods and ReplicaSets. You describe a desired state in a Deployment,
Thumbnail
什麼是Kubernetes Service? 先來個官網的解說 A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them. 白話文就是
Thumbnail
Kubernetes是現代應用程序開發和部署的重要技術,而Pod是Kubernetes中最小的部署單位。Pod是一個或多個container的集合,它們共享一個網路命名空間和一個網路接口。Pod不僅提供了一個簡單而強大的container環境,還可以用於實現多種container編排方案,例如負載平
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
安裝環境需求 64位元Linux,核心版本為3.1以上,且能滿足Ducker安裝環境。 機器之間要能夠互通。 外部存取權限。 硬體資源:兩核心CPU、8G記憶體、硬碟30GB以上。 安裝Kubeadm與Ducker Kubeadm是Kubernetes的一鍵部署工具。 增加Kube
Thumbnail
在實際生產中,容器化技術開始走向「容器編排技術」,如:Kubernetes。因為Docker無法獨立支撐大規模容器化部署。 Kubernetes起源於Borg系統,所以在大規模的叢集管理,優於其他容器編排技術。它提供拉取映像檔、拉取執行容器、路由閘道、水平擴充、監控和備份等,除外還可以自動化處理容
Thumbnail
本文記錄如何在Kubernetes環境下,部署Standalone架構的MySQL Database,並透過phpmyadmin進行管理。這篇文章將分成MySQL部署在K8S內的優勢、部署MySQL DB standalone、部署PhpMyAdmin (PMA)、結論四個部分進行說明與實作的流程。
Thumbnail
本篇說明如何利用Kubernetes特色,將PostgreSQL DB以HA的架構來提供服務,並說明相關的實作流程與說明。
Thumbnail
引言 在當今的技術世界中,Kubernetes 已成為容器化應用的領導平台。作為一個高效的容器編排系統,它不僅管理著容器的部署和擴展,還提供了必要的自動化支持,以保證應用的高可用性和性能。在這個框架中,自動擴展功能起著至關重要的作用,特別是在面對不斷變化的負載和需求時。
Thumbnail
在 Kubernetes 裡,Secret 就像是一個保險箱,可以放你任何不想公開的東西。比如說密碼、API 金鑰、憑證等,這樣的資料可能會被放在 Pod 裡,但你可以用 Secret 來避免直接在應用程式的程式碼中暴露這些機密資料。
Thumbnail
什麼是 Kubernetes Deployment? 一樣先來個官網解說 A Deployment provides declarative updates for Pods and ReplicaSets. You describe a desired state in a Deployment,
Thumbnail
什麼是Kubernetes Service? 先來個官網的解說 A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them. 白話文就是
Thumbnail
Kubernetes是現代應用程序開發和部署的重要技術,而Pod是Kubernetes中最小的部署單位。Pod是一個或多個container的集合,它們共享一個網路命名空間和一個網路接口。Pod不僅提供了一個簡單而強大的container環境,還可以用於實現多種container編排方案,例如負載平