[K8S]Kubernetes环境检测与API简介

5 篇文章 0 订阅


REST API是Kubernetes系统的重要部分,组件之间的所有操作和通信均由API Server处理的REST API调用。

环境判断

在使用API时,需要先判断是否是K8S环境。

docker环境检测

通过cgroup可判断出当前环境是docker、K8S、还是其他环境。

// Dockers:
//	11:blkio:/docker/3b9db3ef91bed85163973184bb848993ce79f7e23a451d0a806c7262e7784db1
//	10:memory:/docker/3b9db3ef91bed85163973184bb848993ce79f7e23a451d0a806c7262e7784db1
//	9:perf_event:/docker/3b9db3ef91bed85163973184bb848993ce79f7e23a451d0a806c7262e7784db1
// K8s:
//	11:cpuset:/kubepods/pod703e68e9-0a47-46f7-9cea-25d838510afa/358c08546c401e57b2f14632a700cb296c2a606eb67fdae963a2d66a3380f046
//	10:blkio:/kubepods/pod703e68e9-0a47-46f7-9cea-25d838510afa/358c08546c401e57b2f14632a700cb296c2a606eb67fdae963a2d66a3380f046
//	9:memory:/kubepods/pod703e68e9-0a47-46f7-9cea-25d838510afa/358c08546c401e57b2f14632a700cb296c2a606eb67fdae963a2d66a3380f046
// Other:
//	11:blkio:/init.scope
//	10:memory:/init.scope
//	9:perf_event:/

func IsDocker() bool {
	grpFile := "/proc/1/cgroup"
	lines, err := files.ReadLines(grpFile, 1)
	if err != nil {
		return false
	}
	if len(lines) == 0 {
		log.Printf("[ERROR] read %v fail: no line got", grpFile)
		return false
	}

	return strings.Contains(lines[0], "/docker/")
}

K8S环境检测

通过API接口rest.InClusterConfig()可检测是否在K8S中;更方便的方式是,直接通过环境变量检测:

func IsK8s() bool {
	host := os.Getenv("KUBERNETES_SERVICE_HOST")
	return len(host) != 0
}

获取POD的Namespace

获取POD的Namespace最简单的方式,是直接读取namespace文件:

func GetNamespace() (string, error) {
	namespace := ""
	filePath := "/var/run/secrets/kubernetes.io/serviceaccount/namespace"
	nsRead, err := ioutil.ReadFile(filePath)
	if err != nil {
		log.Printf("[ERROR] read namespace fail: %v", err)
		return namespace, err
	} else {
		namespace = string(nsRead)
		return namespace, nil
	}
}

API Server

Kubernetes API Server提供了Kubernetes各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中心。

概述

Kubernetes API Server提供的功能:

  • 集群管理的REST API接口(包括认证授权、数据校验以及集群状态变更);
  • 模块之间的数据交互和通信的枢纽
  • 资源配额控制的入口;
  • 拥有完备的集群安全机制;
    k8s api structure

API访问

Kubernetes提供了多种访问方式。

命令行方式

可通过kubectl命令行访问:

kubectl get --raw /api/v1

kubectl get --raw /api/v1/namespaces
编程方式

通过客户端库github.com/kubernetes/client-go/可方便使用接口。

每个Pod对象都只有一个服务帐户,若创建时未明确指定,会自动附加当前名称空间中默认服务帐户default。每个Pod都会自动关联一个存储卷,挂载至/var/run/secrets/kubernetes.io/serviceaccount

API的访问受RBAC的控制,可通过yaml分配权限与角色。测试时,可直接通过kubectl create clusterrolebinding serviceaccounts-view --clusterrole=cluster-admin --group=system:serviceaccounts授予账号访问权限。

接口使用方式:

  • 通过rest.InClusterConfig获取当前配置;
  • 通过kubernetes.NewForConfig创建客户端;
  • 通过客户端调用接口;

获取节点数量的样例:

import (
	"context"
	"fmt"
	metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/rest"
)

func main() {
	// creates the in-cluster config
	config, err := rest.InClusterConfig()
	if err != nil {
		fmt.Println(err)
		return
	}

	// creates the client
	client := kubernetes.NewForConfigOrDie(config)
	pods, err := client.CoreV1().Pods("").List(context.Background(), metaV1.ListOptions{})
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
	}
}

在获取的Pod中包含:

  • ObjectMeta信息:有节点的名称、所属的Namespace、labels、annotations等数据;
  • PodStatus信息:有Pod当前个阶段(Initialized、Ready、ContainersReady、PodScheduled)状态信息,主机地址(外部)、Pod地址(内部)
  • Spec信息:构建时的各种信息(如镜像信息、资源信息、启动参数、环境变量、影射的目录卷);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值