当前位置:网站首页>基於Kubebuilder開發Operator(入門使用)
基於Kubebuilder開發Operator(入門使用)
2022-06-26 16:13:00 【chenxy02】
原文地址:使用kubebuilder 理解k8s crd - 知乎

理解k8s的crd需要先理解k8s的controller模式
- 比如kube-controller-manager中的deployment控制器,在初始化的時候就會傳入要監聽Deployments、ReplicaSet和pod的三個informer對象
- 首先list一下對象到本地緩存,同時watch對象的變更,等於增量更新
func startDeploymentController(ctx ControllerContext) (controller.Interface, bool, error) {
dc, err := deployment.NewDeploymentController(
ctx.InformerFactory.Apps().V1().Deployments(),
ctx.InformerFactory.Apps().V1().ReplicaSets(),
ctx.InformerFactory.Core().V1().Pods(),
ctx.ClientBuilder.ClientOrDie("deployment-controller"),
)
if err != nil {
return nil, true, fmt.Errorf("error creating Deployment controller: %v", err)
}
go dc.Run(int(ctx.ComponentConfig.DeploymentController.ConcurrentDeploymentSyncs), ctx.Stop)
return nil, true, nil
}- 然後內部會做sync其實就是Reconcile loop, 即調諧循環——說白了就是對比對象的actualState和expectState的差异,執行對應的增删操作 比如deployment中擴縮容操作
- 計算差值,可以創建出的 pod 數减去所有活躍 rs的副本數之和
- 如果差值為正,說明需要擴容,並且從ReplicaSetsBySizeNewer排序看是按照從新到舊擴容
- 如果差值為負,說明需要縮容,並且從ReplicaSetsBySizeOlder排序看是按照從舊到新縮容
算差值如下
deploymentReplicasToAdd := allowedSize - allRSsReplicas
var scalingOperation string
switch {
case deploymentReplicasToAdd > 0:
sort.Sort(controller.ReplicaSetsBySizeNewer(allRSs))
scalingOperation = "up"
case deploymentReplicasToAdd < 0:
sort.Sort(controller.ReplicaSetsBySizeOlder(allRSs))
scalingOperation = "down"
}理解了k8s的controller模式後,crd就是你自己寫的controller
- 監聽並處理你自己定義的資源,
- 下面這張圖很形象

安裝 Kubebuilder
wget https://github.com/kubernetes-sigs/kubebuilder/releases/download/v3.1.0/kubebuilder_linux_amd64
mv kubebuilder_linux_amd64 /usr/local/bin/kubebuilder創建脚手架工程
- 創建一個目錄,並且指定這個目錄為代碼倉庫
mkdir -p ~/projects/guestbook
cd ~/projects/guestbook
kubebuilder init --domain my.domain --repo my.domain/guestbook- 查看這個目錄下的文件結果
[[email protected] guestbook]# tree
.
├── config
│ ├── default
│ │ ├── kustomization.yaml
│ │ ├── manager_auth_proxy_patch.yaml
│ │ └── manager_config_patch.yaml
│ ├── manager
│ │ ├── controller_manager_config.yaml
│ │ ├── kustomization.yaml
│ │ └── manager.yaml
│ ├── prometheus
│ │ ├── kustomization.yaml
│ │ └── monitor.yaml
│ └── rbac
│ ├── auth_proxy_client_clusterrole.yaml
│ ├── auth_proxy_role_binding.yaml
│ ├── auth_proxy_role.yaml
│ ├── auth_proxy_service.yaml
│ ├── kustomization.yaml
│ ├── leader_election_role_binding.yaml
│ ├── leader_election_role.yaml
│ ├── role_binding.yaml
│ └── service_account.yaml
├── Dockerfile
├── go.mod
├── go.sum
├── hack
│ └── boilerplate.go.txt
├── main.go
├── Makefile
└── PROJECT
6 directories, 24 files創建api
- 創建一個名為 webapp/v1的 API (group/version)
- 創建新的類型 Guestbook
kubebuilder create api --group webapp --version v1 --kind Guestbook- 追踪結果,發現又多了很多文件 ,其中api/v1/guestbook_types.go代錶定義API的地方 ,controllers/guestbook_controller.go代錶調諧的邏輯
[[email protected] guestbook]# tree
.
├── api
│ └── v1
│ ├── groupversion_info.go
│ ├── guestbook_types.go
│ └── zz_generated.deepcopy.go
├── bin
│ └── controller-gen
├── config
│ ├── crd
│ │ ├── kustomization.yaml
│ │ ├── kustomizeconfig.yaml
│ │ └── patches
│ │ ├── cainjection_in_guestbooks.yaml
│ │ └── webhook_in_guestbooks.yaml
│ ├── default
│ │ ├── kustomization.yaml
│ │ ├── manager_auth_proxy_patch.yaml
│ │ └── manager_config_patch.yaml
│ ├── manager
│ │ ├── controller_manager_config.yaml
│ │ ├── kustomization.yaml
│ │ └── manager.yaml
│ ├── prometheus
│ │ ├── kustomization.yaml
│ │ └── monitor.yaml
│ ├── rbac
│ │ ├── auth_proxy_client_clusterrole.yaml
│ │ ├── auth_proxy_role_binding.yaml
│ │ ├── auth_proxy_role.yaml
│ │ ├── auth_proxy_service.yaml
│ │ ├── guestbook_editor_role.yaml
│ │ ├── guestbook_viewer_role.yaml
│ │ ├── kustomization.yaml
│ │ ├── leader_election_role_binding.yaml
│ │ ├── leader_election_role.yaml
│ │ ├── role_binding.yaml
│ │ └── service_account.yaml
│ └── samples
│ └── webapp_v1_guestbook.yaml
├── controllers
│ ├── guestbook_controller.go
│ └── suite_test.go
├── Dockerfile
├── go.mod
├── go.sum
├── hack
│ └── boilerplate.go.txt
├── main.go
├── Makefile
└── PROJECT
13 directories, 37 files- 在調諧函數中添加打印日志,比特於 controller/guestbook_controller.go
func (r *GuestbookReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
_ = log.FromContext(ctx)
// your logic here
log.FromContext(ctx).Info("print_req", "req", req.String())
return ctrl.Result{}, nil
}部署到k8s集群中
- 編譯打鏡像
make docker-build IMG=guestbook:v1.0 # 實際執行 docker build -t guestbook:v1.0 .- 一般我們需要修改項目裏的 dockerfile,給 go 設置proxy代理,這樣 go mod download時不至於超時連不上

