首页 > 其他分享 >k8s中pod获取宿主机IP地址

k8s中pod获取宿主机IP地址

时间:2024-08-30 21:26:10浏览次数:5  
标签:Kubernetes IP 宿主机 client API io import pod k8s

在 Pod 内部的 Java 环境中,你可以通过 Kubernetes API 或 Kubernetes Downward API 来获取节点的 IP 地址。以下是几种方法来实现这一点:

个人使用的第一种

方法 1: 使用 Kubernetes Downward API
如果你已经在 Pod 配置中使用了 Downward API,将节点的 IP 地址注入到环境变量中,你可以在 Java 程序中读取该环境变量。

1.1 配置 Pod 的 YAML 文件
首先,在 Pod 的 YAML 文件中配置 Downward API,如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    env:
    - name: NODE_IP
      valueFrom:
        fieldRef:
          fieldPath: status.hostIP

1.2 在 Java 中读取环境变量
在 Java 程序中,你可以通过 System.getenv() 方法读取环境变量:

public class Main {
    public static void main(String[] args) {
        String nodeIp = System.getenv("NODE_IP");
        System.out.println("Node IP: " + nodeIp);
    }
}

方法 2: 通过 Kubernetes API 查询节点信息
如果你没有使用 Downward API,你可以通过 Kubernetes API 直接在 Java 中查询节点的 IP 地址。这需要你使用 Kubernetes 客户端库(如 kubernetes-client)来访问 Kubernetes API。

2.1 添加 Kubernetes 客户端依赖
首先,添加 Kubernetes 客户端依赖到你的 pom.xml 中:

<dependency>
    <groupId>io.kubernetes</groupId>
    <artifactId>client-java</artifactId>
    <version>15.0.0</version> <!-- 使用最新版本 -->
</dependency>
2.2 使用 Kubernetes 客户端库查询节点信息
以下是一个示例代码,展示如何使用 Kubernetes 客户端库查询节点 IP 地址:
import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.Configuration;
import io.kubernetes.client.openapi.auth.ApiKeyAuth;
import io.kubernetes.client.openapi.models.V1Node;
import io.kubernetes.client.openapi.models.V1NodeList;
import io.kubernetes.client.openapi.apis.CoreV1Api;
import io.kubernetes.client.util.Config;

