概述 使用 k8s 相关 sdk 做二次开发时,经常用到 apimachinery、api、client-go 这三个库,一直对他们的职责不是很清楚,网上也没有找到合适的文章做分析,笔者通过研究三个库的源码...,总结他们之间的依赖关系如下: apimachinery 是最基础的库,包括核心的数据结构,比如 Scheme、Group、Version、Kind、Resource,以及排列组合出来的 常用的GVK、...GV、GK、GVR等等,再就是编码、解码等操作 api 库,这个库依赖 apimachinery,提供了k8s的内置资源,以及注册到 Scheme 的接口,这些资源比如:Pod、Service、Deployment...底层通过 http 请求访问k8s 的 api-server,从etcd获取资源信息 高清地址 apimachinery apimachinery提供k8s最核心的数据结构。...:apimachinery -> api -> client-go
继续向deepcopy.go同一个包添加第二个文件: package v1alpha1 import "k8s.io/apimachinery/pkg/runtime" // DeepCopyInto...为此,register.go请在包中添加一个新文件: package v1alpha1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1..." "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) const GroupName.../pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" "github.com/martin-helmich.../pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/wait"
"k8s-demo1/src/lib" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func ListNamespace(g *gin.Context..."k8s-demo1/src/lib" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func ListDeployment(g *gin.Context..."k8s-demo1/src/lib" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func ListService(g *gin.Context..."k8s-demo1/src/lib" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) type Deployment struct { Name..."k8s-demo1/src/lib" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) type Service struct { Name string
从源代码的角度看, codec 相关定义如下 // staging/src/k8s.io/apimachinery/pkg/runtime/interfaces.go type Encoder interface...schema.GroupVersionKind, error) } type Serializer interface { Encoder Decoder } type Codec Serializer // k8s.io/apimachinery...从源代码角度, codec factory 相关定义如下 // k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go type CodecFactory...accepts []runtime.SerializerInfo legacySerializer runtime.Serializer } // staging/src/k8s.io/apimachinery
package v1 pkg/apis/ip/v1/types.go内容如下,该文件包含了资源的数据结构,对应yaml package v1 import ( metav1 "k8s.io/apimachinery.../pkg/apis/meta/v1" ) // +genclient // +genclient:noStatus // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery...:"pod,omitempty"` Node string `json:"node,omitempty"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery...File : types @Software: GoLand */ pkg/apis/ip/v1/register.go package v1 import ( metav1 "k8s.io/apimachinery.../pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema"
/pkg/util/wait.JitterUntil.func1(0xc000292980) /root/gopath/pkg/mod/k8s.io/apimachinery@v0.17.2/pkg/..., 0x1609101, 0xc000102480) /root/gopath/pkg/mod/k8s.io/apimachinery@v0.17.2/pkg/util/wait/wait.go:153...+0x105 k8s.io/apimachinery/pkg/util/wait.Until(0xc000292980, 0x3b9aca00, 0xc000102480) /root/gopath.../pkg/util/wait.JitterUntil.func1(0xc000292980) /root/gopath/pkg/mod/k8s.io/apimachinery@v0.17.2/pkg/...+0x105 k8s.io/apimachinery/pkg/util/wait.Until(0xc000292980, 0x3b9aca00, 0xc000102480) /root/gopath
很多同学应该像我一样,第一次打开 Github 上面 kubernetes 项目源码的时候就被各种仓库搞晕了,kuberentes 组织下有很多个仓库,包括 kubernetes、client-go、api、apimachinery...kubernetes 项目的核心仓库,它包含 kubernetes 控制平面核心组件的源码;client-go 从名字也不难看出是操作 kubernetes API 的 go 语言客户端;api 与 apimachinery...apimachinery 仓库中还有 api、apis 两个包,里面定义了各种复杂的接口与实现,清楚这些复杂接口对于扩展 kubernetes API 大有裨益。...所以,这篇文章就重点关注 api 与 apimachinery 这两个仓库。...实际上,最开始这个仓库只是 kubernetes 核心仓库的一部分,后来 kubernetes API 定义规范被越来越多的其他仓库使用,例如 k8s.io/client-go、k8s.io/apimachinery
从源码的角度来看 kubernetes resource 的 group version kind (即 GVK) 的属性被定义在 staging/src/k8s.io/apimachinery/pkg...TypeMeta 这个类型定义来说,它实现了 runtime.Object 和 schema.ObjectKind 接口 (即实现了接口里定义的方法) // staging/src/k8s.io/apimachinery...interface { GetObjectKind() schema.ObjectKind DeepCopyObject() Object } // staging/src/k8s.io/apimachinery...SetGroupVersionKind(kind GroupVersionKind) GroupVersionKind() GroupVersionKind } // staging/src/k8s.io/apimachinery...obj.APIVersion, obj.Kind = gvk.ToAPIVersionAndKind() } 对于 ObjectMeta,它实现了 meta.Object 接口 // staging/src/k8s.io/apimachinery
package main import ( "context" "fmt" v1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg...import ( "context" "fmt" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/...pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/dynamic...k8s.io/apimachinery/pkg/runtime 包通过在 runtime.DefaultUnstructuredConverter 提供一个非结构化到 JSON 的转换器来简化这个过程。...package main import ( "context" "fmt" "github.com/itchyny/gojq" "k8s.io/apimachinery/pkg/apis
/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) //...(scheme, SchemeGroupVersion) return nil } types.go 代码: package v1alpha1 import ( metav1 "k8s.io/apimachinery.../pkg/apis/meta/v1" ) // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object...omitempty"` Scheme bool `json:"scheme,omitempty"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery...@$KUBE_VERSION; exit 0 RUN mkdir -p $GOPATH/src/k8s.io/{code-generator,apimachinery} RUN cp -R $GOPATH
2.1 使用DeepEqual方法 go import ( "reflect" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"...Object) } 2.2 使用哈希值进行比较 go import ( "crypto/sha256" "encoding/json" "fmt" "k8s.io/apimachinery...hash2, nil } 2.3 使用JSON Patch方法 go import ( jsonpatch "github.com/evanphx/json-patch" "k8s.io/apimachinery...深度复制对象 go import ( "github.com/mohae/deepcopy" "reflect" "k8s.io/apimachinery/pkg/apis/meta...return reflect.DeepEqual(copy1.Object, copy2.Object) } 2.5 自定义比较函数 go Copy code import ( "k8s.io/apimachinery
} 最终test.go如下: package main import ( "fmt" "k8s-demo1/src/lib" v1 "k8s.io/api/apps/v1" "k8s.io/apimachinery.../pkg/fields" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/tools/cache" ) type DepHandler...test.go来一遍: package main import ( "fmt" "k8s-demo1/src/lib" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery.../pkg/fields" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/tools/cache" ) type PodHandler...import ( "fmt" "k8s-demo1/src/lib" v1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery
不同协议的支持定义在 staging/src/k8s.io/apimachinery/pkg/runtime/serializer 包中: 我们以常用的 json 协议格式为例,该协议由 serializer.json.Serializer...结构体负责实现, 在 staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go 中定义,图解其中包含的组件如下: MetaFactory...serializer.json.Serializer 的源码定义如下: // staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go...resource 的 group, version, kind,其 overall 的流程如下: 从源码的角度看 MetaFactory 定义如下: // staging/src/k8s.io/apimachinery
在v1文件夹下创建文件types.go,里面定义了Student对象的具体内容: package v1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta.../v1" ) // +genclient // +genclient:noStatus // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/...name string `json:"name"` school string `json:"school"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery...register.go文件,此文件的作用是通过addKnownTypes方法使得client可以知道Student类型的API对象: package v1 import ( metav1 "k8s.io/apimachinery.../pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s_customize_controller
main.go package main import ( "context" "flag" "fmt" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery...resourcequotas main.go package main import ( "context" "flag" "fmt" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery.../pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io...( "context" "encoding/json" "flag" "fmt" "io/ioutil" v1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery.../pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/yaml" "k8s.io/client-go/kubernetes" "k8s.io/client-go
例如之前我们介绍支持 jason 格式的 serializer.json.Serializer,其核心逻辑如下: newSerializersForScheme() 的源码如下: // k8s.io/apimachinery...用来生成可以支持各种不同数据类型的 serializerType 数组, 然后利用该数组进行封装创建 codc factory,逻辑如下: 方法 newCodecFactory() 的源码如下: // k8s.io/apimachinery...DecoderToVersion()和EncoderForVersion() 方法逻辑如下: codec 相关的源代码创建如下: // k8s.io/apimachinery/pkg/runtime/...versioning.NewDefaultingCodecForScheme(f.scheme, encoder, decoder, encode, decode) } // staging/src/k8s.io/apimachinery
package main import ( "context" "fmt" "time" metav1 "k8s.io/apimachinery/pkg/apis/meta.../v1" "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go...client-go/rest" "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/workqueue" "k8s.io/apimachinery.../pkg/fields" "k8s.io/apimachinery/pkg/watch" corev1 "k8s.io/api/core/v1" ) // Controller 代表管理
image.png] package main import ( "context" "flag" "fmt" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery...( "context" "encoding/json" "flag" "fmt" "io/ioutil" v1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery.../pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/yaml" "k8s.io/client-go/kubernetes" "k8s.io/client-go...import ( "context" "flag" "fmt" v1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery
/pkg/apis/meta/v1""k8s.io/apimachinery/pkg/runtime/schema")func NewJan(app *janv1.Jan) *appv1.Deployment...*/package v1import (corev1 "k8s.io/api/core/v1"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1")// EDIT.../pkg/api/errors""k8s.io/apimachinery/pkg/runtime"utilruntime "k8s.io/apimachinery/pkg/util/runtime""reflect"ctrl...*/package v1import (corev1 "k8s.io/api/core/v1"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1")// EDIT.../pkg/api/errors""k8s.io/apimachinery/pkg/runtime"utilruntime "k8s.io/apimachinery/pkg/util/runtime""reflect"ctrl
领取专属 10元无门槛券
手把手带您无忧上云