成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我們為什么會刪除不了集群的 Namespace?

云計算 云原生
Namespace 本身也是一種資源。通過集群 API Server 入口,我們可以新建 Namespace,而對于不再使用的 Namespace,我們需要清理掉。Namespace 的 Controller 會通過 API Server,監視集群中 Namespace 的變化,然后根據變化來執行預先定義的動作。

背景

今天我們討論的這個問題,跟 K8s 集群的 Namespace 有關。Namespace 是 K8s 集群資源的“收納”機制。我們可以把相關的資源“收納”到同一個 Namespace 里,以避免不相關資源之間不必要的影響。

Namespace 本身也是一種資源。通過集群 API Server 入口,我們可以新建 Namespace,而對于不再使用的 Namespace,我們需要清理掉。Namespace 的 Controller 會通過 API Server,監視集群中 Namespace 的變化,然后根據變化來執行預先定義的動作。

圖片圖片

有時候,我們會遇到下圖中的問題,即 Namespace 的狀態被標記成了 "Terminating",但卻沒有辦法被完全刪除。

圖片圖片

從集群入口開始

因為刪除操作是通過集群 API Server 來執行的,所以我們要分析 API Server 的行為。跟大多數集群組件類似,API Server 提供了不同級別的日志輸出。為了理解 API Server 的行為,我們將日志級別調整到最高級。然后,通過創建刪除 tobedeletedb 這個 Namespace 來重現問題。

但可惜的是,API Server 并沒有輸出太多和這個問題有關的日志。

相關的日志,可以分為兩部分:

  • 一部分是 Namespace 被刪除的記錄,記錄顯示客戶端工具是 kubectl,以及發起操作的源 IP 地址是 192.168.0.41,這符合預期;

  • 另外一部分是 Kube Controller Manager 在重復地獲取這個 Namespace 的信息。

圖片圖片

Kube Controller Manager 實現了集群中大多數的 Controller,它在重復獲取 tobedeletedb 的信息,基本上可以判斷,是 Namespace 的 Controller 在獲取這個 Namespace 的信息。

Controller 在做什么?

和上一節類似,我們通過開啟 Kube Controller Manager 最高級別日志,來研究這個組件的行為。在 Kube Controller Manager 的日志里,可以看到 Namespace 的 Controller 在不斷地嘗試一個失敗了的操作,就是清理 tobedeletedb 這個 Namespace 里“收納”的資源。

圖片

1. 怎么樣刪除“收納盒”里的資源?

這里我們需要理解一點,就是 Namespace 作為資源的“收納盒”,其實是邏輯意義上的概念。它并不像現實中的收納工具,可以把小的物件收納其中。Namespace 的“收納”實際上是一種映射關系。

圖片圖片

這一點之所以重要,是因為它直接決定了,刪除 Namespace 內部資源的方法。如果是物理意義上的“收納”,那我們只需要刪除“收納盒”,里邊的資源就一并被刪除了。而對于邏輯意義上的關系,我們則需要羅列所有資源,并刪除那些指向需要刪除的 Namespace 的資源。

2. API、Group、Version

怎么樣羅列集群中的所有資源呢?這個問題需要從集群 API 的組織方式說起。

K8s 集群的 API 不是鐵板一塊的,它是用分組和版本來組織的。這樣做的好處顯而易見,就是不同分組的 API 可以獨立迭代,互不影響。常見的分組如 apps,它有 v1、v1beta1 和 v1beta2 三個版本。完整的分組/版本列表,可以使用 kubectl api-versions 命令看到。

圖片圖片

我們創建的每一個資源,都必然屬于某一個 API 分組/版本。以下邊 Ingress 為例,我們指定 Ingress 資源的分組/版本為 networking.k8s.io/v1beta1。

kind: Ingress
metadata:
  name: test-ingress
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        backend:
          serviceName: test
          servicePort: 80

用一個簡單的示意圖來總結 API 分組和版本。

圖片圖片

實際上,集群有很多 API 分組/版本,每個 API 分組/版本支持特定的資源類型。我們通過 yaml 編排資源時,需要指定資源類型 kind,以及 API 分組/版本 apiVersion。而要列出資源,我們需要獲取 API 分組/版本的列表。