public class Main {
    public static void main(String[] args) {
        try {
            // Initialize the Kubernetes API client
            ApiClient client = Config.defaultClient();
            Configuration.setDefaultApiClient(client);
            CoreV1Api api = new CoreV1Api();

            // Get the node list
            V1NodeList nodeList = api.listNode(null, null, null, null, null, null, null, null, null);
            
            // Print node IP addresses
            for (V1Node node : nodeList.getItems()) {
                String nodeName = node.getMetadata().getName();
                String nodeIp = node.getStatus().getAddresses().stream()
                                   .filter(address -> "InternalIP".equals(address.getType()))
                                   .map(address -> address.getAddress())
                                   .findFirst().orElse("Unknown");
                System.out.println("Node Name: " + nodeName + ", Node IP: " + nodeIp);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方法 3: 直接从 Pod 中获取信息
如果你的 Pod 已经配置了 Kubernetes API 权限,你可以使用 HTTP 请求直接从 Kubernetes API 服务器获取节点的 IP 地址。以下是一个使用 HttpURLConnection 的示例:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Main {
    public static void main(String[] args) {
        try {
            String url = "http://$KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT/api/v1/nodes/$(hostname)/status";
            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            con.setRequestMethod("GET");
            con.setRequestProperty("Authorization", "Bearer " + System.getenv("TOKEN"));
            con.setRequestProperty("Accept", "application/json");
            
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String inputLine;
            StringBuilder response = new StringBuilder();
            
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();
            
            // Print the response
            System.out.println(response.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,$KUBERNETES_SERVICE_HOST 和 $KUBERNETES_SERVICE_PORT 是 Kubernetes API 的服务地址和端口,TOKEN 是从 /var/run/secrets/kubernetes.io/serviceaccount/token 文件中读取的服务账户令牌。

总结
使用 Downward API 是最简单的方法,可以将节点 IP 地址作为环境变量注入到 Pod 中。
Kubernetes API 客户端 提供了更灵活的方式来查询节点信息,但需要配置和权限。
直接使用 HTTP 请求 也是一种方法,但需要处理身份验证和 API 访问。

标签:Kubernetes,IP,宿主机,client,API,io,import,pod,k8s
From: https://www.cnblogs.com/xxsdnol/p/18389522

相关文章

  • 解决rancher部署k8s集群问题
    一.问题概述国内网络使用docker部署,local集群会报错,并在创建rke2自定义集群时不成功,会卡住;二.问题分析这个问题主要是由于在使用dockerrun命令启动Rancher容器时,错误地映射了数据目录/var/lib/rancher到宿主机所导致的。下面是详细的问题分析和解决方案整理:1.内置镜像的tar......
  • k8s的组件以及安装
    目录概念k8s的使用场景k8s的特点核心组件master主组件1.kube-apiserver2.etcd3.kube-controller-manager控制器4.kube-schedulernode从节点组件1.kubelet2.kube-proxy3.docker总结k8s的核心概念安装k8s架构安装步骤实验:创建pod概念全写:Kubernetsk8s作......
  • Oracle DB 因宿主机(Linux 虚拟机)意外关停,重启数据库步骤
    前期准备:示例的linux版本为:linux9宿主机重启后,如果之前挂载的oraclehome路径及环境变量未生效,需要先重新设置:exportORACLE_SID=FREEexportORAENV_ASK=NO./opt/oracle/product/23ai/dbhomeFree/bin/oraenv前往home路径下的bin文件夹下进行操作:cd$ORACLE_HOME/bin......
  • k8S 高可用部署,超详细
    ......
  • 【云原生之kubernetes实战】k8s环境中部署Nginx服务
    【云原生之kubernetes实战】k8s环境中部署Nginx服务一、Nginx介绍1.1Nginx简介1.2Nginx特点1.3Nginx使用场景二、本次实践介绍2.1本次实践简介2.2本次环境规划三、检查k8s环境3.1检查工作节点状态3.2检查系统pod状态四、部署storageclass(......
  • 基于Ubuntu部署企业级kubernetes集群---k8s集群容器运行时Containerd准备
    1.Containerd部署文件获取1.下载 Containerd文件wgethttps://github.com/containerd/containerd/releases/download/v1.7.21/cri-containerd-1.7.21-linux-amd64.tar.gz2.查看下载的文件 3.解压到当前文件到根目录下tarxfcri-containerd-1.7.21-linux-amd64.tar.g......
  • 为什么k8s节点要保持配置一致
            Kubernetes(简称为K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。K8s集群包含了多个节点,其中每个节点运行着Kubernetes代理(kubelet)和容器运行时(如Docker)。为了确保K8s集群的正常运行和高可用性,节点需要保持配置一致,这有以下几个原因:......
  • Kubernetes (K8s) 监控方案:Prometheus 实战指南
    1.引言在当今云原生时代,Kubernetes(K8s)已成为容器编排的标准解决方案。然而,随着K8s集群规模和复杂性的增加,有效的监控变得至关重要。本文将详细介绍如何使用Prometheus构建一个全面而强大的K8s监控系统,帮助您实时掌握集群状态,快速定位问题,并优化资源利用。2.监......
  • k8s网络原理之Calico
    什么是Calico:Calico是一个基于BGP的纯三层网络方案,其会为每个容器(pod)分配一个可路由的IP,在通信时不需要解包和拆包,因此网络性能损耗小,易于排查和水平扩展。Calico网络功能强大,可以与istio集成。CalicoIPIP模式与Vxlan类似,也是通过网络隧道技术实现的,与Vxlan的差别就是,VXLAN本质......
  • 【云原生】Kubernetes中常见的Pod故障排查定位与解决方案
    ✨✨欢迎大家来到景天科技苑✨✨......