k8s访问pod基础示例

好久没有写博客了。 借着春节有点时间,补充一些内容。
近期关于k8s的都是非常基础的内容,基本上都是k8s client api的基础使用,仅供参考。没有架构和设计精髓的讨论。

环境

我Windows上安装了2台linux虚拟机,然在linux上安装 1.15.0版本的k8s, 开发环境在Windows7上。

工程结构

非常简单的一个go工程,没有输入参数, 默认从当前用户的.kube目录读取config文件访问k8s,具体代码可以参看https://github.com/yqbjtu/mygotutorials/tree/master/k8spodget

在这里插入图片描述

获取clientset

k8sclient.go

package common

import (
	"flag"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"os"
	"path/filepath"
)

func homeDir() string {
	if h := os.Getenv("HOME"); h != "" {
		return h
	}
	return os.Getenv("USERPROFILE") // windows
}
func GetClient() (clientset *kubernetes.Clientset, err error) {
	var kubeconfig *string
	if home := homeDir(); home != "" {
		kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
	}
	config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
	if err != nil {
		panic(err.Error())
	}

	// create the clientset
	clientset, err = kubernetes.NewForConfig(config)
	return
}

watch pod, 查询node , deployment

getResource.go

package resource

import (
	"context"
	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/klog"
	"time"

	"k8s.io/client-go/kubernetes"
)

type MyResource struct {
	Clientset *kubernetes.Clientset
}

func (s *MyResource) GetNode() {
	opts := v1.ListOptions{
		Limit: 100,
	}

	nodes, err := s.Clientset.CoreV1().Nodes().List(context.TODO(), opts)
	if err != nil {
		klog.Error("failed to get node list ,err:%v", err)
		return
	}

	for _, node := range nodes.Items {
		klog.Infof("name:%s, Status:%v", node.Name, node.Status.NodeInfo.OSImage)
	}
}

func (s *MyResource) GetPod() {
	opts := v1.ListOptions{
		Limit: 100,
	}

	podwatch, err := s.Clientset.CoreV1().Pods("default").Watch(context.TODO(), opts)
	if err != nil {
		klog.Error("failed to watch pod list, err:%v", err)
		return
	}

	for {
		select {
		case e, ok := <-podwatch.ResultChan():
			if !ok {
				// 说明该通道已经被close掉了
				klog.Warning("podWatch chan has been close!")
				time.Sleep(time.Second * 5)
			}
			if e.Object != nil {
				klog.Infof("chan is ok. type:%v", e.Type)
				klog.Info(e.Object.DeepCopyObject())
			}
		}
	}
}

func (s *MyResource) GetDeployment(ns string) {
	deploy, err := s.Clientset.AppsV1().Deployments(ns).List(context.TODO(), v1.ListOptions{})
	if err != nil {
		klog.Error("failed to get deploy list ,err:%v", err)
		return
	}

	for _, deploy := range deploy.Items {
		klog.Infof("deployName:%s,  replicas:%d, status.UnavailableReplicas:%d,", deploy.Name, *deploy.Spec.Replicas, deploy.Status.UnavailableReplicas)
	}
}

主程序

package main

import (
	"flag"
	"k8s.io/klog"
	"k8spodget/pkg/common"
	"k8spodget/pkg/resource"
)

func main() {
	klog.InitFlags(nil)
	flag.Set("log_file", "C:\\F\\myfilek8spod.log")
	flag.Parse()
	klog.Info("start to get k8s client")
	clientSet, err := common.GetClient()
	if err != nil {
		klog.Warningf("failed to get k8s clientSet, err:%v", err)
	}
	myResource := resource.MyResource{Clientset: clientSet}
	myResource.GetNode()
	myResource.GetDeployment("default")
	//会一直运行
	myResource.GetPod()
	klog.Flush()
}

运行效果

在运行本程序前,请确保执行kubectl get nodes可以正常运行。如果kubectl get nodes可以运行, 基本上就保证程序能在本地访问到kube config文件。

在这里插入图片描述

备注

一开始我们没有限定引入module的版本,然后运行程序报错:

C:\F\GoLandProjects\mygotutorials\k8spodget>go run main.go
build command-line-arguments: cannot load k8s.io/api/auditregistration/v1alpha1: module k8s.io/api@latest found (v0.20.2), but does not contain package k8s.io/api/
auditregistration/v1alpha1

最后根据https://github.com/kubernetes/client-go/issues/874 建议方法,在go.mod中强制加上了replace k8s.io/client-go => k8s.io/client-go v0.19.2 才让程序通过编译的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使外部网络能够访问 Kubernetes 集群中的 Pod,通常可以使用 Kubernetes Service 和 Ingress Controller。 1. 首先,创建一个 Service 对象来公开 Pod。Service 可以将流量从集群外部路由到 Pod 内部。可以通过以下 YAML 示例创建一个 Service: ```yaml apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080 ``` 上述示例将名为 `my-service` 的 Service 创建为 TCP 协议的端口映射,将集群外部的流量路由到具有标签 `app: my-app` 的 Pod 上的端口 8080。 2. 安装和配置 Ingress Controller。Ingress Controller 是负责将外部流量路由到 Service 的组件。常见的 Ingress Controller 有 Nginx Ingress Controller、Traefik、HAProxy 等。 3. 创建一个 Ingress 资源对象,用于定义请求的入口点和路由规则。以下是一个示例 Ingress YAML: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: myapp.example.com http: paths: - pathType: Prefix path: / backend: service: name: my-service port: number: 80 ``` 上述示例将 Ingress 创建为将流量路由到名为 `my-service` 的 Service 上的规则。可以根据需要自定义 Host、Path 和其他路由规则。 4. 配置 DNS,将 Ingress 路由的域名解析到 Kubernetes 集群的外部 IP 地址或负载均衡器上。 完成上述步骤后,外部网络就可以通过访问 Ingress 定义的域名,从而访问Kubernetes 集群内部的 Pod。请注意,具体的实现方式可能因集群环境和网络架构而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值