3. Controller 為什么不能刪除 Namespace 里的資源?

理解了 API 分組/版本的概念之后,再回頭看 Kube Controller Manager 的日志,就會豁然開朗。顯然 Namespace 的 Controller 在嘗試獲取 API 分組/版本列表,當遇到 metrics.k8s.io/v1beta1 的時候,查詢失敗了。并且查詢失敗的原因是 "the server is currently unable to handle the request"。

再次回到集群入口

在上文中,我們發現 Kube Controller Manager 在獲取 metrics.k8s.io/v1beta1 這個 API 分組/版本的時候失敗了。而這個查詢請求,顯然是發給 API Server 的。所以我們回到 API Server 日志,分析 metrics.k8s.io/v1beta1 相關的記錄。

在相同的時間點,我們看到 API Server 也報了同樣的錯誤 "the server is currently unable to handle the request"。

圖片圖片

顯然這里有一個矛盾,就是 API Server 明顯在正常工作,為什么在獲取 metrics.k8s.io/v1beta1 這個 API 分組版本的時候,會返回 Server 不可用呢?為了回答這個問題,我們需要理解一下 API Server 的“外掛”機制。

圖片圖片

集群 API Server 有擴展自己的機制,開發者可以利用這個機制,來實現 API Server 的“外掛”。這個“外掛”的主要功能,就是實現新的 API 分組/版本。API Server 作為代理,會把相應的 API 調用,轉發給自己的“外掛”。

以 Metrics Server 為例,它實現了 metrics.k8s.io/v1beta1 這個 API 分組/版本。所有針對這個分組/版本的調用,都會被轉發到 Metrics Server。如下圖,Metrics Server 的實現,主要用到一個服務和一個 pod。

圖片圖片

而上圖中最后的 apiservice,則是把“外掛”和 API Server 聯系起來的機制。下圖可以看到這個 apiservice 詳細定義。它包括 API 分組/版本,以及實現了 Metrics Server 的服務名。有了這些信息,API Server 就能把針對 metrics.k8s.io/v1beta1 的調用,轉發給 Metrics Server。

圖片圖片

節點與 Pod 之間的通信

經過簡單的測試,我們發現,這個問題實際上是 API server 和 metrics server pod 之間的通信問題。在阿里云 K8s 集群環境里,API Server 使用的是主機網絡,即 ECS 的網絡,而 Metrics Server 使用的是 Pod 網絡。這兩者之間的通信,依賴于 VPC 路由表的轉發。

圖片圖片

以上圖為例,如果 API Server 運行在 Node A 上,那它的 IP 地址就是 192.168.0.193。假設 Metrics Server 的 IP 是 172.16.1.12,那么從 API Server 到 Metrics Server 的網絡連接,必須要通過 VPC 路由表第二條路由規則的轉發。

檢查集群 VPC 路由表,發現指向 Metrics Server 所在節點的路由表項缺失,所以 API server 和 Metrics Server 之間的通信出了問題。

Route Controller 為什么不工作?

為了維持集群 VPC 路由表項的正確性,阿里云在 Cloud Controller Manager 內部實現了 Route Controller。這個 Controller 在時刻監聽著集群節點狀態,以及 VPC 路由表狀態。當發現路由表項缺失的時候,它會自動把缺失的路由表項填寫回去。

現在的情況,顯然和預期不一致,Route Controller 顯然沒有正常工作。這個可以通過查看 Cloud Controller Manager 日志來確認。在日志中,我們發現,Route Controller 在使用集群 VPC id 去查找 VPC 實例的時候,沒有辦法獲取到這個實例的信息。

圖片圖片

但是集群還在,ECS 還在,所以 VPC 不可能不在了。這一點我們可以通過 VPC id 在 VPC 控制臺確認。那下邊的問題,就是為什么 Cloud Controller Manager 沒有辦法獲取到這個 VPC 的信息呢?

集群節點訪問云資源

