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格式可能有跑版...

留言
avatar-img
留言分享你的想法!
avatar-img
Marcos的方格子
19會員
44內容數
歡迎來到「Marcos的方格子」!目前在「Marcos談科技」撰寫在職涯上學習到的知識,在「Marcos談書」分享我在日常的閱讀和心得,歡迎您的到來!!
Marcos的方格子的其他內容
2024/12/21
可觀測性(Observability)是現代架構中的核心能力,透過指標、日誌和分散式追蹤三大支柱,幫助開發者深入理解系統狀態並快速定位問題根源。本篇文章回顧 DevOps Taiwan Meetup 的精彩內容,解析可觀測性與監控的差異、建置流程的四大階段,以及實務應用中的工具選擇與導入時機!
Thumbnail
2024/12/21
可觀測性(Observability)是現代架構中的核心能力,透過指標、日誌和分散式追蹤三大支柱,幫助開發者深入理解系統狀態並快速定位問題根源。本篇文章回顧 DevOps Taiwan Meetup 的精彩內容,解析可觀測性與監控的差異、建置流程的四大階段,以及實務應用中的工具選擇與導入時機!
Thumbnail
2024/12/14
本篇文章針對 CKA 認證考試中常見的實作題目,提供詳細解題流程與指令範例。內容基於 examtopic 題目解析,幫助考生掌握實作技能與應試技巧,快速提升 Kubernetes 操作能力,為通過 CKA 考試做好萬全準備!
Thumbnail
2024/12/14
本篇文章針對 CKA 認證考試中常見的實作題目,提供詳細解題流程與指令範例。內容基於 examtopic 題目解析,幫助考生掌握實作技能與應試技巧,快速提升 Kubernetes 操作能力,為通過 CKA 考試做好萬全準備!
Thumbnail
2024/09/17
如何一年內考取 Google Cloud 所有雲端證照
Thumbnail
2024/09/17
如何一年內考取 Google Cloud 所有雲端證照
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
👨‍💻簡介 terraform在每次執行terraform plan或terraform apply時,是如何知道應該要管理哪些資源? 其實就是透過在每次執行terraform時,將建立或要變更的資源都記錄在terraform.state這份狀態檔,預設檔案使用JSON格式。
Thumbnail
👨‍💻簡介 terraform在每次執行terraform plan或terraform apply時,是如何知道應該要管理哪些資源? 其實就是透過在每次執行terraform時,將建立或要變更的資源都記錄在terraform.state這份狀態檔,預設檔案使用JSON格式。
Thumbnail
今天簡單演示如何在Kubernetes cluster利用local-path provider建構出storage class來提供應用程式進行資料的存放。
Thumbnail
今天簡單演示如何在Kubernetes cluster利用local-path provider建構出storage class來提供應用程式進行資料的存放。
Thumbnail
今天分別針對3個基本中的基本資源物件類型來說明
Thumbnail
今天分別針對3個基本中的基本資源物件類型來說明
Thumbnail
宣告式管理是一種管理方法,其中您描述系統或資源的期望狀態,而不必關心實際如何達到該狀態。kubectl apply 命令在 Kubernetes 中實現了這種宣告式管理方式,以下是執行指令時的運作流程...
Thumbnail
宣告式管理是一種管理方法,其中您描述系統或資源的期望狀態,而不必關心實際如何達到該狀態。kubectl apply 命令在 Kubernetes 中實現了這種宣告式管理方式,以下是執行指令時的運作流程...
Thumbnail
Kubernetes 是一個開源的容器管理平台,它可以幫助您自動化容器應用程式的部署、擴展和管理。在 Kubernetes 中,有兩種主要的管理方式:命令式和宣告式。
Thumbnail
Kubernetes 是一個開源的容器管理平台,它可以幫助您自動化容器應用程式的部署、擴展和管理。在 Kubernetes 中,有兩種主要的管理方式:命令式和宣告式。
Thumbnail
什麼是 Kubernetes Deployment? 一樣先來個官網解說 A Deployment provides declarative updates for Pods and ReplicaSets. You describe a desired state in a Deployment,
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 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
Kubernetes是現代應用程序開發和部署的重要技術,而Pod是Kubernetes中最小的部署單位。Pod是一個或多個container的集合,它們共享一個網路命名空間和一個網路接口。Pod不僅提供了一個簡單而強大的container環境,還可以用於實現多種container編排方案,例如負載平
Thumbnail
Kubernetes是什麼? 1. Kubernetes是Google嚴格保密十幾年的秘密武器——Borg的一個開放原始碼版本。 2. Kubernetes是一個開放的開發平台。 3. Kubernetes是一個完備的分散式系統支撐平台。
Thumbnail
Kubernetes是什麼? 1. Kubernetes是Google嚴格保密十幾年的秘密武器——Borg的一個開放原始碼版本。 2. Kubernetes是一個開放的開發平台。 3. Kubernetes是一個完備的分散式系統支撐平台。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News