Terminating
無法刪除k8s
在 Kubernetes 中刪除 Namespae 的操作通常在 5 分鐘內會完成 (如果 namespace 中沒有太多 resources 的話),但有時候會發生超過 1 小時 Namespace 的狀態還在 Terminating
的狀態(如下圖),查看 GitHub 中相關的 Issue [1],發現原因可能就是 Kubernetes 刪除 Namespace 的流程出了問題,導致沒有正確執行 finalizer。
Learn More →
這時可以使用 kubectl get namespaces <NAMESPACE> -o yaml
查看該 namespace 中的 finalizers
是否有設定東西,通常都是這個引起 namespace 無法正常刪除。
Learn More →
遇到這件事,可以手動修改 finalizers,將 finalizers 刪除,但刪除 finalizers 沒辦法透過 kubectl edit
指令完成,也無法透過 kubectl apply
apply 新的 resource configurations。
根據 issue 內的說明,可以透過 kubernetes 的 Update finalize of a Namespace
API 修改 finalizers 的值。
要直接呼叫 kubernetes 的 API 可以透過 kubectl proxy
指令,在本機建立 Proxy 連線到 Kubernetes 的 API Server。
指令:kubectl proxy --port 8080
接著建立 resource configurations,將 finalizers 刪除,如果電腦有安裝 jq
指令的話,可以透過 kubectl get namespaces <NAMESPACE> -o json | jq '.spec.finalizers = []' > temp.json
將 finalizers 清空,並將結果的 json 匯出至 temp.json
檔案
例如:
raccoon:~$ kubectl get ns <NAMESPACE> -o json | jq '.spec.finalizers = []' > temp.json
raccoon:~$ cat temp.json
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"annotations": {
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"<NAMESPACE>\"}}\n"
},
"creationTimestamp": "2019-03-12T09:31:01Z",
"deletionTimestamp": "2019-05-29T05:49:07Z",
"name": "<NAMESPACE>",
"resourceVersion": "95028789",
"selfLink": "/api/v1/namespaces/<NAMESPACE>",
"uid": "8d0e98b4-44a9-11e9-aa7a-42010a8c0083"
},
"spec": {
"finalizers": []
},
"status": {
"phase": "Terminating"
}
}
有了修改過的 resource configurations 後,就可以透過 Kubernetes 的 api 修改 finalize 的值,可以透過 curl
指令呼叫 kubernetes 的 api。
範例:
raccoon:~$ curl -H "Content-Type: application/json" \
-X PUT \
--data-binary @temp.json \
http://127.0.0.1:8080/api/v1/namespaces/<NAMESPACE>/finalize
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "<NAMESPACE>",
"selfLink": "/api/v1/namespaces/<NAMESPACE>/finalize",
"uid": "8d0e98b4-44a9-11e9-aa7a-42010a8c0083",
"resourceVersion": "97983943",
"creationTimestamp": "2019-03-12T09:31:01Z",
"deletionTimestamp": "2019-05-29T05:49:07Z",
"annotations": {
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"<NAMESPACE>\"}}\n"
}
},
"spec": {
},
"status": {
"phase": "Terminating"
}
}%
呼叫完 API 後,就可以透過 kubectl get namespace
查看該 namespace 是否已經正常被刪除了。
else 後面可以接很多東西.. 根據 ECMAScript 2020 的定義: 以下程式碼合法: else 後面接 for const a = [1,2,3] if (!Array.isArray(a)) { console.log('...'); // do something...
Nov 3, 2020在使用 Express 搭配 view engine 時,為了避免每次需要渲染 view,導致效能過低,因此 express 內有快取機制,當 view 已經被渲染過,且在快取中有快取,就會直接使用快取中的結果。 這時候可以關閉 express 的 view cache 功能,這樣就能在編輯 view file 後,直接 reload 就能看到結果,不需要重開 server。 關閉 view 的方式很簡單,只要透過 app.disable 關閉 view cache 的設定即可。 "use strict"; const express = require('express'); const app = express();
Apr 17, 2020:::warning 此篇文章討論的 Docker 為 Linux Container,有些內容可能不適用於 Windows Container 技術。 ::: 為什麼 Docker for Mac 會遇到硬碟空間不足的問題? Docker 的技術是基於 Linux Namespaces 與 cgroup 等功能做邏輯隔離,並在隔離的環境中透過同一個 Linux Kernel 執行程式,因此要執行 Docker 的首要條件就是需要有執行 Linux distribution 的機器。 而 Docker 公司為了普及 Docker 技術,推出了在各個主流開發平台上 (Windows, macOS) 透過運行 Linux 虛擬機的方式來滿足跨平台執行 Docker 的需求。 Docker for Mac 的原理是在 macOS 上使用 xhyve 執行虛擬機 ( xhyve 是透過 macOS 原生的虛擬化技術 Hypervisor.framework 執行虛擬機的軟體)。而虛擬機的作業系統是使用 Docker 推出的 Linux Kit 產生的作業系統。
Feb 14, 2020本文主要介紹在使用多個網路介面時,一張路由表可能無法做到複雜的封包路由功能,透過多重路由表搭配路由規則、iptables,讓封包使用不同的路由表,使用不同的介面轉送。 [TOC] Context 圖1:環境拓樸 如上圖,web server上有兩個網路介面,eth0連接內部私人網路;eth1直接連接 internet 提供對外存取服務。因為公司 IT 政策的關係,web server 自身產生的任何流量(系統更新、套件下載等...)都必須經過內部網路的邊界伺服器( Edge Router ),而 eth1 則是作為專線,用來服務由外對內的網頁伺服器流量。以此做到讓服務網路與管理網路分離。
Feb 14, 2020or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up