Cloud Controller Manager 獲取 VPC 信息,是通過阿里云開放 API 來實現的。這基本上等于從云上一臺 ECS 內部,去獲取一個 VPC 實例的信息,而這需要 ECS 有足夠的權限。目前的常規做法是,給 ECS 服務器授予 RAM 角色,同時給對應的 RAM 角色綁定相應的角色授權。

圖片圖片

如果集群組件,以其所在節點的身份,不能獲取云資源的信息,那基本上有兩種可能性。一是 ECS 沒有綁定正確的 RAM 角色;二是 RAM 角色綁定的 RAM 角色授權沒有定義正確的授權規則。檢查節點的 RAM 角色,以及 RAM 角色所管理的授權,我們發現,針對 vpc 的授權策略被改掉了。

圖片圖片

當我們把 Effect 修改成 Allow 之后,沒多久,所有的 Terminating 狀態的 namespace 全部都消失了。

圖片圖片

問題大圖

總體來說,這個問題與 K8s 集群的 6 個組件有關系,分別是 API Server 及其擴展 Metrics Server,Namespace Controller 和 Route Controller,以及 VPC 路由表和 RAM 角色授權。

圖片圖片

通過分析前三個組件的行為,我們定位到,集群網絡問題導致了 API Server 無法連接到 Metrics Server;通過排查后三個組件,我們發現導致問題的根本原因是 VPC 路由表被刪除且 RAM 角色授權策略被改動。

總結

K8s 集群 Namespace 刪除不掉的問題,是線上比較常見的一個問題。這個問題看起來無關痛癢,但實際上不僅復雜,而且意味著集群重要功能的缺失。這篇文章全面分析了一個這樣的問題,其中的排查方法和原理,希望對大家排查類似問題有一定的幫助。

責任編輯:武曉燕 來源: 云原生運維圈
相關推薦

2018-09-10 15:40:46

GitHubQuery前端

2012-02-22 15:32:11

海量數據

2015-06-10 10:50:29

程序員感覺到累

2020-06-19 14:55:11

Kubernetes容器技術

2019-08-05 08:42:37

物聯網IOT技術

2018-09-14 18:00:29

無損網絡

2022-08-26 08:00:19

企業架構IT

2023-09-05 09:49:03

2013-11-26 09:50:41

iOS汽車iOS in the

2011-06-08 10:30:08

MongoDB

2017-04-05 16:40:45

2020-06-10 09:06:48

MongoDB架構高可用

2022-12-01 14:43:56

物聯網智慧城市

2020-04-06 14:45:22

云計算邊緣計算網絡

2025-06-24 02:00:00

5G-A運營商基站

2015-10-09 16:14:37

數據開放

2024-03-15 09:06:48

HTTPSCA私鑰

2017-07-06 09:45:30

2016-12-27 15:13:12

系統

2018-05-30 14:49:51

編程語言API語法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 五月槐花香 | 国产人成在线观看 | 日本视频中文字幕 | 欧美色综合一区二区三区 | 青草青草久热精品视频在线观看 | 午夜在线观看免费 | 午夜一区二区三区在线观看 | 午夜男人天堂 | 色吊丝在线 | 亚洲h在线观看 | 国产精品久久在线 | 亚洲精品中文字幕在线观看 | 国产精品成人国产乱 | www.久久精品视频 | 欧美日韩在线精品 | 欧美在线视频网 | 国产精品99久久久久久久久久久久 | av中文字幕在线播放 | 久青草影院 | 欧美无乱码久久久免费午夜一区 | 国产成人麻豆免费观看 | av网站免费在线观看 | 欧美一区二区在线播放 | 国产精品成人一区二区三区吃奶 | 欧美一级免费黄色片 | 精品国产伦一区二区三区观看说明 | 国产精品欧美一区二区三区不卡 | 黄视频网站在线 | 四虎影院久久 | 亚洲欧洲精品成人久久奇米网 | 亚洲精品一二三区 | 国产成人99久久亚洲综合精品 | 欧美 日韩 国产 一区 | 日本三级电影在线观看视频 | 天堂在线中文 | 一区二区三区国产 | 日韩午夜精品 | 性视频一区 | 色播99| 国产精品国产亚洲精品看不卡15 | 久久免费观看一级毛片 |