[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-kubernetes-turns-clusters-into-declared-state-zh":3,"article-related-kubernetes-turns-clusters-into-declared-state-zh":35,"series-tools-749d323d-fc9b-4492-946d-48f95ee0037d":87},{"id":4,"title":5,"content":6,"summary":7,"source":8,"source_url":9,"author":10,"image_url":11,"keywords":12,"language":18,"translated_content":10,"views":19,"is_premium":20,"created_at":21,"updated_at":21,"cover_image":11,"published_at":22,"rewrite_status":23,"rewrite_error":10,"rewritten_from_id":24,"slug":25,"category":26,"related_article_id":27,"status":28,"google_indexed_at":10,"x_posted_at":10,"tweet_text":10,"title_rewritten_at":10,"title_original":10,"key_takeaways":29,"topic_cluster_id":33,"embedding":34,"is_canonical_seed":20},"749d323d-fc9b-4492-946d-48f95ee0037d","Kubernetes 把叢集變成宣告狀態","\u003Cp data-speakable=\"summary\">我拆 Kubernetes 的控制迴圈、核心物件和可直接複製的叢集模板，讓你少走一堆 YAML 冤枉路。\u003C\u002Fp>\u003Cp>我用 Kubernetes 有一陣子了，越用越火大。第一次把真的服務接上去，我以為是 manifest 寫錯；後來怪 ingress，再怪 network policy，最後才發現都不是。它根本不是在幫我「理解」應用，它只是在很認真地照我下的指令做事。我要三份，它就給我三份；我把 node 弄掛，它就重排；我忘了 resource limit，它也不會良心發現幫我擋一下。這就是 Kubernetes 最煩的地方：它不是部署按鈕，它是一個會一直修正現實的控制系統。你不懂它的 loop，就只會一直跟自己裝的機器打架。\u003C\u002Fp>\u003Cp>後來我去看 \u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKubernetes\">Kubernetes 的 Wikipedia 頁面\u003C\u002Fa>，不是當百科看，是當設計筆記看，才突然通了。這頁很密，但錨點夠準：\u003Ca href=\"\u002Ftag\u002Fgoogle\">Google\u003C\u002Fa> 在 2014 年 6 月 6 日公開它，創辦人是 \u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJoe_Beda\">Joe Beda\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBrendan_Burns\">Brendan Burns\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCraig_McLuckie\">Craig McLuckie\u003C\u002Fa>，現在由 \u003Ca href=\"https:\u002F\u002Fwww.cncf.io\u002F\">CNCF\u003C\u002Fa> 維護。這段歷史不是八卦，因為它直接解釋了 Kubernetes 的脾氣：宣告式、reconciliation、一直把叢集拉回你指定的狀態。\u003C\u002Fp>\u003Ch2>Kubernetes 不是部署工具，它是修正迴圈\u003C\u002Fh2>\u003Cblockquote>Kubernetes defines a set of building blocks (“primitives”) that collectively provide mechanisms that deploy, maintain, and scale applications based on CPU, memory or custom metrics.\u003C\u002Fblockquote>\u003Cp>翻譯一下就是：Kubernetes 不太在乎你想不想被理解，它只在乎「目前的狀態」跟「你宣告的狀態」有沒有對上。你殺掉一個 pod，它會補回來；你改掉副本數，它會調整；你把機器弄壞，它會想辦法把工作搬走。這不是包裝容器而已，這是一直在修正偏差。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779197095928-obv6.png\" alt=\"Kubernetes 把叢集變成宣告狀態\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>我以前把 orchestration 想成 \u003Ca href=\"\u002Ftag\u002Fdocker\">Docker\u003C\u002Fa> 的豪華外掛，這個理解很害人。因為你一旦把它當外掛，就會期待它去猜你的意圖。它不會。它只讀物件、比對狀態、執行動作。這就是為什麼它看起來很死板，但其實是很一致。它不是在討好你，它是在維持模型。\u003C\u002Fp>\u003Cp>我自己剛上手時最常犯的錯，就是把 manifest 當 startup script 寫。結果每次出事都在怪 YAML 太難寫。後來我才懂，Kubernetes 要的是宣告，不是命令。你要先回答三件事：要存在什麼、要幾份、狀態偏掉時要\u003Ca href=\"\u002Fnews\u002Fhow-to-read-a-solana-price-forecast-zh\">怎麼\u003C\u002Fa>拉回來。這三題答得出來，你才算真的在用 Kubernetes。\u003C\u002Fp>\u003Cp>實操上，我現在都先用這個順序想：先定義 desired state，再決定 controller，最後才補 runtime 細節。不要反過來。你如果先想容器怎麼起，再回頭補叢集要什麼，最後通常會長成一坨只能靠人肉維運的 YAML。\u003C\u002Fp>\u003Ch2>控制平面不是一台機器，是一組會互相盯著的角色\u003C\u002Fh2>\u003Cp>Kubernetes 最容易被講爛的一句話就是「控制平面」。很多人把它講得像一個黑盒子，彷彿整個叢集就是一顆腦袋。不是。它是幾個職責很清楚的元件湊在一起：\u003Ca href=\"https:\u002F\u002Fetcd.io\u002F\">etcd\u003C\u002Fa>、\u003Ca href=\"\u002Ftag\u002Fapi\">API\u003C\u002Fa> server、scheduler、controllers。你只要把這四個角色分開看，很多故障會突然變得很白話。\u003C\u002Fp>\u003Cp>\u003Cstrong>etcd\u003C\u002Fstrong> 是真相來源。它存 cluster state。Wikipedia 有提到它在分割時偏向 consistency 而不是 availability，這個取捨我反而很喜歡。因為如果狀態庫開始亂講話，後面全部都會變成戲劇。很多團隊平常把 etcd 當背景音，等 cluster 開始怪怪的才突然想起來它的重要性。\u003C\u002Fp>\u003Cp>\u003Cstrong>API server\u003C\u002Fstrong> 是前門。所有請求都走 API，透過 JSON over HTTP 驗證、寫入，最後進 etcd。你用 \u003Ca href=\"https:\u002F\u002Fkubernetes.io\u002Fdocs\u002Ftasks\u002Ftools\u002F\">kubectl\u003C\u002Fa>、client library，甚至很多 operator，都是在跟它說話。這也是 Kubernetes 之所以像一個可編程系統的原因：沒有旁門左道，全部都經過同一個 API。\u003C\u002Fp>\u003Cp>\u003Cstrong>Scheduler\u003C\u002Fstrong> 是配對的人。它決定未排程的 pod 要放哪裡，依據的是資源、限制、約束，而不是什麼神秘的「最佳機器」。這很重要，因為很多 Pending 的 pod 其實不是壞掉，只是你給的條件太刁，根本沒有 node 同時滿足。\u003C\u002Fp>\u003Cp>\u003Cstrong>Controllers\u003C\u002Fstrong> 是修正引擎。ReplicaSet 會把你要的副本數維持住，少了就補，多了就收。這不是額外加裝的功能，這就是整套系統的心臟。\u003C\u002Fp>\u003Cp>實操寫法很簡單：debug 時先分類，不要亂猜。是狀態沒存到、請求沒進來、排程失敗，還是 reconcile 沒發生？我現在都用一個很土但很有效的檢查法：物件存在但 pod 不存在，先看 scheduling；pod 存在但活不久，先看 controller 跟 app；連物件都不穩，先看 API 或定義本身。\u003C\u002Fp>\u003Cul>\u003Cli>etcd 存狀態。\u003C\u002Fli>\u003Cli>API server 收請求、驗證、寫入。\u003C\u002Fli>\u003Cli>Scheduler 負責放置。\u003C\u002Fli>\u003Cli>Controllers 負責修正漂移。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Pod 才是你真正交付的單位，不是 container\u003C\u002Fh2>\u003Cp>Kubernetes 很愛講 pod，因為它逼你別再用單一 container 的腦袋看世界。Pod 才是排程的基本單位。也就是說，scheduler 排的是 pod，controllers 管的是 pod，Service 通常也是對著 pod 這群人。你如果還在想「一個 container 就是一個 app」，很容易卡在網路、生命週期、sidecar 這些地方。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779197096022-olgh.png\" alt=\"Kubernetes 把叢集變成宣告狀態\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>我自己踩過的坑是，把 sidecar 跟 app container 當成 Docker Compose 那種獨立服務在想。表面上好像可以，直到我想讓它們一起死、一起起來，才發現 Kubernetes 根本不是那個模型。它把關係講得很明白：同一個 pod，共享生命週期。這很煩，但也很乾淨。\u003C\u002Fp>\u003Cp>Wikipedia 也提到 namespaces、labels、selectors。這些不是裝飾品。Namespace 是範圍；labels 跟 selectors 是讓 controller 和 service 找到正確 pod 的方式，不是靠硬編碼名稱。這件事小看不得，因為一旦 workload 變多，你就會感謝自己沒有把名字寫死。\u003C\u002Fp>\u003Cp>白話一點說，Kubernetes 偏好的是「描述式身分」，不是「名字式身分」。pod 可以消失再生出來，但 label selector 才是系統持續黏著同一個工作負載的方式。這也是為什麼 Deployment 換掉 pod，Service 幾乎不會在意。它原本就不該在意單一 pod，它在意的是那一群。\u003C\u002Fp>\u003Cp>實操上，我現在的 label 會分三類：app identity、environment、ownership。像是 \u003Ccode>app=payments\u003C\u002Fcode>、\u003Ccode>env=prod\u003C\u002Fcode>、\u003Ccode>team=platform\u003C\u002Fcode>。然後 selector 只吃這些 label，不吃名字。這樣 rollout、查問題、切流量都會少很多蠢事。\u003C\u002Fp>\u003Cul>\u003Cli>用 pod 表示共享生命週期。\u003C\u002Fli>\u003Cli>用 labels 做分群。\u003C\u002Fli>\u003Cli>用 selectors 做穩定指向。\u003C\u002Fli>\u003Cli>用 namespaces 做範圍與清理邊界。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Deployment 之所以好用，是因為它很無聊而且很堅持\u003C\u002Fh2>\u003Cp>Wikipedia 把 ReplicaSet、ReplicationController、Deployment 都列出來，這一段我建議你直接抓核心：Deployment 是描述 rollout 的方式，ReplicaSet 是維持副本數的機械手臂。重點不是「生出一個 pod」，而是「在變動中維持這個工作負載」。\u003C\u002Fp>\u003Cp>我看過不少團隊手改 production 裡的 pod，然後一臉驚訝地問為什麼改動不見了。拜託，pod 本來就不是拿來長住的。你要的是持久變更，就該改 controller 或 Deployment spec。Kubernetes 只認這個版本，其他臨時補丁它根本不當一回事。\u003C\u002Fp>\u003Cp>這背後其實是一個很不討喜但很實用的觀念：每個 instance 都應該是可拋棄的。這對從傳統 VM、SSH、手動修機器走來的人很不友善，因為以前你修的是「那台機器」，現在你修的是「一份宣告」。但 Kubernetes 就是吃這套，它要的是 repeatability，不是英雄主義。\u003C\u002Fp>\u003Cp>實操寫法我會很早就定好 rollout 策略：更新怎麼做、失敗怎麼回、要不要 scale down。不要等服務長大才補，因為到那時候你只會得到一堆 YAML 跟一堆「先手動 patch 一下」的爛習慣。我也幹過，最後只會更貴。\u003C\u002Fp>\u003Cp>我現在的規則很簡單：如果這東西要撐 restart、要撐 scale change、要撐 node 掛掉，就丟進 controller。反過來，如果只是一次性任務，就別硬裝成長期服務。Kubernetes 有不同物件不是裝飾，是因為它真的分工不同。\u003C\u002Fp>\u003Ch2>Service、Volume、Config 才是 app 真的開始像 app 的地方\u003C\u002Fh2>\u003Cp>Wikipedia 會把 Services、Volumes、ConfigMaps、Secrets 一起講，因為這裡才開始碰到真實世界。光有 pod 不夠。真的\u003Ca href=\"\u002Fnews\u002Fvibe-coding-turns-app-ideas-into-crowded-markets-zh\">上線\u003C\u002Fa>的 app 還需要穩定入口、持久儲存、以及不用每次改設定就重建 image 的能力。\u003C\u002Fp>\u003Cp>\u003Cstrong>Service\u003C\u002Fstrong> 提供穩定的網路身份，解掉「pod 重啟 IP 就變」這種老問題。你應該把 client 指向 service，而不是 pod。這個概念很抽象，直到你某天因為硬編碼 pod IP 而掉一下午，才會真的記住。\u003C\u002Fp>\u003Cp>\u003Cstrong>Volume\u003C\u002Fstrong> 處理應該活得比 pod 久的資料。像 database、需要持久化的 cache，或任何不能在重啟時消失的狀態，都得靠它。你如果忽略這件事，最後通常會得到資料遺失跟很尷尬的 retrospective。\u003C\u002Fp>\u003Cp>\u003Cstrong>ConfigMap\u003C\u002Fstrong> 跟 \u003Cstrong>Secret\u003C\u002Fstrong> 則是把設定跟 image 分開。這件事看起來普通，但它直接救你脫離「每個環境都重 build 一次」的地獄。非敏感設定放 ConfigMap，敏感值放 Secret，然後再掛進去。\u003C\u002Fp>\u003Cp>實操寫法是：不要把環境值烤死在 image 裡。我看過太多人這樣做，因為初期很快，後面卻會把環境差異、憑證、端點全揉成一團。比較健康的做法是 image 保持笨，runtime 保持聰明。image 放\u003Ca href=\"\u002Fnews\u002Fibm-vibe-coding-guide-turns-prompts-into-code-zh\">程式\u003C\u002Fa>，cluster 放環境。\u003C\u002Fp>\u003Cp>如果你要查官方說法，我會直接看 \u003Ca href=\"https:\u002F\u002Fkubernetes.io\u002Fdocs\u002Fhome\u002F\">Kubernetes 官方文件\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fkubernetes.io\u002Fdocs\u002Fconcepts\u002Fservices-networking\u002Fservice\u002F\">Service 概念頁\u003C\u002Fa>、以及 \u003Ca href=\"https:\u002F\u002Fkubernetes.io\u002Fdocs\u002Fconcepts\u002Fconfiguration\u002Fsecret\u002F\">Secrets 頁面\u003C\u002Fa>。不是叫你背，是別亂猜。\u003C\u002Fp>\u003Ch2>API 才是產品核心，其他東西都只是它的附屬品\u003C\u002Fh2>\u003Cp>Wikipedia 提到 Kubernetes 可擴充，而且內部元件與外部擴充都依賴 Kubernetes API。這句其實很直白：API 才是中心。你一旦接受這件事，整個生態系就合理了。像 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fkubernetes\u002Fkubectl\">kubectl\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fkubernetes.io\u002Fdocs\u002Freference\u002Fkubernetes-api\u002F\">API objects\u003C\u002Fa>、custom resources、controllers、operators，全部都是圍著這個 API contract 在轉。\u003C\u002Fp>\u003Cp>我以前以為 operator 是平台團隊才會玩的高階技巧。後來才發現，它本質上就是包了一層 domain 的 controller。只要你能把自己的領域定義成 desired state，就能教 Kubernetes 幫你 reconcile。這很方便，但也很殘酷，因為你寫錯了，它也會很誠實地幫你做錯。\u003C\u002Fp>\u003Cp>換句話說，這套平台真正厲害的地方不是 container，而是你可以在同一個 control plane 上，建立自己的 automation language。這也是為什麼很多 Kubernetes 周邊工具看起來都很像，因為它們都在講同一種 API 句法。\u003C\u002Fp>\u003Cp>實操上，如果你在做內部平台工具，我會優先考慮 custom resource 加 controller，而不是寫一堆 shell script 去 loop kubectl。Script 可以做一次性管理，拿來當控制策略就太脆了。如果行為需要持續，就做 controller；如果行為需要宣告，就做 resource。\u003C\u002Fp>\u003Cp>我也會順手看 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fkubernetes-sigs\u002Fcluster-api\">Cluster API\u003C\u002Fa>。如果你管的是 cluster 本身，那它就是把同一套宣告式思維往上一層延伸。這種東西一開始看起來很繞，但一旦通了，你會發現它跟 workload 的邏輯其實是一樣的。\u003C\u002Fp>\u003Ch2>你選哪種 Kubernetes，會直接改變你怎麼活\u003C\u002Fh2>\u003Cp>Wikipedia 有提到 open-source distribution、commercial distribution、managed distribution。這不是註腳，這是現實。\u003Ca href=\"https:\u002F\u002Fcloud.google.com\u002Fkubernetes-engine\">GKE\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Faws.amazon.com\u002Feks\u002F\">EKS\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fazure.microsoft.com\u002Fen-us\u002Fproducts\u002Fkubernetes-service\">AKS\u003C\u002Fa> 都是同一套核心概念外面包不同的操作責任。這差很多。\u003C\u002Fp>\u003Cp>我看過團隊以為「Kubernetes」就是一個固定東西，結果從自架 cluster 換到 managed service 之後，才發現升級、網路、權限、節點管理的假設全都要重來。這很正常。核心物件沒變，但你要付出的營運成本會換地方。\u003C\u002Fp>\u003Cp>實操寫法是：先決定你到底想不想養 cluster。如果團隊不想天天顧 control plane 升級，就用 managed。你如果真的需要高度客製，而且有人力承擔，那再自己管多一點。不要假裝這兩者差不多，完全不是。\u003C\u002Fp>\u003Cp>我還會在叢集出事前就定好支援政策。Wikipedia 提到 Kubernetes 1.19 之後支援窗口從 N-2 變 N-3，這種政策看起來很無聊，但它其實就是升級節奏。你不先排，最後就是它來排你。\u003C\u002Fp>\u003Ch2>可抄的模板\u003C\u002Fh2>\u003Cpre>\u003Ccode># Kubernetes operating template\n\n## 1) 我在宣告什麼\n- App name:\n- Namespace:\n- Environment:\n- Owner\u002Fteam:\n\n## 2) Desired state\n- Replicas:\n- Container image:\n- Resource requests:\n- Resource limits:\n- Health checks:\n- Rollout strategy:\n\n## 3) Stable identity\n- Labels:\n  - app:\n  - env:\n  - team:\n- Service name:\n- Selector:\n\n## 4) Configuration\n- ConfigMaps:\n  - non-sensitive env values\n  - feature flags\n  - endpoints\n- Secrets:\n  - passwords\n  - tokens\n  - certificates\n\n## 5) Storage\n- Volume needed? yes\u002Fno\n- PersistentVolumeClaim name:\n- Mount path:\n- Retention policy:\n\n## 6) Scheduling rules\n- Node affinity:\n- Tolerations:\n- Anti-affinity:\n- Priority class:\n\n## 7) Failure behavior\n- What should restart automatically?\n- What should scale horizontally?\n- What should be recreated if a node dies?\n- What should never be auto-replaced?\n\n## 8) Controller choice\n- Deployment for long-running stateless app\n- StatefulSet for stable identity and storage\n- DaemonSet for one pod per node\n- Job for run-to-completion work\n\n## 9) Day-2 checks\n- kubectl get pods -n \u003Cnamespace>\n- kubectl describe pod \u003Cpod>\n- kubectl get events -n \u003Cnamespace>\n- kubectl get svc -n \u003Cnamespace>\n- kubectl get deploy -n \u003Cnamespace>\n\n## 10) Copy-ready starter manifest\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: example-app\n  namespace: example\n  labels:\n    app: example-app\n    env: prod\n    team: platform\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: example-app\n  template:\n    metadata:\n      labels:\n        app: example-app\n        env: prod\n        team: platform\n    spec:\n      containers:\n        - name: app\n          image: ghcr.io\u002Fyour-org\u002Fexample-app:1.0.0\n          ports:\n            - containerPort: 8080\n          envFrom:\n            - configMapRef:\n                name: example-app-config\n            - secretRef:\n                name: example-app-secrets\n          resources:\n            requests:\n              cpu: \"100m\"\n              memory: \"128Mi\"\n            limits:\n              cpu: \"500m\"\n              memory: \"256Mi\"\n          readinessProbe:\n            httpGet:\n              path: \u002Fhealthz\n              port: 8080\n            initialDelaySeconds: 5\n            periodSeconds: 10\n          livenessProbe:\n            httpGet:\n              path: \u002Flivez\n              port: 8080\n            initialDelaySeconds: 15\n            periodSeconds: 20\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: example-app\n  namespace: example\nspec:\n  selector:\n    app: example-app\n  ports:\n    - port: 80\n      targetPort: 8080\n  type: ClusterIP\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>這份模板我刻意寫得很無聊，因為叢集狀態本來就該無聊。它給你的東西很基本：宣告 identity、穩定 selector、明確 config、真的 resource limits、健康檢查，還有一個不靠 pod 名稱的 Service。這些夠你在真實團隊裡起步了。\u003C\u002Fp>\u003Cp>如果我今天要把它丟進新 repo，我會先改三件事：換 image、換 namespace、把 resource requests 收到符合 app 的真實需求。然後只有在真的需要持久化時才補 storage。我寧願先上一個乾淨的 Deployment，也不要假裝自己有 state，結果硬做一個假的 StatefulSet。\u003C\u002Fp>\u003Cp>原始觀點主要來自 \u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKubernetes\">Kubernetes Wikipedia 頁面\u003C\u002Fa>，我加上的是自己的實務理解，外加幾個常用官方文件與生態系連結。模板是我根據這些概念重新整理的原創版本，能直接拿去改。\u003C\u002Fp>","我拆 Kubernetes 的控制迴圈、核心物件和可直接複製的叢集模板，讓你少走一堆 YAML 冤枉路。","en.wikipedia.org","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKubernetes",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779197095928-obv6.png",[13,14,15,16,17],"Kubernetes","control loop","desired state","controller","Deployment","zh",0,false,"2026-05-19T13:24:24.468851+00:00","2026-05-19T13:24:24.411+00:00","done","3f00d12b-c823-4ea5-88b4-cff12d620e17","kubernetes-turns-clusters-into-declared-state-zh","tools","ea288b1e-ddae-44ff-be40-c1056ab5a9d9","published",[30,31,32],"Kubernetes 的核心不是部署，而是持續把現實拉回宣告狀態。","控制平面、Pod、Service、Config、Storage 各司其職，別把它們混成一坨。","最實用的起手式是先定義 desired state，再選 controller，最後才補模板。","c3c88dd2-a940-438a-b359-0e5a24562273","[-0.024566969,-0.002349065,0.02112934,-0.09198424,0.0015236334,0.0031085399,-0.0014333306,-0.014074923,0.01254544,0.037831604,-0.0002847414,-0.038506903,-0.015453411,0.014039889,0.14013667,0.00027036553,-0.012825997,0.02358304,0.0043319347,0.015604403,0.013867244,-0.001469979,-0.013140757,0.013861291,0.012132571,0.0017198982,0.009588129,0.017720236,0.031235421,-0.008303541,0.0102438945,0.037950765,-0.01786386,0.025881669,0.0111189075,0.0076997518,0.008279403,-0.03527578,-0.0023553025,0.0067791124,-0.012899797,0.002950072,0.023073398,-0.0040404573,-0.0011309418,-0.014481037,-0.029901905,0.0078092325,0.012528586,-0.0012667463,-0.013501254,0.005923672,0.009069511,-0.1602044,-0.00557614,-0.002221824,-0.0034356946,-0.02505033,-0.012135144,0.011340866,-0.037939154,-0.0003267377,-0.022385292,-0.0026767328,-0.0030437575,-0.019130772,0.040242124,-0.023858812,-0.005364682,-0.0055608163,0.0053834585,-0.009530857,0.0230981,0.012515046,0.011464544,-0.028527733,0.018752627,0.0053254254,-0.0076427236,0.021781305,0.012013847,-0.0464137,-0.020091254,-0.004744703,0.02824012,-0.0006714459,-0.01704454,-0.014547874,0.019098518,0.00034635304,0.026476005,-0.026776465,0.00032676593,-0.01954336,0.021850837,-0.016377812,-0.019995915,-0.009885948,-0.023603957,-0.0036867352,-0.008337799,-0.0105052665,0.021330848,0.013690473,-0.0043765116,0.019994933,-0.010826909,-0.01917639,-0.024213864,0.02065469,0.011838458,-0.04581169,0.0017105711,0.008774149,-0.0015684528,-0.14133,0.021853456,0.0021998014,-0.004782456,0.018694067,-0.034599155,-0.029344568,0.00037659545,0.0020216592,-0.027520806,-0.020716004,-0.010226729,0.013562512,-0.00971666,-0.0026360129,0.027858306,-0.013659226,0.004049572,0.024661655,-0.001286036,-0.007842276,0.004057217,-0.004953276,-0.030934803,-0.020777088,-0.006294488,0.015278991,-0.018786024,0.023943972,-0.045032784,-0.026691543,-0.027596815,0.017024498,-0.02584902,-0.022931227,0.013463096,-0.011561639,-0.0051089753,-0.010575774,0.034952782,-0.01812967,0.00038587645,0.0013161812,-0.01533764,0.006381253,0.0023715673,0.013679994,0.009810634,0.038650144,0.028808735,0.053459723,-0.022224283,0.010538957,0.022795714,0.0077755353,0.0072038425,0.010570235,-0.016211007,0.005581402,-0.002804366,0.0024023782,0.00029387412,-0.0020061145,0.022005472,-0.014319059,0.017545085,-0.028703675,0.007487522,-0.0057794363,-0.0077989954,-0.0012556184,-0.011508683,0.013317334,0.017350446,-0.0069968044,0.022018082,0.008978223,-0.007431234,0.0029490693,0.007712005,-0.036743626,-0.020012032,-0.024933228,0.00069665245,0.033929735,0.0016946453,0.012918275,0.022876184,-0.03192341,0.007851198,-0.009815246,-0.0071458197,-0.0125662,-0.005175747,0.005424111,-0.035557006,-0.007608491,0.012737967,-0.0014826071,0.006244318,-0.004452923,0.0057048798,-0.0011605154,0.006676945,-0.008145378,0.025538882,-0.0040222025,-0.0070952335,0.0355465,-0.008220482,-0.019311585,-0.017599372,-0.025419697,-0.016095163,0.0048433794,0.0033370075,0.003924509,0.018483503,0.0078012133,0.025730804,0.019749526,0.016172638,0.0034114246,-0.014091569,0.019940518,-0.041070245,0.013336579,-0.0047101355,0.018488323,0.013684886,0.011765027,0.009327984,-0.005659139,-0.006519495,0.013892332,-0.025253084,0.015832739,-0.006238194,0.012539672,-0.00036503948,-0.03257438,-0.0013408606,-0.025816904,0.013883213,-0.014699028,0.004621365,-0.013638854,0.011420135,0.010812065,0.013451102,-0.007572285,0.020502906,0.0073913033,-0.035282373,-0.007872209,-0.009659972,-0.0056419894,0.008119139,0.009730765,-0.0021227135,0.017156458,-0.0631563,0.0634112,0.03540645,-0.037408475,-0.0021998964,-0.011407886,0.0125649925,0.024673827,-0.019050948,0.011493614,-0.0051056505,0.007233352,-0.023130074,-0.02223238,0.019661669,0.0029947092,-0.0043308632,-0.012702136,0.0058672642,-0.0042989785,-0.019317856,0.012709867,-0.009250266,0.010661588,0.0346395,-0.012515409,0.011969957,0.030048456,0.008935517,0.007348262,0.032441147,0.011598815,0.00013493192,0.0028947776,0.002410543,-0.009345237,0.0030425547,0.009004325,-0.040473145,-0.01002409,0.0111475345,0.013531684,0.0003851957,-0.001933317,0.007859531,-0.0015025185,-0.01891999,0.001697067,-0.0033360098,0.015482823,0.010513917,-0.011146242,-0.0053920927,-0.012648109,0.009653365,0.010092187,0.019015083,-0.0008126286,0.0028240855,0.021264447,-0.0012481572,0.0066555496,-0.01229823,-0.0033676329,0.004785759,0.002975,-0.031479623,-0.005411983,-0.028582454,-0.009854397,-0.012169259,-0.009179815,0.02405061,-0.0048323763,0.016862845,0.020442028,0.0064489697,-0.009479367,-0.04426115,0.0073207594,-0.025696322,-0.011097309,0.0026494418,0.008027952,0.031272225,0.008831966,0.008403713,-0.0007794654,0.013076649,-0.01799684,0.009752954,0.00781459,-0.010826593,0.016979793,-0.007955833,-0.0021514238,0.00077896944,-0.012476491,-0.024153857,0.02859306,-0.006869061,-0.022843778,-0.016668236,-0.004891416,0.017205458,0.031913273,-0.03357302,-0.02763838,-0.0037319541,-0.0050179977,0.033612613,-0.017435612,0.0030283446,-0.0036785363,0.01584908,0.013875852,-0.008402727,0.0045654024,-0.00050535763,-0.01824177,-0.014794658,0.00838719,0.004847515,-0.03895446,-0.012586026,-0.004965442,0.0009352819,0.0003140285,-0.007247617,-0.024241347,-0.010585171,-0.011052599,-0.0094241975,-0.01278829,0.011782621,-0.00041472673,0.011640508,0.017190453,0.014692758,-0.0026787552,0.008502576,0.024655337,0.0054966887,0.0031342919,-0.008457277,-0.013323162,-0.028555423,-0.01710192,-0.008796657,-0.018849974,-0.012159894,-0.025661852,-0.0167774,-0.033902396,0.008646715,-0.013104908,-0.019650875,-0.031997055,0.013805584,-0.00080752483,-0.015386977,0.022228695,0.0032122754,-0.0098268725,0.021656485,-0.005208371,-1.1588267e-05,-0.0041925567,0.016743585,-0.00039851066,-0.022116026,-0.012106319,-0.0027597034,-0.00962575,0.034879353,0.00766712,0.02023327,-0.0010053398,0.004599721,-0.010234823,-0.008246116,0.029954135,-0.025927642,-0.008000091,-0.01049656,-0.0080434885,-0.00012252653,-0.010983328,-0.009730476,-0.008043951,-0.024305,-0.021329982,-0.03314194,-0.0018664469,-0.0055908714,0.00080698007,0.030027768,-0.00950247,0.012814052,0.009914793,-0.01683309,0.03063776,2.187957e-05,-0.03237765,0.020454157,-0.0164656,-0.004515959,0.0010923024,0.0077853473,0.026174922,-0.031087033,-0.0048236544,0.010606575,0.014399103,-0.011520067,0.01302264,-0.018455898,0.010254674,-0.02621151,-0.009645891,-0.013274064,-0.021506334,0.012081096,-0.0035024085,-0.0053852173,-0.013405616,0.009953695,-0.005906099,0.003986034,-0.002631279,0.0011272166,-0.011196945,0.003371076,0.010419032,-0.006103547,0.0064027985,0.012806688,0.015436434,-0.012720561,0.0008700268,0.035800338,0.010825864,-0.02265434,0.011340738,-0.0019450444,-0.027298328,-0.017177826,0.022654278,-0.011337355,-0.04100778,0.021070685,-0.008385726,0.026129372,0.0017327811,-0.003295431,0.0027184521,-0.0058544884,-0.016580245,0.013732474,-0.012707417,0.002854259,0.011672138,0.0033854633,-0.0013702979,0.012886319,-0.02119137,-0.017204063,-0.014155138,0.00536297,-0.10559159,0.008336694,-0.0033711921,-0.0043983487,0.014512413,-0.0060679414,0.009361446,0.018967027,-0.0041969037,0.0005125836,-0.018629419,0.0065816343,0.03254916,0.013368471,0.0017433388,-0.004692441,-0.0069334004,-0.006102349,0.021387773,-0.0137376245,0.018551437,-0.005310757,0.020024315,9.0521775e-07,-0.03178919,-0.017594296,0.0067676944,-0.013135138,0.020934395,-0.018817037,-0.002646143,-0.0003652009,0.022225844,-0.008961229,0.0019089879,-0.012407814,0.024174271,-0.0027833548,0.0062439432,0.028983468,0.014004022,-0.0073218495,0.013150915,0.017378345,-0.006744761,0.010542715,0.021753084,0.0034441175,-0.022573782,0.012853687,-0.028224152,-0.0061524184,-0.014810064,-0.038283117,-0.0015147066,0.0066443235,-0.00071874255,5.0904877e-05,-0.012658416,-0.0014969835,-0.033202138,0.027081344,0.010277947,0.0030682953,-0.01029139,0.012544268,-0.00042068362,-0.0032102389,0.009282551,0.0004061171,0.015017148,0.017558683,0.0038096693,0.021602677,-0.009857665,0.01727419,-0.046556138,0.023764962,-0.010731313,-0.0027792947,-0.013036395,-0.0027261048,-0.08698382,-0.02661592,-0.01607425,-0.011871536,0.017322594,-0.03423761,-0.0055126124,-0.032113664,-0.023298591,-0.012470681,0.017775675,-0.018490624,-0.007866828,-0.008966035,-0.027712397,0.018207297,0.024153484,-0.003185012,-0.01992011,-0.016371053,-0.0026347276,0.0013626392,0.015378546,-0.02244092,0.018451057,0.018627211,0.0034251192,-0.016619794,-0.0023675482,-0.009739456,-0.01336356,-0.11839658,-0.031089444,-0.004105024,-0.0153113315,0.0021037257,0.0029255988,0.005240373,-0.044090692,0.014986293,-0.012915232,-0.017001934,-0.02916312,-0.036165223,-0.021893341,0.0044589215,0.09757262,-0.008697655,0.018573422,0.004409639,-0.0061804634,0.0024826957,-0.023944287,-0.04407562,0.0071057985,-0.021253075,-0.020784343,0.023042673,-0.010335076,-0.0053931694,-0.020511827,-0.008621039,-0.012984233,-0.015351402,0.015801692,0.023860255,-0.019573294,0.007040945,-0.007241999,-0.014118342,0.0077982256,0.005821227,0.0026048427,-0.014892007,0.0037587653,0.0023012727,0.011256289,-0.024643647,-0.026273238,-0.0014743919,-0.001214606,-0.009052186,-0.06504517,0.025306005,-0.026467994,0.009977044,-0.0003721716,-0.029587997,0.014425929,0.029988082,-0.01594116,0.0064309333,-0.022321848,0.00016776448,0.038041934,-0.020012246,-0.0038961654,0.040853623,0.030920045,-0.0028897321,0.001471478,-0.0137648685,0.023107063,-0.0023431776,-0.02855426,0.0025163204,-0.02213395,-0.013361901,0.006223431,0.028471986,0.025778852,0.0005825671,-0.0074089947,-0.007945905,-0.03147363,-0.003473431,-0.012472586,0.03566877,0.015784185,-0.012605704,-0.013304317,0.022889897,0.039812773,0.015494573,0.016198702,0.004012059,0.04141807,-0.02887315,0.028885957,0.022370547,-0.022438323,-0.0060121077,-0.019456632,0.020208932,0.007341021,-0.015462442,-0.012324347,-0.0010734563,0.020385945,0.03108278,0.031430747]",{"tags":36,"relatedLang":46,"relatedPosts":50},[37,38,40,42,44],{"name":16,"slug":16},{"name":13,"slug":39},"kubernetes",{"name":17,"slug":41},"deployment",{"name":14,"slug":43},"control-loop",{"name":15,"slug":45},"desired-state",{"id":27,"slug":47,"title":48,"language":49},"kubernetes-turns-clusters-into-declared-state-en","Kubernetes turns clusters into declared state","en",[51,57,63,69,75,81],{"id":52,"slug":53,"title":54,"cover_image":55,"image_url":55,"created_at":56,"category":26},"aa78f0bb-2826-4d1e-a7ab-a6f5bb15a873","sim-visual-agent-workflow-canvas-zh","Sim 把 agent 流程變成畫布","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779201890676-1xsq.png","2026-05-19T14:44:16.281068+00:00",{"id":58,"slug":59,"title":60,"cover_image":61,"image_url":61,"created_at":62,"category":26},"9ae0773b-5a25-4d26-a750-c26b7f031f0f","low-latency-layer-reflex-anti-lag-linux-gpus-zh","low_latency_layer 讓 Linux GPU 也有低延遲","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779201242989-tzoj.png","2026-05-19T14:33:31.138213+00:00",{"id":64,"slug":65,"title":66,"cover_image":67,"image_url":67,"created_at":68,"category":26},"2cc4bd83-4170-4fe8-8204-2c6f32aae872","dbt-sl-turns-semantic-layer-setup-into-a-loop-zh","dbt sl 讓設定變成迴圈","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779200667586-cuev.png","2026-05-19T14:23:58.228721+00:00",{"id":70,"slug":71,"title":72,"cover_image":73,"image_url":73,"created_at":74,"category":26},"5951c90e-9b00-43b0-9135-88e1e6ea4376","kubernetes-v136-release-notes-playbook-zh","Kubernetes v1.36 把發布說明變作戰手冊","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779197685570-cy9v.png","2026-05-19T13:34:13.951402+00:00",{"id":76,"slug":77,"title":78,"cover_image":79,"image_url":79,"created_at":80,"category":26},"a1bd40fe-2b96-430c-bce3-17f4b3284333","ibm-vibe-coding-guide-turns-prompts-into-code-zh","IBM Vibe Coding 把提示詞變程式碼","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779183875735-m3wz.png","2026-05-19T09:44:02.030134+00:00",{"id":82,"slug":83,"title":84,"cover_image":85,"image_url":85,"created_at":86,"category":26},"55c43732-c8a9-4ee1-a373-383fa27a41b4","anthropic-buys-stainless-sdk-tool-rivals-zh","Anthropic 收購 Stainless，SDK 工具進入戰局","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779180252426-zkmj.png","2026-05-19T08:43:39.377553+00:00",[88,93,98,103,108,113,118,123,128,133],{"id":89,"slug":90,"title":91,"created_at":92},"de769291-4574-4c46-a76d-772bd99e6ec9","googles-biggest-gemini-launches-in-2026-zh","Google 2026 最大 Gemini 盤點","2026-03-26T07:26:39.21072+00:00",{"id":94,"slug":95,"title":96,"created_at":97},"855cd52f-6fab-46cc-a7c1-42195e8a0de4","surepath-real-time-mcp-policy-controls-zh","SurePath 推出即時 MCP 政策控管","2026-03-26T07:57:40.77233+00:00",{"id":99,"slug":100,"title":101,"created_at":102},"9b19ab54-edef-4dbd-9ce4-a51e4bae4ebb","mcp-in-2026-the-ai-tool-layer-teams-use-zh","2026 年 MCP：團隊真的在用的 AI 工具層","2026-03-26T08:01:46.589694+00:00",{"id":104,"slug":105,"title":106,"created_at":107},"af9c46c3-7a28-410b-9f04-32b3de30a68c","prompting-in-2026-what-actually-works-zh","2026 提示工程，真正有用的是什麼","2026-03-26T08:08:12.453028+00:00",{"id":109,"slug":110,"title":111,"created_at":112},"05553086-6ed0-4758-81fd-6cab24b575e0","garry-tan-open-sources-claude-code-toolkit-zh","Garry Tan 開源 Claude Code 工具包","2026-03-26T08:26:20.068737+00:00",{"id":114,"slug":115,"title":116,"created_at":117},"042a73a2-18a2-433d-9e8f-9802b9559aac","github-ai-projects-to-watch-in-2026-zh","2026 必看 20 個 GitHub AI 專案","2026-03-26T08:28:09.619964+00:00",{"id":119,"slug":120,"title":121,"created_at":122},"a5f94120-ac0d-4483-9a8b-63590071ac6a","claude-code-vs-cursor-2026-zh","Claude Code 與 Cursor 深度對比：202…","2026-03-26T13:27:14.279193+00:00",{"id":124,"slug":125,"title":126,"created_at":127},"0975afa1-e0c7-4130-a20d-d890eaed995e","practical-github-guide-learning-ml-2026-zh","2026 機器學習入門 GitHub 實用指南","2026-03-27T01:16:49.712576+00:00",{"id":129,"slug":130,"title":131,"created_at":132},"bfdb467a-290f-4a80-b3a9-6f081afb6dff","aiml-2026-student-ai-ml-lab-repo-review-zh","AIML-2026：像課綱的學生實驗 Repo","2026-03-27T01:21:51.467798+00:00",{"id":134,"slug":135,"title":136,"created_at":137},"80cabc3e-09fc-4ff5-8f07-b8d68f5ae545","ai-trending-github-repos-and-research-feeds-zh","AI Trending：把 AI 資源收成一張表","2026-03-27T01:31:35.262183+00:00"]