k8s的APIServer流程介紹


聲明式API介紹

    所謂“聲明式” 指的就是我只需要提交一個定義好的API對象來“聲明”,我所期望的狀態是什么樣子

   “聲明式 API”允許有多個 API寫端,以PATCH的方式對API對象進行修改而無需關心本地原始YAML文件的內容.自動對多個寫進行Merge操作

    有了上述兩個能力Kubernetes才可以基於對 API 對象的增、刪、改、查.在完全無需外界干預的情況下完成對“實際狀態”和“期望狀態”的調諧(Reconcile)過程

    聲明式 API才是 Kubernetes項目編排能力“賴以生存”的核心所在   

APIServer介紹

     k8s的API對象的組織方式是一個層層遞進的方式來組織的          api組/api版本/資源類型

    

     把一個YAML 文件提交給Kubernetes之后創建出一個API對象的流程:

       1. Kubernetes 會匹配 API對象的組

       2. Kubernetes 會進一步匹配到 API對象的版本號

       3. Kubernetes 會匹配 API 對象的資源類型

       4. kubernetes匹配到正確的資源類型后,就可以開始創建API對象.APIServer執行流程如下:

          1.APIServer首先過濾這個請求並完成一些前置性工作.   如:授權,超時處理,審計

          2.然后請求進入MUX和Routers流程.這個步驟是APIServer完成URL和Handler綁定的場所.APIServer的Handler的功能就是找到用戶提交資源對應的類型定義

          3.API根據對應的類型定義配合用戶提交的YAML文件里的字段.在內存中創建出一個相應的對象.在創建的過程中APIServer會進行一個Convert操作,把用戶提交的YAML文件轉換成一個叫Super Version的對象.它是該API資源類型所有版本字段的全集.這樣用戶提交不同的版本的YAML文件就都可以使用Super Version對象來處理

          4.APIServer會對內存中的對象進行Admission()操作,如Admission Controller和Initializer步驟都屬於Admission階段

          5.APIServer會把對象進行Validation操作,它負責驗證這個對象里的各個字段是否合法.驗證通過后的API對象都會保存到APIServer中一個叫 Registry的數據結構中

          6.APIServer會把驗證過的Super API對象轉換用戶最初提交的版本進行序列化操作並保存到Etcd中.至此整個API對象創建完畢

         

     APIServer要同時要兼顧性能、API 完備性、版本化、向后兼容等很多工程化指標

 Custom Resource Definition(CRD)定義

      它指的就是允許用戶在Kubernetes中添加一個跟Pod、Node 類似的、新的 API 資源類型 即:自定義 API 資源

      使用code-generator生成代碼的時候跟宿主機安裝的go版本有很大的關系 如在go1.12和go1.13執行go build的時候對代碼的要求就不一樣

      go1.13上引入mod的名稱不是標准的域名也會報錯。而在go1.12版本上就不會報錯

     

    解決辦法:

       1.修改code-generator項目下的go.mod

          k8s.io/k8s_customize_controller/pkg/apis/bolingcavalry => /root/gopath/src/k8s.io/k8s_customize_controller/pkg/apis/bolingcavalry

// This is a generated file. Do not edit directly.

go 1.13

require (
        github.com/emicklei/go-restful v2.11.2+incompatible // indirect
        github.com/go-openapi/jsonreference v0.19.3 // indirect
        github.com/spf13/pflag v1.0.5
        github.com/stretchr/objx v0.2.0 // indirect
        golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 // indirect
        golang.org/x/net v0.0.0-20200226121028-0de0cce0169b // indirect
        golang.org/x/tools v0.0.0-20200226224502-204d844ad48d // indirect
        k8s.io/apimachinery v0.17.3 // indirect
        k8s.io/gengo v0.0.0-20200205140755-e0e292d8aa12
        k8s.io/k8s_customize_controller/pkg/apis/bolingcavalry v0.0.0-00010101000000-000000000000 // indirect
        k8s.io/klog v1.0.0
        k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe
        sigs.k8s.io/yaml v1.2.0 // indirect
)

replace (
        golang.org/x/sys => golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a // pinned to release-branch.go1.13
        golang.org/x/tools => golang.org/x/tools v0.0.0-20190821162956-65e3620a7ae7 // pinned to release-branch.go1.13

//告訴go不要使用去遠程服務器下載 直接使用本地目錄
        k8s.io/k8s_customize_controller/pkg/apis/bolingcavalry => /root/gopath/src/k8s.io/k8s_customize_controller/pkg/apis/bolingcavalry
)
go.mod

創建CRD流程 

     1.創建自定義API對象定義(CRD)

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  # metadata.name的內容是由"復數名.分組名"構成,如下,students是復數名,bolingcavalry.k8s.io是分組名
  name: students.bolingcavalry.k8s.io
spec:
  # 分組名,在REST API中也會用到的,格式是: /apis/分組名/CRD版本
  group: bolingcavalry.k8s.io
  # list of versions supported by this CustomResourceDefinition
  versions:
    - name: v1
      # 是否有效的開關.
      served: true
      # 只有一個版本能被標注為storage
      storage: true
  # 范圍是屬於namespace的
  scope: Namespaced
  names:
    # 復數名
    plural: students
    # 單數名
    singular: student
    # 類型名
    kind: Student
    # 簡稱,就像service的簡稱是svc
    shortNames:
    - stu
資源類
apiVersion: bolingcavalry.k8s.io/v1
kind: Student
metadata:
  name: object-student
spec:
  name: "bbb"
  school: "aaa"
資源實例

     2.用code-generator生成informer和client相關代碼    

/root/gopath/src/k8s.io/k8s_customize_controller/pkg/apis/bolingcavalry/v1/register.go


package v1

import (
   metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
   "k8s.io/apimachinery/pkg/runtime"
   "k8s.io/apimachinery/pkg/runtime/schema"

   "k8s.io/k8s_customize_controller/pkg/apis/bolingcavalry"
)
vi v1/register.go

              go.mod是個空文件,但必須要創建 .否則go build的時候會提示找不到此文件

             ./generate-groups.sh all k8s.io/k8s_customize_controller/pkg/client k8s.io/k8s_customize_controller/pkg/apis bolingcavalry:v1

   3.創建並運行自定義控制器,k8s中所有對CR對象的相關操作都會被控制器監聽到,可以根據實際需求在控制器中編寫自己的業務邏輯

      1.在項目根目錄下創建controller.go
      2.在項目根目錄下的pkg目錄下創建signals目錄
      3.在項目根目錄下創建main.go
      4.編譯構建和啟動
         1.安裝go build的依賴模塊
         2.在根目錄執行go build成功后會生成一個二進制可執行文件
         3.從我的src目錄中刪除../../../k8s.io
            通過在go.mod文件中顯式聲明版本,避免使用客戶端go的最新主分支,重新運行構建獲取了新的源和客戶端的穩定版本.生成沒有錯誤地執行
     5.k8s項目出現問題一定要用google搜索 用百度根本搜索不到相關問題

 

 

 修改依賴的包名

 

 

 

 klog這個包源碼不能下載最新版本,下載一個舊的版本klog包並且上傳的指定目錄

 

   在項目根目錄下執行go build.執行成功后會在當前目錄生成一個二進制可執行文件

   啟動自定義控制器命令       ./k8s_customize_controller -kubeconfig=$HOME/.kube/config -alsologtostderr=true

整個流程全部執行完畢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM