Operator SDK从K8s集群获取实例的新手技术疑问
Kubernetes & Operator SDK 新手疑问解答
问题1
针对代码片段:
memcached := &cachev1alpha1.Memcached{} err := r.Get(ctx, req.NamespacedName, memcached)
是否是先创建Memcached结构体的空对象,再从Kubernetes集群获取对应实例?
解答:
是的,这段代码的逻辑完全符合你的理解:
- 首先通过
&cachev1alpha1.Memcached{}创建一个空的Memcached结构体指针实例,此时结构体所有字段都是对应类型的零值。 - 随后调用
r.Get()方法,传入上下文、资源的命名空间+名称,以及这个空对象指针,Kubernetes客户端会从集群中查找对应的Memcached自定义资源实例,并将实际数据填充到这个空对象里。 - 如果集群中不存在该资源、权限不足或其他异常,
err会返回非空值,需要在代码中做错误处理。
问题2
看到另一示例代码:
startTime := scaler.spec.start endTime := scaler.spec.end Replicas := scaler.spec.replicas
其中scaler是包含start、end、replicas成员的结构体实例,若scaler是通过类似上述方式获取的空实例,为何start、end、replicas会有默认值(如0、1或空字符串)?
解答:
这主要来自两个层面的机制:
- Go语言的零值特性:Go语言中,创建空结构体实例时,每个字段会被自动赋予对应类型的零值:
- 数值类型(int、float等)零值为
0 - 字符串类型零值为空字符串
"" - 布尔类型零值为
false - 指针、切片等引用类型零值为
nil
所以哪怕是刚创建的空结构体,字段也会有对应的零值。
- 数值类型(int、float等)零值为
- Kubernetes CRD的默认值机制:如果你的自定义资源定义(CRD)中为
spec.start、spec.end、spec.replicas这些字段声明了默认值,用户创建资源时未指定这些字段的话,Kubernetes API Server会自动把默认值填充到资源对象中。此时通过r.Get()获取到的实例,这些字段就会带有CRD定义的默认值(比如你提到的1)。
内容的提问来源于stack exchange,提问作者PRANAV SHARMA
相关产品推荐
相关产品推荐

