7、深入了解Kubernetes开发:Time类型、API Machinery与Client-go库

深入了解Kubernetes开发:Time类型、API Machinery与Client-go库

1. Time类型

在Kubernetes资源中,用于声明时间的字段都会使用API Machinery库中定义的 Time 类型。它是Go语言 time.Time 类型的包装,并且提供了围绕 time.Time 工厂函数的工厂方法。

import (
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

以下是可用的工厂方法:
- func NewTime(time time.Time) Time :返回一个 metav1.Time 值,包装提供的 time.Time 值。
- func Date(year int, month time.Month, day, hour, min, sec, nsec int, loc *time.Location) Time :根据时间的各个元素(如年、月、日、小时、分钟、秒、纳秒、时区)返回一个 metav1.Time 值,它是 time.Date 函数的包装。
- func Now() Time :返回一个包含当前本地时间的 metav1.Time 值,是

### 使用 `client-go` 开发 Kubernetes 控制器 #### 创建项目结构并初始化依赖项 为了使用 `client-go` 构建控制器,首先需要设置项目的目录结构,并通过 Go Modules 初始化依赖管理。 ```bash mkdir k8s-controller-demo && cd k8s-controller-demo go mod init github.com/yourusername/k8s-controller-demo ``` 安装必要的软件包: ```bash go get k8s.io/client-go@latest go get sigs.k8s.io/controller-runtime@latest ``` #### 编写控制器逻辑 下面是一个简单的例子来展示如何编写一个监听 Pod 变化的控制器。此代码片段展示了基本框架以及核心组件的配置[^1]。 ```go package main import ( "context" "flag" "fmt" "time" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/homedir" rest "k8s.io/client-go/rest" ) func main() { var kubeconfig string if home := homedir.HomeDir(); home != "" { kubeconfig = flag.String("kubeconfig", home+"/.kube/config", "(optional) absolute path to the kubeconfig file") } else { kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file") } flag.Parse() config, err := rest.InClusterConfig() if err != nil { config, err = rest.ClientConfigFromFlags("", *kubeconfig) if err != nil { panic(err.Error()) } } clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err.Error()) } stopper := make(chan struct{}) defer close(stopper) _, controller := cache.NewInformer( &cache.ListWatch{ ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { return clientset.CoreV1().Pods("").List(context.TODO(), options) }, WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { return clientset.CoreV1().Pods("").Watch(context.TODO(), options) }, }, &corev1.Pod{}, time.Minute*0, cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { pod := obj.(*corev1.Pod) fmt.Printf("Pod Added: %s\n", pod.Name) }, UpdateFunc: func(oldObj, newObj interface{}) { oldPod := oldObj.(*corev1.Pod) newPod := newObj.(*corev1.Pod) if oldPod.Status.Phase != newPod.Status.Phase { fmt.Printf("Pod Updated: %s -> %s\n", oldPod.Name, newPod.Status.Phase) } }, DeleteFunc: func(obj interface{}) { pod := obj.(*corev1.Pod) fmt.Printf("Pod Deleted: %s\n", pod.Name) }, }, ) go controller.Run(2, stopper) select {} } ``` 这段代码实现了对集群内所有命名空间下 Pods 资源变化事件(新增、更新、删除)的监控,并打印相应的消息到标准输出流中[^2]。 #### 运行应用程序 确保已正确设置了 KUBECONFIG 环境变量指向有效的 Kubernetes 配置文件路径;如果是在本地环境中运行,则通常位于用户的主目录下的 `.kube/config` 文件里。编译并执行上述程序即可启动这个简易版的控制器实例[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值