API Aggregation

API Aggregation允许在不修改Kubernetes核心代码的同时扩展Kubernetes API。

开启API Aggregation

kube-apiserver增加以下配置

  1. --requestheader-client-ca-file=<path to aggregator CA cert>
  2. --requestheader-allowed-names=aggregator
  3. --requestheader-extra-headers-prefix=X-Remote-Extra-
  4. --requestheader-group-headers=X-Remote-Group
  5. --requestheader-username-headers=X-Remote-User
  6. --proxy-client-cert-file=<path to aggregator proxy cert>
  7. --proxy-client-key-file=<path to aggregator proxy key>

如果kube-proxy没有在Master上面运行,还需要配置

  1. --enable-aggregator-routing=true

创建扩展API

  1. 确保开启APIService API(默认开启,可用kubectl get apiservice命令验证)
  2. 创建RBAC规则
  3. 创建一个namespace,用来运行扩展的API服务
  4. 创建CA和证书,用于https
  5. 创建一个存储证书的secret
  6. 创建一个部署扩展API服务的deployment,并使用上一步的secret配置证书,开启https服务
  7. 创建一个ClusterRole和ClusterRoleBinding
  8. 创建一个非namespace的apiservice,注意设置spec.caBundle
  9. 运行kubectl get <resource-name>,正常应该返回No resources found.

可以使用apiserver-builder工具自动化上面的步骤。

  1. # 初始化项目
  2. $ cd GOPATH/src/github.com/my-org/my-project
  3. $ apiserver-boot init repo --domain <your-domain>
  4. $ apiserver-boot init glide
  5. # 创建资源
  6. $ apiserver-boot create group version resource --group <group> --version <version> --kind <Kind>
  7. # 编译
  8. $ apiserver-boot build executables
  9. $ apiserver-boot build docs
  10. # 本地运行
  11. $ apiserver-boot run local
  12. # 集群运行
  13. $ apiserver-boot run in-cluster --name nameofservicetorun --namespace default --image gcr.io/myrepo/myimage:mytag
  14. $ kubectl create -f sample/<type>.yaml

示例

sample-apiserverapiserver-builder/example

备注

另外一种扩展 Kubernetes API 的方法是使用 CustomResourceDefinition (CRD)