K8S學習筆錄 - Kubernetes API Server簡介

原文連接git

在以前的學習過程當中,都是在Master節點上使用 kubectl 命令與相應的配置文件對集羣資源進行操做。 實際上真正操做集羣資源的是 Kubernetes API Serverkubeclt 工具也是經過該服務提供的接口對資源進行操做的。github

什麼是API Server

Kubernetes API Server 是運行在Master節點上的kube-apiserver進程提供的服務。 該服務是集羣內各個功能模塊之間數據交互和通訊的中心樞紐,是整個系統的數據總線和數據中心。數據庫

因爲API Server承擔了系統內關鍵的數據通訊部分,因此API Server的性能高低決定了集羣性能的高低。api

API Server架構與設計

API Server的架構從上到下能夠分爲四層bash

  1. API層。提供針對資源CRUD的和監控的接口和健康檢查、日誌、性能指標等運維相關接口。markdown

  2. 訪問控制層。當客戶端訪問API的時候,負責對用戶的權限作驗證,根據配置的的各類資源訪問權限判斷是否能夠訪問。網絡

  3. 註冊表層。Kubernetes把全部資源對象都保存在註冊表中,針對註冊表中的各類資源對象定義了相關數據類型和建立、轉換、編碼的方法。架構

  4. ETCD數據庫層。用於持久化存儲資源對象的。K8S使用etcd的watch API接口設計了 List-Watch 高性能資源同步機制,使得系統能夠管理大規模的集羣和快速及時的處理集羣中的各類事件。app

apiserver-struct

List Watch機制

首先 kube-apiserver 藉助etcd的watch API接口,能夠監聽到在etcd上發生的數據操做事件,例如Pod的建立、更新、刪除等。運維

而後,爲了避免讓除了 kube-apiserver 以外的組件一樣訪問到底層數據庫, kube-apiserver 也實現了一套與etcd監聽類似的接口提供給上層業務,使得其餘業務能夠不訪問底層數據庫就監聽到數據的變化。 例如上圖中虛線框 List-Watch 2kube-scheduler 組件經過監聽即便得到了 kube-controller-manager 發起的建立Pod的事件,對新建Pod進行調度等操做。

最後,在數據同步上客戶端先獲取到了調用API Server的接口獲取到全量數據,而後經過goroutine監聽列表數據變化異步寫入內存,實現高性能的數據同步。

apiserver-workflow

API升級帶來的數據轉化問題

在經過godoc學習編寫配置文件的時候,咱們看到了實際上K8S在同一個類型的資源有不少版本,例如 app/v1app/v1beta1app/v1beta2 。 另外經過網上的一些博客文章也能夠發現以前有些資源是在 v1beta 中的,而如今已經遷移到 v1 中了。

經過版本號能夠解決接口版本兼容問題,可是還有一個版本之間數據轉化的問題。好比數據對象經歷了 v1beta1v1beta2 ... v1betaN-1 最終變爲 v1 版本。

此時該數據對象就存在N個版本,若是這N個版本之間的數據兩兩直接轉換,就存在不少種邏輯組合,變成一種典型的網狀網絡。 另外每增長一個新的版本,就須要增長N份相應的轉化配置。

因而API Server引入了一箇中間版本(internal),全部的版本最終都會轉爲此版本進行使用,以此減小互相轉化的成本。

apiserver-vc-internal

如何調用Kubernetes API Server

在Master節點上該服務能夠經過本地接口來訪問,端口經過kube-apiserver啓動參數 --insecure-port=8080--secure-port=6443 進行配置。

進程的啓動參數能夠經過 ps -o cmd -C kube-apiserver 來查看。

不過在我使用 kubeadm 初始化集羣的時候, kube-apiserver 其實是以集羣中Pod的形式啓動的。

$ kubectl get pod -n kube-system
NAME                          READY   STATUS    RESTARTS   AGE
...
kube-apiserver-ali            1/1     Running   0          39m
...
複製代碼

因此我能夠經過修改 /etc/kubernetes/manifests/kube-apiserver.yaml 的Pod配置文件來修改端口。 具體的參數意義能夠在官網查閱 kube-apiserver

在上述工做作好以後,經過 curl localhost:8080 即可以訪問到API Server提供的服務

$ curl localhost:8080
{
  "paths": [
    "/api",
    ...
  ]
}
複製代碼

舉個例子,例如要查看指定pod的狀態,即可以經過以下方式進行調用

$ curl localhost:8080/api/v1/namespaces/default/pods/<pod-name>
{
  "kind": "Pod",
  "apiVersion": "v1",
  "metadata": {
    ...
  },
  "spec": {
    ...
  },
  "status": {
    ...
  }
}
複製代碼

除了curl之外,也能夠經過k8s的api庫來調用,例如 github.com/kubernetes/…

篇幅限制,就不貼他們的實例代碼了,有興趣的能夠在這裏看 github.com/kubernetes/…

相關文章
相關標籤/搜索