# 使用CRD擴展Kubernetes API
本文是如何創建 CRD 來擴展 Kubernetes API 的教程。CRD 是用來擴展 Kubernetes 最常用的方式,在 Service Mesh 和 Operator 中也被大量使用。因此讀者如果想在 Kubernetes 上做擴展和開發的話,是十分有必要了解 CRD 的。
在閱讀本文前您需要先了解[使用自定義資源擴展 API](custom-resource.md), 以下內容譯自 [Kubernetes 官方文檔](https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/),有刪改,推薦閱讀[如何從零開始編寫一個 Kubernetes CRD](http://www.servicemesher.com/blog/kubernetes-crd-quick-start/)。
## 創建 CRD(CustomResourceDefinition)
創建新的 CustomResourceDefinition(CRD)時,Kubernetes API Server 會為您指定的每個版本創建新的 RESTful 資源路徑。CRD 可以是命名空間的,也可以是集群范圍的,可以在 CRD `scope` 字段中所指定。與現有的內置對象一樣,刪除命名空間會刪除該命名空間中的所有自定義對象。CustomResourceDefinition 本身是非命名空間的,可供所有命名空間使用。
參考下面的 CRD,將其配置保存在 `resourcedefinition.yaml` 文件中:
```yaml
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
# 名稱必須符合下面的格式:<plural>.<group>
name: crontabs.stable.example.com
spec:
# REST API使用的組名稱:/apis/<group>/<version>
group: stable.example.com
# REST API使用的版本號:/apis/<group>/<version>
version: v1
# Namespaced或Cluster
scope: Namespaced
names:
# URL中使用的復數名稱: /apis/<group>/<version>/<plural>
plural: crontabs
# CLI中使用的單數名稱
singular: crontab
# CamelCased格式的單數類型。在清單文件中使用
kind: CronTab
# CLI中使用的資源簡稱
shortNames:
- ct
```
創建該 CRD:
```bash
kubectl create -f resourcedefinition.yaml
```
訪問 RESTful API 端點如 <http://172.20.0.113:8080> 將看到如下 API 端點已創建:
```bash
/apis/stable.example.com/v1/namespaces/*/crontabs/...
```
然后,此端點 URL 可用于創建和管理自定義對象。上面的 CRD 中定義的類型就是 `CronTab`。
可能需要幾秒鐘才能創建端點。您可以監控 CustomResourceDefinition 中 `Established` 的狀態何時為 true,或者查看 API 資源的發現信息中是否顯示了您的資源。
## 創建自定義對象
創建 CustomResourceDefinition 對象后,您可以創建自定義對象。自定義對象可包含自定義字段。這些字段可以包含任意 JSON。在以下示例中, `cronSpec` 和 `image` 自定義字段在自定義對象中設置 `CronTab`。`CronTab` 類型來自您在上面創建的 CustomResourceDefinition 對象的規范。
如果您將以下 YAML 保存到`my-crontab.yaml`:
```yaml
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
name: my-new-cron-object
spec:
cronSpec: "* * * * */5"
image: my-awesome-cron-image
```
并創建它:
```bash
kubectl create -f my-crontab.yaml
```
然后,您可以使用 kubectl 管理 CronTab 對象。例如:
```bash
kubectl get crontab
```
應該打印這樣的列表:
```bash
NAME AGE
my-new-cron-object 6s
```
使用 kubectl 時,資源名稱不區分大小寫,您可以使用 CRD 中定義的單數或復數形式,以及任何短名稱。
您還可以查看原始 YAML 數據:
```bash
kubectl get ct -o yaml
```
您應該看到它的 yaml 中的自定義 `cronSpec` 和 `image` 字段:
```yaml
apiVersion: v1
items:
- apiVersion: stable.example.com/v1
kind: CronTab
metadata:
clusterName: ""
creationTimestamp: 2017-05-31T12:56:35Z
deletionGracePeriodSeconds: null
deletionTimestamp: null
name: my-new-cron-object
namespace: default
resourceVersion: "285"
selfLink: /apis/stable.example.com/v1/namespaces/default/crontabs/my-new-cron-object
uid: 9423255b-4600-11e7-af6a-28d2447dc82b
spec:
cronSpec: '* * * * */5'
image: my-awesome-cron-image
kind: List
metadata:
resourceVersion: ""
selfLink: ""
```
## 刪除 CustomResourceDefinition
刪除 CustomResourceDefinition 時,服務器將刪除 RESTful API 端點并**刪除存儲在其中的所有自定義對象**。
```bash
kubectl delete -f resourcedefinition.yaml
kubectl get crontabs
Error from server (NotFound): Unable to list "crontabs": the server could not find the requested resource (get crontabs.stable.example.com)
```
如果稍后重新創建相同的 CustomResourceDefinition,它將從空開始。
## 提供 CRD 的多個版本
有關提供 CustomResourceDefinition 的多個版本以及將對象從一個版本遷移到另一個[版本](https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definition-versioning/)的詳細信息,請參閱[自定義資源定義版本控制](https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definition-versioning/)。
## 高級主題
### Finalizer(終結器)
*Finalizer(終結器)*允許控制器實現異步預刪除 hook。自定義對象支持終結器,就像內置對象一樣。
您可以將終結器添加到自定義對象,如下所示:
```yaml
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
finalizers:
- finalizer.stable.example.com
```
終結器是任意字符串值,當存在時確保在資源存在時不可能進行硬刪除。
對具有終結器的對象的第一個刪除請求設置該`metadata.deletionTimestamp`字段的值, 但不刪除它。設置此值后,`finalizer` 只能刪除列表中的條目。
如果設置了 `metadata.deletionTimestamp` 字段,控制器監控對象將執行它們所有的終結器,對該對象輪詢更新請求。執行完所有終結器后,將刪除該資源。
值`metadata.deletionGracePeriodSeconds`控制輪詢更新之間的間隔。
每個控制器都有責任從列表中刪除其終結器。
如果終結器列表為空,Kubernetes 最終只會刪除該對象,這意味著所有終結器都已執行。
### Validation(驗證)
**功能狀態:** `Kubernetes v1.12` [beta](https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#)
可以通過 [OpenAPI v3 schema](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#schemaObject)驗證自定義對象是否符合標準 。此外,以下限制適用于 schema:
- 字段`default`、`nullable`、`discriminator`、`readOnly`、`writeOnly`、`xml`、 `deprecated` 和 `$ref` 不能設置。
- 該字段 `uniqueItems` 不能設置為 true。
- 該字段 `additionalProperties` 不能設置為 false。
您可以使用 [kube-apiserver](https://kubernetes.io/docs/admin/kube-apiserver)`CustomResourceValidation` 上的功能門(feature gate)禁用此功能:
```
--feature-gates=CustomResourceValidation=false
```
該 schema 在 CustomResourceDefinition 中定義。在以下示例中,CustomResourceDefinition 對自定義對象應用以下驗證:
- `spec.cronSpec` 必須是字符串,并且必須是正則表達式描述的形式。
- `spec.replicas` 必須是整數,且最小值必須為 1,最大值為 10。
將 CustomResourceDefinition 保存到 `resourcedefinition.yaml`:
```yaml
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
version: v1
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
validation:
# openAPIV3Schema 適用于驗證自定義對象的 schema。
openAPIV3Schema:
properties:
spec:
properties:
cronSpec:
type: string
pattern: '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$'
replicas:
type: integer
minimum: 1
maximum: 10
```
并創建它:
```bash
kubectl create -f resourcedefinition.yaml
```
`CronTab` 如果其字段中存在無效值,則將拒絕創建類型的自定義對象的請求。在以下示例中,自定義對象包含具有無效值的字段:
- `spec.cronSpec` 與正則表達式不匹配。
- `spec.replicas` 大于10。
如果您將以下YAML保存到`my-crontab.yaml`:
```yaml
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
name: my-new-cron-object
spec:
cronSpec: "* * * *"
image: my-awesome-cron-image
replicas: 15
```
并創建它:
```bash
kubectl create -f my-crontab.yaml
```
你會收到一個錯誤:
```bash
The CronTab "my-new-cron-object" is invalid: []: Invalid value: map[string]interface {}{"apiVersion":"stable.example.com/v1", "kind":"CronTab", "metadata":map[string]interface {}{"name":"my-new-cron-object", "namespace":"default", "deletionTimestamp":interface {}(nil), "deletionGracePeriodSeconds":(*int64)(nil), "creationTimestamp":"2017-09-05T05:20:07Z", "uid":"e14d79e7-91f9-11e7-a598-f0761cb232d1", "selfLink":"", "clusterName":""}, "spec":map[string]interface {}{"cronSpec":"* * * *", "image":"my-awesome-cron-image", "replicas":15}}:
validation failure list:
spec.cronSpec in body should match '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$'
spec.replicas in body should be less than or equal to 10
```
如果字段包含有效值,則接受對象創建請求。
將以下 YAML 保存到 `my-crontab.yaml`:
```yaml
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
name: my-new-cron-object
spec:
cronSpec: "* * * * */5"
image: my-awesome-cron-image
replicas: 5
```
并創建它:
```bash
kubectl create -f my-crontab.yaml
crontab "my-new-cron-object" created
```
### 其他打印列
從 Kubernetes 1.11 開始,kubectl 使用服務器端打印。服務器決定 `kubectl get` 命令顯示哪些列。您可以使用 CustomResourceDefinition 自定義這些列。下面的示例將輸出 `Spec`、`Replicas` 和 `Age` 列。
1. 將 CustomResourceDefinition保存到 `resourcedefinition.yaml`。
```yaml
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
version: v1
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
additionalPrinterColumns:
- name: Spec
type: string
description: The cron spec defining the interval a CronJob is run
JSONPath: .spec.cronSpec
- name: Replicas
type: integer
description: The number of jobs launched by the CronJob
JSONPath: .spec.replicas
- name: Age
type: date
JSONPath: .metadata.creationTimestamp
```
2. 創建 CustomResourceDefinition:
```bash
kubectl create -f resourcedefinition.yaml
```
3. 使用上一節中的創建的 `my-crontab.yaml` 實例。
4. 調用服務器端打印:
```bash
kubectl get crontab my-new-cron-object
```
請注意 `NAME`、`SPEC`、`REPLICAS` 和 `AGE` 在輸出列:
```bash
NAME SPEC REPLICAS AGE
my-new-cron-object * * * * * 1 7s
```
`NAME` 列是隱含的,不需要在 CustomResourceDefinition 中定義。
#### Priority(優先級)
每列中都包含一個 `priority` 字段。目前,優先級區分標準視圖或 wide 視圖中顯示的列(使用 `-o wide` 標志)。
- 具有優先級的列 `0` 顯示在標準視圖中。
- 優先級大于 `0` 的列僅在 wide 視圖中顯示。
#### Type(類型)
列中的 `type` 字段可以是以下任何一種(參考 [OpenAPI v3 數據類型](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#dataTypes)):
- `integer` - 非浮點數
- `number` - 浮點數
- `string` - 字符串
- `boolean` - ture 或 false
- `date` - 自此時間戳以來的時間差異呈現
如果 CustomResource 中的值與為列指定的類型不匹配,則省略該值。使用 CustomResource 驗證以確保值類型正確。
#### Format(格式)
列中的 `format` 字段可以是以下任何一個:
- `int32`
- `int64`
- `float`
- `double`
- `byte`
- `date`
- `date-time`
- `password`
該列 `format` 控制 `kubectl` 打印值時使用的樣式。
### 子資源
**功能狀態:** `Kubernetes v1.12` [beta](https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#)
自定義資源支持 `/status` 和 `/scale` 子資源。
您可以使用 [kube-apiserver](https://kubernetes.io/docs/admin/kube-apiserver) `CustomResourceSubresources` 上的功能門(feature gate)禁用此功能:
```bash
--feature-gates=CustomResourceSubresources=false
```
可以通過在 CustomResourceDefinition 中定義它們來選擇性地啟用 status 和 scale 子資源。
#### 狀態子資源
啟用狀態子資源后,將公開自定義資源的子資源 `/status`。
- 狀態和規范節分別由自定義資源內的 JSONPath `.status` 和 `.spec`JSONPath 表示。
- `PUT``/status` 對子資源的請求采用自定義資源對象,并忽略除狀態節之外的任何更改。
- `PUT``/status` 對子資源的請求僅驗證自定義資源的狀態節。
- `PUT`/ `POST`/ `PATCH` 請求自定義資源忽略更改狀態節。
- 對 spec 節的任何更改都會增加 `.metadata.generation` 的值。
- 在 CRD OpenAPI 驗證模式的根目錄中只允許以下構造:
- - Description
- Example
- ExclusiveMaximum
- ExclusiveMinimum
- ExternalDocs
- Format
- Items
- Maximum
- MaxItems
- MaxLength
- Minimum
- MinItems
- MinLength
- MultipleOf
- Pattern
- Properties
- Required
- Title
- Type
- UniqueItems
#### 擴展子資源
啟用 scale 子資源后,將公開自定義資源的子資源 `/scale`。該 `autoscaling/v1.Scale` 對象作為有效負載發送 `/scale`。
要啟用 scale 子資源,CustomResourceDefinition 中需要定義以下值。
- `SpecReplicasPath` 在與之對應的自定義資源中定義 JSONPath `Scale.Spec.Replicas`。
- 這是一個必需的值。
- `.spec` 只允許使用帶點符號的 JSONPaths 。
- 如果 `SpecReplicasPath` 自定義資源中沒有值,則 `/scale` 子資源將在GET上返回錯誤。
- `StatusReplicasPath` 在與之對應的自定義資源中定義 JSONPath `Scale.Status.Replicas`。
- 這是一個必需的值。
- `.stutus` 只允許使用帶點符號的 JSONPaths 。
- 如果 `StatusReplicasPath` 自定義資源中沒有值,則子資源 `/scale` 中的狀態副本值將默認為 0。
- `LabelSelectorPath `在與之對應的自定義資源中定義 JSONPath `Scale.Status.Selector`。
- 這是一個可選值。
- 必須將其設置為與 HPA 一起使用。
- `.status` 只允許使用帶點符號的 JSONPaths 。
- 如果 `LabelSelectorPath` 自定義資源中沒有值,則子資源 `/scale` 中的狀態選擇器值將默認為空字符串。
在以下示例中,啟用了status 和 scale 子資源。
將 CustomResourceDefinition 保存到`resourcedefinition.yaml`:
```yaml
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
# subresources describes the subresources for custom resources.
subresources:
# status enables the status subresource.
status: {}
# scale enables the scale subresource.
scale:
# specReplicasPath defines the JSONPath inside of a custom resource that corresponds to Scale.Spec.Replicas.
specReplicasPath: .spec.replicas
# statusReplicasPath defines the JSONPath inside of a custom resource that corresponds to Scale.Status.Replicas.
statusReplicasPath: .status.replicas
# labelSelectorPath defines the JSONPath inside of a custom resource that corresponds to Scale.Status.Selector.
labelSelectorPath: .status.labelSelector
```
并創建它:
```bash
kubectl create -f resourcedefinition.yaml
```
創建 CustomResourceDefinition 對象后,您可以創建自定義對象。
如果您將以下 YAML 保存到 `my-crontab.yaml`:
```yaml
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
name: my-new-cron-object
spec:
cronSpec: "* * * * */5"
image: my-awesome-cron-image
replicas: 3
```
并創建它:
```bash
kubectl create -f my-crontab.yaml
```
然后在以下位置創建新的命名空間 RESTful API 端點:
```bash
/apis/stable.example.com/v1/namespaces/*/crontabs/status
```
和
```bash
/apis/stable.example.com/v1/namespaces/*/crontabs/scale
```
可以使用該 `kubectl scale` 命令縮放自定義資源。例如,以上創建的自定義資源的的 `.spec.replicas` 設置為 5:
```bash
kubectl scale --replicas=5 crontabs/my-new-cron-object
crontabs "my-new-cron-object" scaled
kubectl get crontabs my-new-cron-object -o jsonpath='{.spec.replicas}'
5
```
### Category(分類)
類別是自定義資源所屬的分組資源的列表(例如 `all`)。您可以使用 `kubectl get <category-name>` 列出屬于該類別的資源。此功能是 **beta**,可用于 v1.10 中的自定義資源。
以下示例添加 `all` CustomResourceDefinition 中的類別列表,并說明如何使用 `kubectl get all` 輸出自定義資源 。
將以下 CustomResourceDefinition 保存到 `resourcedefinition.yaml`:
```yaml
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
# categories is a list of grouped resources the custom resource belongs to.
categories:
- all
```
并創建它:
```bash
kubectl create -f resourcedefinition.yaml
```
創建 CustomResourceDefinition 對象后,您可以創建自定義對象。
將以下 YAML 保存到 `my-crontab.yaml`:
```yaml
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
name: my-new-cron-object
spec:
cronSpec: "* * * * */5"
image: my-awesome-cron-image
```
并創建它:
```bash
kubectl create -f my-crontab.yaml
```
您可以使用`kubectl get`以下方式指定類別:
```bash
kubectl get all
```
它將包括種類的自定義資源`CronTab`:
```bash
NAME AGE
crontabs/my-new-cron-object 3s
```
## 參考
- [Extend the Kubernetes API with CustomResourceDefinitions - kubernetes.io](https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/)
- [如何從零開始編寫一個Kubernetes CRD - servicemesher.com](http://www.servicemesher.com/blog/kubernetes-crd-quick-start/)
- 序言
- 云原生
- 云原生(Cloud Native)的定義
- CNCF - 云原生計算基金會簡介
- CNCF章程
- 云原生的設計哲學
- Play with Kubernetes
- 快速部署一個云原生本地實驗環境
- Kubernetes與云原生應用概覽
- 云原生應用之路——從Kubernetes到Cloud Native
- 云原生編程語言
- 云原生編程語言Ballerina
- 云原生編程語言Pulumi
- 云原生的未來
- Kubernetes架構
- 設計理念
- Etcd解析
- 開放接口
- CRI - Container Runtime Interface(容器運行時接口)
- CNI - Container Network Interface(容器網絡接口)
- CSI - Container Storage Interface(容器存儲接口)
- Kubernetes中的網絡
- Kubernetes中的網絡解析——以flannel為例
- Kubernetes中的網絡解析——以calico為例
- 具備API感知的網絡和安全性管理開源軟件Cilium
- Cilium架構設計與概念解析
- 資源對象與基本概念解析
- Pod狀態與生命周期管理
- Pod概覽
- Pod解析
- Init容器
- Pause容器
- Pod安全策略
- Pod的生命周期
- Pod Hook
- Pod Preset
- Pod中斷與PDB(Pod中斷預算)
- 集群資源管理
- Node
- Namespace
- Label
- Annotation
- Taint和Toleration(污點和容忍)
- 垃圾收集
- 控制器
- Deployment
- StatefulSet
- DaemonSet
- ReplicationController和ReplicaSet
- Job
- CronJob
- Horizontal Pod Autoscaling
- 自定義指標HPA
- 準入控制器(Admission Controller)
- 服務發現
- Service
- Ingress
- Traefik Ingress Controller
- 身份與權限控制
- ServiceAccount
- RBAC——基于角色的訪問控制
- NetworkPolicy
- 存儲
- Secret
- ConfigMap
- ConfigMap的熱更新
- Volume
- Persistent Volume(持久化卷)
- Storage Class
- 本地持久化存儲
- 集群擴展
- 使用自定義資源擴展API
- 使用CRD擴展Kubernetes API
- Aggregated API Server
- APIService
- Service Catalog
- 資源調度
- QoS(服務質量等級)
- 用戶指南
- 資源對象配置
- 配置Pod的liveness和readiness探針
- 配置Pod的Service Account
- Secret配置
- 管理namespace中的資源配額
- 命令使用
- Docker用戶過度到kubectl命令行指南
- kubectl命令概覽
- kubectl命令技巧大全
- 使用etcdctl訪問kubernetes數據
- 集群安全性管理
- 管理集群中的TLS
- kubelet的認證授權
- TLS bootstrap
- 創建用戶認證授權的kubeconfig文件
- IP偽裝代理
- 使用kubeconfig或token進行用戶身份認證
- Kubernetes中的用戶與身份認證授權
- Kubernetes集群安全性配置最佳實踐
- 訪問Kubernetes集群
- 訪問集群
- 使用kubeconfig文件配置跨集群認證
- 通過端口轉發訪問集群中的應用程序
- 使用service訪問群集中的應用程序
- 從外部訪問Kubernetes中的Pod
- Cabin - Kubernetes手機客戶端
- Kubernetic - Kubernetes桌面客戶端
- Kubernator - 更底層的Kubernetes UI
- 在Kubernetes中開發部署應用
- 適用于kubernetes的應用開發部署流程
- 遷移傳統應用到Kubernetes中——以Hadoop YARN為例
- 最佳實踐概覽
- 在CentOS上部署Kubernetes集群
- 創建TLS證書和秘鑰
- 創建kubeconfig文件
- 創建高可用etcd集群
- 安裝kubectl命令行工具
- 部署master節點
- 安裝flannel網絡插件
- 部署node節點
- 安裝kubedns插件
- 安裝dashboard插件
- 安裝heapster插件
- 安裝EFK插件
- 生產級的Kubernetes簡化管理工具kubeadm
- 使用kubeadm在Ubuntu Server 16.04上快速構建測試集群
- 服務發現與負載均衡
- 安裝Traefik ingress
- 分布式負載測試
- 網絡和集群性能測試
- 邊緣節點配置
- 安裝Nginx ingress
- 安裝配置DNS
- 安裝配置Kube-dns
- 安裝配置CoreDNS
- 運維管理
- Master節點高可用
- 服務滾動升級
- 應用日志收集
- 配置最佳實踐
- 集群及應用監控
- 數據持久化問題
- 管理容器的計算資源
- 集群聯邦
- 存儲管理
- GlusterFS
- 使用GlusterFS做持久化存儲
- 使用Heketi作為Kubernetes的持久存儲GlusterFS的external provisioner
- 在OpenShift中使用GlusterFS做持久化存儲
- GlusterD-2.0
- Ceph
- 用Helm托管安裝Ceph集群并提供后端存儲
- 使用Ceph做持久化存儲
- 使用rbd-provisioner提供rbd持久化存儲
- OpenEBS
- 使用OpenEBS做持久化存儲
- Rook
- NFS
- 利用NFS動態提供Kubernetes后端存儲卷
- 集群與應用監控
- Heapster
- 使用Heapster獲取集群和對象的metric數據
- Prometheus
- 使用Prometheus監控kubernetes集群
- Prometheus查詢語言PromQL使用說明
- 使用Vistio監控Istio服務網格中的流量
- 分布式跟蹤
- OpenTracing
- 服務編排管理
- 使用Helm管理Kubernetes應用
- 構建私有Chart倉庫
- 持續集成與發布
- 使用Jenkins進行持續集成與發布
- 使用Drone進行持續集成與發布
- 更新與升級
- 手動升級Kubernetes集群
- 升級dashboard
- 領域應用概覽
- 微服務架構
- 微服務中的服務發現
- 使用Java構建微服務并發布到Kubernetes平臺
- Spring Boot快速開始指南
- Service Mesh 服務網格
- 企業級服務網格架構
- Service Mesh基礎
- Service Mesh技術對比
- 采納和演進
- 定制和集成
- 總結
- Istio
- 安裝并試用Istio service mesh
- 配置請求的路由規則
- 安裝和拓展Istio service mesh
- 集成虛擬機
- Istio中sidecar的注入規范及示例
- 如何參與Istio社區及注意事項
- Istio教程
- Istio免費學習資源匯總
- 深入理解Istio Service Mesh中的Envoy Sidecar注入與流量劫持
- 深入理解Istio Service Mesh中的Envoy Sidecar代理的路由轉發
- Linkerd
- Linkerd 使用指南
- Conduit
- Condiut概覽
- 安裝Conduit
- Envoy
- Envoy的架構與基本術語
- Envoy作為前端代理
- Envoy mesh教程
- SOFAMesh
- SOFAMesh中的Dubbo on x-protocol
- SOFAMosn
- 使用 SOFAMosn 構建 SOFAMesh
- 大數據
- Spark standalone on Kubernetes
- 運行支持Kubernetes原生調度的Spark程序
- Serverless架構
- 理解Serverless
- FaaS-函數即服務
- OpenFaaS快速入門指南
- 邊緣計算
- 人工智能