版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
云原生实战:Go操作KubernetesAPI一、核心概念client-go:K8s官方Go客户端,封装了与apiserver通信的细节。Clientset:对所有内置资源(Pod/Deployment/Service…)的强类型客户端。Informer:基于List-Watch的本地缓存,减少直接请求apiserver,事件驱动。Operator:自定义控制器+CRD,把业务逻辑封装成K8s资源。二、环境准备1.版本匹配(关键)client-go版本要和集群版本主版本一致,例如:K8s1.29→client-gov0.29.x2.初始化项目bash运行mkdirk8s-go-demo&&cdk8s-go-demogomodinitk8s-go-demo#安装依赖(示例用1.29)gogetk8s.io/client-go@v0.29.3gogetk8s.io/apimachinery@v0.29.3三、客户端初始化(两种方式)方式A:本地开发(用~/.kube/config)go运行packagemainimport( "context" "log" "path/filepath" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/homedir")funcmain(){ //1.加载kubeconfig varconfig*rest.Config varerrerror kubeconfig:=filepath.Join(homedir.HomeDir(),".kube","config") config,err=clientcmd.BuildConfigFromFlags("",kubeconfig) iferr!=nil{ log.Fatalf("Failedtobuildconfig:%v",err) } //2.创建Clientset clientset,err:=kubernetes.NewForConfig(config) iferr!=nil{ log.Fatalf("Failedtocreateclientset:%v",err) } log.Println("Connectedtoclustersuccessfully") _=clientset//后续用}方式B:集群内Pod中运行(InCluster)go运行config,err:=rest.InClusterConfig()iferr!=nil{ log.Fatalf("InClusterConfigfailed:%v",err)}clientset,err:=kubernetes.NewForConfig(config)四、基础CRUD实战1.列出所有Podgo运行import( corev1"k8s.io/api/core/v1" metav1"k8s.io/apimachinery/pkg/apis/meta/v1")pods,err:=clientset.CoreV1().Pods("").List(context.TODO(),metav1.ListOptions{})iferr!=nil{ log.Fatalf("Listpodsfailed:%v",err)}for_,p:=rangepods.Items{ log.Printf("Pod:%s/%sPhase:%s",p.Namespace,p.Name,p.Status.Phase)}2.创建NginxDeploymentgo运行appsv1"k8s.io/api/apps/v1"dep:=&appsv1.Deployment{ ObjectMeta:metav1.ObjectMeta{ Name:"nginx-demo", Namespace:"default", }, Spec:appsv1.DeploymentSpec{ Replicas:func()*int32{i:=int32(2);return&i}(), Selector:&metav1.LabelSelector{ MatchLabels:map[string]string{"app":"nginx"}, }, Template:corev1.PodTemplateSpec{ ObjectMeta:metav1.ObjectMeta{ Labels:map[string]string{"app":"nginx"}, }, Spec:corev1.PodSpec{ Containers:[]corev1.Container{ { Name:"nginx", Image:"nginx:1.25-alpine", Ports:[]corev1.ContainerPort{ {ContainerPort:80}, }, }, }, }, }, },}_,err:=clientset.AppsV1().Deployments("default").Create(context.TODO(),dep,metav1.CreateOptions{})iferr!=nil{ log.Fatalf("Createdeploymentfailed:%v",err)}log.Println("Deploymentnginx-democreated")3.更新Deployment(扩容到3副本)go运行//先Get再Update(乐观锁)dep,err:=clientset.AppsV1().Deployments("default").Get(context.TODO(),"nginx-demo",metav1.GetOptions{})iferr!=nil{ log.Fatal(err)}*dep.Spec.Replicas=3_,err=clientset.AppsV1().Deployments("default").Update(context.TODO(),dep,metav1.UpdateOptions{})iferr!=nil{ log.Fatal(err)}log.Println("Deploymentscaledto3replicas")4.删除Deploymentgo运行err=clientset.AppsV1().Deployments("default").Delete(context.TODO(),"nginx-demo",metav1.DeleteOptions{})iferr!=nil{ log.Fatal(err)}log.Println("Deploymentdeleted")五、高级:Watch与Informer1.简单Watch(实时监听Pod事件)go运行watchOpts:=metav1.ListOptions{Watch:true}w,err:=clientset.CoreV1().Pods("default").Watch(context.TODO(),watchOpts)iferr!=nil{ log.Fatal(err)}deferw.Stop()forevent:=rangew.ResultChan(){ log.Printf("Event:%vPod:%s",event.Type,event.Object.(*corev1.Pod).Name)}2.Informer实战(生产推荐)Informer会:第一次List全量然后Watch增量本地缓存,事件回调go运行import( "time" "k8s.io/client-go/informers" "k8s.io/client-go/tools/cache")//创建Informer工厂(10分钟同步一次)factory:=informers.NewSharedInformerFactory(clientset,10*time.Minute)podInformer:=factory.Core().V1().Pods()//注册事件回调podInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc:func(objinterface{}){ pod:=obj.(*corev1.Pod) log.Printf("PodAdded:%s/%s",pod.Namespace,pod.Name) }, UpdateFunc:func(oldObj,newObjinterface{}){ oldPod:=oldObj.(*corev1.Pod) newPod:=newObj.(*corev1.Pod) ifoldPod.ResourceVersion==newPod.ResourceVersion{ return } log.Printf("PodUpdated:%s/%s",newPod.Namespace,newPod.Name) }, DeleteFunc:func(objinterface{}){ pod:=obj.(*corev1.Pod) log.Printf("PodDeleted:%s/%s",pod.Namespace,pod.Name) },})//启动Informer(阻塞)factory.Start(context.TODO().Done())//等待缓存同步完成if!cache.WaitForCacheSync(context.TODO().Done(),podInformer.Informer().HasSynced){ log.Fatal("Failedtosynccaches")}log.Println("Informerrunning...")<-context.TODO().Done()六、进阶:简单Operator骨架(CRD+控制器)1.定义CRD结构体(示例:App)go运行import( metav1"k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema")//SchemeGroupVersion是CRD的GVKvarSchemeGroupVersion=schema.GroupVersion{ Group:"", Version:"v1",}typeAppstruct{ metav1.TypeMeta`json:",inline"` metav1.ObjectMeta`json:"metadata,omitempty"` SpecAppSpec`json:"spec"` StatusAppStatus`json:"status,omitempty"`}typeAppSpecstruct{ Replicas*int32`json:"replicas"` Imagestring`json:"image"`}typeAppStatusstruct{ ReadyReplicasint32`json:"readyReplicas"`}typeAppListstruct{ metav1.TypeMeta`json:",inline"` metav1.ListMeta`json:"metadata,omitempty"` Items[]App`json:"items"`}//注册到Schemefuncinit(){ SchemeBuilder.Register(&App{},&AppList{})}var( SchemeBuilder=runtime.NewSchemeBuilder(addKnownTypes) AddToScheme=SchemeBuilder.AddToScheme)funcaddKnownTypes(scheme*runtime.Scheme)error{ scheme.AddKnownTypes(SchemeGroupVersion, &App{}, &AppList{}, ) metav1.AddToGroupVersion(scheme,SchemeGroupVersion) returnnil}2.控制器Reconcile逻辑(简化版)go运行//Reconcile核心逻辑:对比期望状态与当前状态func(r*AppReconciler)Reconcile(ctxcontext.Context,reqctrl.Request)(ctrl.Result,error){ //1.获取App实例 app:=&appv1.App{} iferr:=r.Get(ctx,req.NamespacedName,app);err!=nil{ iferrors.IsNotFound(err){ //App被删除,清理资源 returnctrl.Result{},nil } returnctrl.Result{},err } //2.检查是否已有Deployment dep:=&appsv1.Deployment{} err:=r.Get(ctx,types.NamespacedName{Name:app.Name,Namespace:app.Namespace},dep) iferr!=nil{ iferrors.IsNotFound(err){ //3.没有则创建Deployment dep=r.newDeploymentForApp(app) iferr:=r.Create(ctx,dep);err!=nil{ returnctrl.Result{},err } log.Println("Deploymentcreate
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河北省名校联考2026届高三数学上学期11月期中测试含解析
- 护理礼仪的护理团队协作技巧
- 2026年劳动合同解除与补偿协议指南
- 2026版二手房买卖合同模板下载
- 智能新能源汽车劳动合同样本
- 子痫产妇的皮肤护理
- 2026年文明单位自检自查报告(3篇)
- 慢性病防治工作计划(2篇)
- 吉林护理事业编考试护理专业教育
- 外科护理健康教育
- 火锅店服务流程培训
- 煤矿顶板安全培训
- 催收公司新人培训
- GB/T 44679-2024叉车禁用与报废技术规范
- 泰信基金管理有限公司招聘笔试题库2024
- 工业现场网络通信技术应用及实践-习题参考答案2024
- CHT 1022-2010 平面控制测量成果质量检验技术规程(正式版)
- 监理单位总监理工程师安全责任书
- 临床诊疗指南-麻醉分册
- 中海、万科、万达限额设计对比表
- 创新创业基础学习通期末考试答案2023年
评论
0/150
提交评论