Kubernetes CRDs 自定義資源

[TOC]html

Kubernetes CRDs 自定義資源

基礎簡介

Kubernetes API

REST API 是 Kubernetes 的基礎結構,全部的操做和組件間的通訊,包括外部的用戶命令,都是由 API Server 處理的 REST API 調用。所以,Kubernetes 中的全部事物都被視爲一個 API 對象而且都有一個與之對應的 API 入口。git

和API Server的交互能夠採用REST API,也能夠採用kubectl等命令行工具github

Kubernetes 支持多個 API 版本,每一個版本都在不一樣的 API 路徑下,例如 /api/v1 或者 /apis/extensions/v1beta1web

更多關於API的介紹api

Kubernetes 對象

Kubernetes對象是會進行持久化的,一旦建立對象,Kubernetes 系統將持續工做以確保對象存在。經過建立對象,能夠有效地告知 Kubernetes 系統,所須要的集羣工做負載看起來是什麼樣子的,這就是 Kubernetes 集羣的 指望狀態。Kubernetes 對象包含以下信息:bash

  • 應用運行的容器是咋樣的,容器運行在哪一個 Node 上
  • 能夠被應用使用的資源有多少
  • 關於應用如何表現的策略:好比重啓策略、升級策略,以及容錯策略

對Kubernetes 對象的操做包括:建立、修改、刪除、升級等,這些都須要使用Kubernetes API 進行操做。微信

每一個 Kubernetes 對象包含兩個嵌套的對象字段,它們負責管理對象的配置:對象 spec 和 對象 status。spec 必須提供,它描述了對象的 指望狀態 —— 但願對象所具備的特徵。status 描述了對象的 實際狀態,它是由 Kubernetes 系統提供和更新。在任什麼時候刻,Kubernetes 控制平面一直處於活躍狀態,管理着對象的實際狀態以與咱們所指望的狀態相匹配。app

更多關於Kubernetes 對象的介紹工具

Kubernetes CRD自定義資源

CRD存在於全部namespace下ui

CustomResourceDefinition(CRD)是v1.7+新增的無需改變代碼就能夠擴展Kubernetes API的機制,用來管理自定義對象。

在Kubernetes中一切均可視爲資源,系統提供了不少默認資源類型,如 Pod、Deployment、Service、Volume等一系列資源,一種資源就是Kubernetes API中的一個端點,它存儲着某種API 對象的集合,自定義資源是對Kubernetes API的擴展,在一個運行中的集羣內,自定義資源能夠經過動態註冊出現和消失,集羣管理員能夠獨立於集羣自己更新自定義資源。

自定義資源自己能夠進行簡單地存儲和索取結構化數據,可是隻有和控制器結合後才能成爲一種真正的declarative API(聲明式API), 控制器將結構化數據解釋爲用戶所指望狀態的記錄,而且不斷地採起行動來實現和維持該狀態。定製化控制器是用戶能夠在運行中的集羣內部署和更新的一個控制器,它獨立於集羣自己的生命週期。 定製化控制器能夠和任何一種資源一塊兒工做,當和定製化資源結合使用時尤爲有效。

CustomResourceDefinition (CRD)是一個內建的API, 它提供了一個簡單的方式來建立自定義資源。

CRD建立流程

當建立一個新的自定義資源定義(CRD)時,Kubernetes API Server 經過建立一個新的RESTful資源路徑進行應答

1,定義和建立自定義資源kind: CustomResourceDefinition CRD

以下,首先須要先定義和建立一個自定義資源kind: CustomResourceDefinition,指定API Group的名稱如group: networking.istio.io

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  annotations:
    helm.sh/hook: crd-install
  creationTimestamp: 2018-10-15T10:06:40Z
  generation: 1
  labels:
    app: istio-pilot
  name: virtualservices.networking.istio.io
  resourceVersion: "226955722"
  selfLink: /apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/virtualservices.networking.istio.io
  uid: 02eb8d88-d062-11e8-a4b4-005056b84e17
spec:
  group: networking.istio.io
  names:
    kind: VirtualService
    listKind: VirtualServiceList
    plural: virtualservices
    singular: virtualservice
  scope: Namespaced
  version: v1alpha3
status:
  acceptedNames:
    kind: VirtualService
    listKind: VirtualServiceList
    plural: virtualservices
    singular: virtualservice
  conditions:
  - lastTransitionTime: 2018-10-15T10:06:40Z
    message: no conflicts found
    reason: NoConflicts
    status: "True"
    type: NamesAccepted
  - lastTransitionTime: 2018-10-15T10:06:40Z
    message: the initial names have been accepted
    reason: InitialNamesAccepted
    status: "True"
    type: Established
複製代碼

這樣就建立了一個新的區分命名空間的RESTful API斷點:/apis/networking.istio.io/v1alpha3/namespaces/*/virtualservices/...,而後可使用此端點URL來建立和管理自定義對象,這些對象的kind就是上面建立的CRD中指定的kind: VirtualService對象。

2,建立一個CRD的自定義對象

在CRD對象建立完成以後就建立自定義對象(instances)了,這些自定義對象實例就能夠相似Kubernetes的經常使用對象如Deployment、Service、Pod等同樣進行CURD操做了。 自定義對象能夠包含自定義的字段,這些字段能夠包含任意的JSON,具體的字段要根據對象去定義,主要是spec域。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: wudebao-web
spec:
  hosts:
  - "www.wudebao-web.com"
  gateways:
  - wudebao-web-gateway
  http:
  - match:
    - uri:
        exact: /wudebao
    route:
    - destination:
        port:
          number: 54321
        host: wudebao-web
複製代碼

CRD的經常使用命令操做

查詢全部CRD:

kubectl  get crd |grep istio
複製代碼

參考

使用CRD(CustomResourceDefinitions)擴展Kubernetes API

Accessing Kubernetes CRDs from the client-go package

【"歡迎關注個人微信公衆號:Linux 服務端系統研發,後面會大力經過微信公衆號發送優質文章"】

個人微信公衆號
相關文章
相關標籤/搜索