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

news2024/9/29 19:24:44

文章目录

    • 环境判断
      • docker环境检测
      • K8S环境检测
      • 获取POD的Namespace
    • API Server
      • 概述
      • API访问
        • 命令行方式
        • 编程方式

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信息:构建时的各种信息(如镜像信息、资源信息、启动参数、环境变量、影射的目录卷);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/338968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实施ITIL项目的十个参考步骤

ITIL是我们做好IT服务管理流程建设与治理的一个重要知识库,这个知识体系的内容非常丰富,做到全面领会并运用自如是比较困难的。因此,我们提供了这样的一份实施ITIL项目的参考步骤,在新建或治理企业IT管理流程时可以适当借鉴&#…

elasticsearch索引与搜索初步

ES支持cURL交互,使用http请求完成索引和搜索操作,最基本的格式如下:创建索引我们可以使用PUT方法创建索引,通过指定“索引”、“类型”、“文档ID”锁定文档,通过参数指定文档的数据。红色部分的路由分别指定了“索引”…

Homekit智能家居DIY一智能插座

WiFi智能插座对于新手接触智能家居产品更加友好,不需要额外购买网关设备 很多智能小配件也给我们得生活带来极大的便捷,智能插座就是其中之一,比如外出忘记关空调,可以拿起手机远程关闭。 简单说就是:插座可以连接wi…

【博客618】docker容器重启后读写层数据并不丢失的原理

docker容器重启后读写层数据并不丢失的原理 1、场景 当我们对docker容器执行restart后,其实容器中原本读写层里对临时数据还在。只有我们删除了这个容器,重新创建的容器是基于镜像的只读层然后挂载上新的空的读写层,此时临时数据是不在的 2、…

详解指针(2)(初阶版)

前言:内容包括:指针运算,指针和数组,二级指针,指针数组 详解指针(1)(点击即跳转) part 1:指针运算 1 指针-整数 以如下代码为例:初始化数组内容…

实验名称:经典同步问题:生成者与消费者问题

实验名称:经典同步问题:生成者与消费者问题 相关知识 信号量 信号量是用来协调不同进程间的数据对象,可用来保护共享资源,也能用来实现进程间及同一进程不同线程间的进程同步。分为二值信号灯和计算信号灯两种类型。 进程与线…

VOC数据增强与调整大小

数据增强是针对数据集图像数量太少所采取的一种方法。 博主在实验过程中,使用自己的数据集时发现其数据量过少,只有280张,因此便想到使用数据增强的方式来获取更多的图像信息。对于图像数据,我们可以采用旋转等操作来获取更多的图…

Android Dalvik虚拟机 堆初始化流程

前言 上篇文章介绍了dalvik虚拟机启动流程,在dalvik虚拟机启动时调用了dvmGcStartup来启动堆。 本文介绍我们在日常开发使用Java时的堆创建流程。 Dalvik堆介绍 Dalvik虚拟机中,堆是由heap[0] Active堆和heap[1] Zygote堆两部分组成的。其中&#xff…

13 Day:实现内核线程

前言:我们昨天完成了内核的内存池以及内存管理程序,今天我们要揭开操作系统多任务执行的神秘面纱,来了解并实现一个多任务的操作系统。 一,实现内核线程 在聊线程之间我们先聊聊处理器吧,众所周之现在我们的CPU动不动…

心跳太快对身体带来影响?4种方法来减速!

心脏每时每刻都在跳动,跳动时遵循一定的节律。正常情况下成年人每分钟心跳达到60~120下,若心跳每分钟大于120下,被判断为心动过速;若心跳每分钟不足50下,被判断为心动过缓,无论是哪种因素均会影响身体健康。…

详解Redisson分布式限流的实现原理

我们目前在工作中遇到一个性能问题,我们有个定时任务需要处理大量的数据,为了提升吞吐量,所以部署了很多台机器,但这个任务在运行前需要从别的服务那拉取大量的数据,随着数据量的增大,如果同时多台机器并发…

如何用Python打包好exe文件,并替换图标

前言 Python打包?打包exe文件?怎么操作? ok,今天我来分享分享,教你们如何打包号文件,顺便还来展示一下,如何替换好图标 首先把你的代码准备好,尽量不要中文路径,容易报…

flex 布局

设为 Flex 布局以后&#xff0c;子元素的float、clear和vertical-align属性将失效。 flex 和 inline-flexflex&#xff1a; 将对象作为弹性伸缩盒显示inline-flex&#xff1a;将对象作为内联块级弹性伸缩盒显示<style>.main {background-color: #0f0;display: flex; /*父…

【VictoriaMetrics】VictoriaMetrics启停脚本

先看结果,启动VictoriaMetrics UI界面可访问

有趣的Hack-A-Sat黑掉卫星挑战赛——定位卫星Jackson

国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加&#xff0c;太空已经成为国家赖以生存与发展的命脉之一&#xff0c;凝聚着巨大的国家利益&#xff0c;太空安全的重要性日益凸显[1]。而在信息化时代&#xff0c;太空安…

图解LeetCode——剑指 Offer 53 - I. 在排序数组中查找数字 I

一、题目 统计一个数字在排序数组中出现的次数。 二、示例 示例 1 【输入】nums [5,7,7,8,8,10], target 8 【输出】2 示例 2: 【输入】nums [5,7,7,8,8,10], target 6 【输出】0 提示&#xff1a; 0 < nums.length < 10^5-10^9 < nums[i] < 10^9nums 是一…

基于Java+SpringBoot+SpringCloud+Vue前后端分离医院管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建、毕业项目实战、项目定制✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《S…

一文总结 JUC 并发编程

文章目录一、JUC 并发编程二、协调锁1. Synchronized2. Synchronized 锁下线程通信3. Lock 锁4. Lock 锁实例 - ReentrantLock5. 读写锁 - ReadWriteLock三、CAS & 原子类1. CAS2. 原子类2.1 基础原子类2.2 数组类型原子类2.3 引用型原子类四、线程1. Callable 和 Future2.…

Filter防火墙(8)

实验目的 1、了解个人防火墙的基本工作原理&#xff1b; 2、掌握Filter防火墙的配置。 预备知识防火墙 防火墙&#xff08;Firewall&#xff09;是一项协助确保信息安全的设备&#xff0c;会依照特定的规则&#xff0c;允许或是限制传输的数据通过。防火墙可以是一台专属的硬…

Linux防火墙(7)

实验目的 通过该实验了解Linux防火墙iptables实现原理&#xff0c;掌握iptables基本使用方法&#xff0c;能够利用iptables对操作系统进行加固。预备知识基本原理 netfilter/iptables&#xff08;简称为iptables&#xff09;组成Linux平台下的包过滤防火墙&#xff0c;具有完成…