You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenShift获取Pods列表JSON数据遇认证问题求解决方案

解决OpenShift API请求的认证问题

嘿,这个问题我之前在开发OpenShift相关应用时也碰到过,OpenShift的Kubernetes API都需要认证才能访问,针对你用Java RestTemplate的场景,我给你整理了几种常用的认证实现方式:

1. 使用Bearer Token认证(集群外调用首选)

这是最常用的方式,你可以通过OpenShift CLI或者控制台获取你的用户Token:

  • 用CLI的话,执行命令 oc whoami -t 就能直接拿到Token
  • 或者登录OpenShift控制台,进入用户设置页面复制Token

拿到Token后,只需要在RestTemplate的请求头里添加Authorization字段,格式为Bearer <你的Token>,代码示例如下:

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

// 初始化RestTemplate
RestTemplate template = new RestTemplate();

// 设置认证头
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + "替换成你的实际Token");

// 构建请求实体
HttpEntity<String> requestEntity = new HttpEntity<>(headers);

// 发送请求并获取响应
ResponseEntity<Node[]> response = template.exchange(
    "[url_address]/api/v1/nodes",
    HttpMethod.GET,
    requestEntity,
    Node[].class
);

Node[] nodes = response.getBody();

2. 使用ServiceAccount Token(集群内应用推荐)

如果你的Java应用本身就部署在OpenShift集群的Pod里,那推荐用这种方式——OpenShift会自动给Pod挂载所属ServiceAccount的Token和CA证书,不需要手动配置:

  • Token路径:/var/run/secrets/kubernetes.io/serviceaccount/token
  • CA证书路径:/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

代码示例(需要引入Apache HttpClient依赖来处理证书验证):

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.core.io.FileSystemResource;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

import javax.net.ssl.SSLContext;
import java.nio.file.Files;
import java.nio.file.Paths;

// 读取自动挂载的ServiceAccount Token
String saToken = new String(Files.readAllBytes(Paths.get("/var/run/secrets/kubernetes.io/serviceaccount/token")));

// 配置SSL上下文,信任集群CA证书
FileSystemResource caCert = new FileSystemResource("/var/run/secrets/kubernetes.io/serviceaccount/ca.crt");
SSLContext sslContext = SSLContexts.custom()
    .loadTrustMaterial(caCert, (chain, authType) -> true)
    .build();

// 构建支持SSL的HttpClient
CloseableHttpClient httpClient = HttpClients.custom()
    .setSSLContext(sslContext)
    .build();

// 初始化带SSL配置的RestTemplate
RestTemplate template = new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient));

// 设置认证头
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + saToken);

HttpEntity<String> requestEntity = new HttpEntity<>(headers);

// 集群内可以直接用内部API地址
ResponseEntity<Node[]> response = template.exchange(
    "https://kubernetes.default.svc/api/v1/nodes",
    HttpMethod.GET,
    requestEntity,
    Node[].class
);

Node[] nodes = response.getBody();

3. 用户名密码认证(不推荐但应急可用)

如果实在没有Token,也可以用Basic Auth方式,把用户名和密码编码成Base64后放在请求头里,但这种方式安全性较低,不建议生产环境使用:

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.apache.commons.codec.binary.Base64;
import java.nio.charset.StandardCharsets;

RestTemplate template = new RestTemplate();

String username = "你的OpenShift用户名";
String password = "你的OpenShift密码";
String authStr = username + ":" + password;
byte[] authBytes = Base64.encodeBase64(authStr.getBytes(StandardCharsets.UTF_8));
String authHeader = "Basic " + new String(authBytes);

HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", authHeader);

HttpEntity<String> requestEntity = new HttpEntity<>(headers);

ResponseEntity<Node[]> response = template.exchange(
    "[url_address]/api/v1/nodes",
    HttpMethod.GET,
    requestEntity,
    Node[].class
);

Node[] nodes = response.getBody();

额外注意事项

  • 权限检查:不管用哪种方式,都要确保你的用户/ServiceAccount有访问nodes资源的权限,比如可以用命令 oc adm policy add-cluster-role-to-user view <你的用户名> 给用户添加查看权限,或者给ServiceAccount绑定对应的ClusterRole。
  • 证书验证:如果是集群外调用,API服务器的证书如果是自签的,需要配置RestTemplate信任该证书,否则会出现SSL验证失败的错误。

内容的提问来源于stack exchange,提问作者akaoD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:12:25