- 新建名为elasticweb的文件夹,在里面执行以下命令即可创建名为elas
【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
ticweb的项目,domain为com.bolingcavalry:
go mod init elasticweb
kubebuilder init --domain com.bolingcavalry
- 然后是CRD,执行以下命令即可创建相关资源:
kubebuilder create api \
–group elasticweb \
–version v1 \
–kind ElasticWeb
- 然后用IDE打开整个工程,我这里是goland:
CRD编码
- 打开文件api/v1/elasticweb_types.go,做以下几步改动:
-
修改数据结构ElasticWebSpec,增加前文设计的四个字段;
-
修改数据结构ElasticWebStatus,增加前文设计的一个字段;
-
增加String方法,这样打印日志时方便我们查看,注意RealQPS字段是指针,因此可能为空,需要判空;
- 完整的elasticweb_types.go如下所示:
package v1
import (
“fmt”
metav1 “k8s.io/apimachinery/pkg/apis/meta/v1”
“strconv”
)
// 期望状态
type ElasticWebSpec struct {
// 业务服务对应的镜像,包括名称:tag
Image string json:"image"
// service占用的宿主机端口,外部请求通过此端口访问pod的服务
Port *int32 json:"port"
// 单个pod的QPS上限
SinglePodQPS *int32 json:"singlePodQPS"
// 当前整个业务的总QPS
TotalQPS *int32 json:"totalQPS"
}
// 实际状态,该数据结构中的值都是业务代码计算出来的
type ElasticWebStatus struct {
// 当前kubernetes中实际支持的总QPS
RealQPS *int32 json:"realQPS"
}
// +kubebuilder:object:root=true
// ElasticWeb is the Schema for the elasticwebs API
type ElasticWeb struct {
metav1.TypeMeta json:",inline"
metav1.ObjectMeta json:"metadata,omitempty"
Spec ElasticWebSpec json:"spec,omitempty"
Status ElasticWebStatus json:"status,omitempty"
}
func (in *ElasticWeb) String() string {
var realQPS string
if nil == in.Status.RealQPS {
realQPS = “nil”
} else {
realQPS = strconv.Itoa(int(*(in.Status.RealQPS)))
}
return fmt.Sprintf(“Image [%s], Port [%d], SinglePodQPS [%d], TotalQPS [%d]