Kubernetes源码二次开发
Kubernetes 源码二次开发通常涉及以下步骤:
环境准备:安装和配置 Go 环境,确保 Go 版本与 Kubernetes 项目兼容。
获取源码:从 GitHub 克隆 Kubernetes 仓库到本地。
设置工作环境:通过 make 命令设置编译环境。
修改源码:根据需求修改 Kubernetes 源码。
编译:使用 make all 编译所有组件。
测试:运行测试以确保修改不会破坏现有功能。
构建镜像:如果修改了 Kubernetes 组件的代码,需要重新构建相应的 Docker 镜像。
部署:在本地或者远程集群上部署修改后的 Kubernetes 组件。
以下是一个简单的示例,展示如何修改 Kubernetes Scheduler 的默认行为:
package main
import (
"k8s.io/api/core/v1"
"k8s.io/klog"
"k8s.io/kubernetes/cmd/kube-scheduler/app"
)
// 修改默认的调度策略
func myDefaultPodDisruptionBudgets() {
// 实现自定义的策略...
}
func main() {
// 复制 kube-scheduler 的启动逻辑
command := app.NewSchedulerCommand()
// 在这里插入自定义的调度策略设置逻辑
myDefaultPodDisruptionBudgets()
// 运行 kube-scheduler
if err := command.Execute(); err != nil {
klog.Fatalf("Error running kube-scheduler: %v", err)
}
}
【kubernetes】kubernetes二次开发
kubernetes本身对很多场景已经能够达到直接使用,但是kubernetes也提供了能够扩展的能力,可以基于kubernetes进行二次开发。
扩展kubernetes
1 kubectl
用插件扩展 kubectl
kubectl作为k8s的客户端,它所展示的信息是固定的,有时候我们可能也需要扩展kubectl,例如,在使用网络双栈的情况下,如果直接使用kubectl只展示ipv6,需要可以同时展示ipv4和ipv6,就需要对kubectl进行扩展。
kubectl扩展的主要规则:
kubectl扩展程序是一个在$PATH中的可执行的二进制,因此,你可以用任何语言开发插件
文件名以kubectl-开头,并且命令的字段之间用-分割,例如,当开发了一个插件kubectl-show展示pod的双栈地址,使用kubectl show pods时,由于没有kubectl show命令,就会去查找kubectl-show命令,找到后,就会将后面的整个字符串都传给插件程序
如果使用golang开发,已经有提供一些现成的库:
cli-runtime:可以用于开发插件,并且kubectl本身也使用了该库
sample-cli-plugin:插件的简单开发示例,可以切换kubeconfig文件中指定的namespace
2 apiserver
client-go:k8s的官方开发库,可以直接调用k8s的接口,常用于开发k8s的管理平台
3 Controller
virtual-kubelet:虚拟kubelet,可以伪装成kubelet,常用于实现Serverless、edge IOT等
cloud-provider(Cloud Controller Manager):云端负载均衡器
4 operator(CRD & Controller)
CRD & Controller:定义用户自己的资源,然后基于client-go开发自己的Controller控制自己资源的运行
5 network(CNI)
Flannel
Calico
6 store(CSI)
PV和PVC是K8S提供的让资源的提供方和资源的使用方分离的一种机制,资源提供方负责创建PV,资源使用方只需要说明申请的资源规格就能够自动创建相应规格的PV,因此,需要有程序负责自动创建PV。为了将自有的资源对接K8S,K8S提供了CSI,能够进行存储的对接。