聲明式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 )
創建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" )
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
整個流程全部執行完畢