- 然後需要將鏡像手動推送到本地倉庫中,如果底層的runtime是ctr的話 需要docker save出來並導入
docker save guestbook:v1.0 > a.tar
ctr --namespace k8s.io images import a.tar- 因為項目中用到了 kube-rbac-proxy,這個鏡像也可能出現下載不到的問題,需要自己手動處理一下,如下:

- 現在部署crd
make deploy IMG=guestbook:v1.0 #實際執行 kustomize build config/default | kubectl apply -f -- 檢查在guestbook-system ns 下部署的對象

- 檢查api-resources

- 部署guestbook
kubectl apply -f config/samples/webapp_v1_guestbook.yaml
# guestbook.webapp.my.domain/guestbook-cxy created- 查看crd中的日志可以看到調諧函數中打印

边栏推荐
- SAP OData 开发教程 - 从入门到提高(包含 SEGW, RAP 和 CDP)
- How to separate jar packages and resource files according to packaging?
- Failed to get convolution algorithm. This is probably because cuDNN failed to initialize
- Detailed explanation of cookies and sessions
- What is the difference between stm32f1 and gd32f1?
- Mono 的一些实例方法
- Exquisite makeup has become the "soft power" of camping, and the sales of vipshop outdoor beauty and skin care products have surged
- Oilfield exploration problems
- R语言plotly可视化:plotly可视化归一化的直方图(historgram)并在直方图中添加密度曲线kde、并在直方图的底部边缘使用geom_rug函数添加边缘轴须图
- 今年高考英语AI得分134,复旦武大校友这项研究有点意思
猜你喜欢

How to identify contractual issues

"C language" question set of ⑩

11 introduction to CNN

9 use of tensorboard

100+ data science interview questions and answers Summary - basic knowledge and data analysis

The details of the first pig heart transplantation were fully disclosed: human herpes virus was found in the patient, the weight of the heart doubled after death, and myocardial cell fibrosis

1-12Vmware新增SSH功能

大话领域驱动设计——表示层及其他

1-12vmware adds SSH function

Transformation of zero knowledge QAP problem
随机推荐
Leetcode one week race 298, first three questions
11 introduction to CNN
mha 切换(操作流程建议)
H5 close the current page, including wechat browser (with source code)
Keepalived 实现 Redis AutoFailover (RedisHA)1
NFT contract basic knowledge explanation
今年高考英语AI得分134,复旦武大校友这项研究有点意思
8 user defined evaluation function
[time complexity and space complexity]
Redis顺序排序命令
Ideal path problem
C语言读取数据
[Blue Bridge Cup training 100 questions] scratch distinguishing prime numbers and composite numbers Blue Bridge Cup scratch competition special prediction programming question intensive training simul
Angel 3.2.0 new version released! Figure the computing power is strengthened again
NFT合约基础知识讲解
请指教同花顺软件究竟是什么?网上开户是否安全么?
5000 word analysis: the way of container security attack and defense in actual combat scenarios
Acid of redis
Hyperf框架使用阿里云OSS上传失败
牛客编程题--必刷101之动态规划(一文彻底了解动态规划)