在OpenShift/Kubernetes环境中,服务账号(ServiceAccount)是一种特殊的账号类型,用于为Pod中的进程提供身份认证。每个服务账号都会自动关联一个Secret,其中包含访问API服务器所需的Token。
当Pod使用某个服务账号运行时,OpenShift会自动将该服务账号的Token挂载到Pod的/var/run/secrets/kubernetes.io/serviceaccount/token
路径。
import java.nio.file.Files;
import java.nio.file.Paths;
public class ServiceAccountTokenReader {
public static String readToken() {
try {
// Token文件路径
String tokenPath = "/var/run/secrets/kubernetes.io/serviceaccount/token";
// 读取文件内容
byte[] encoded = Files.readAllBytes(Paths.get(tokenPath));
return new String(encoded);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
String token = readToken();
System.out.println("ServiceAccount Token: " + token);
}
}
如果你有权限访问Kubernetes API,可以使用官方Java客户端获取Token:
import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.Configuration;
import io.kubernetes.client.openapi.apis.CoreV1Api;
import io.kubernetes.client.openapi.models.V1Secret;
import io.kubernetes.client.util.Config;
public class K8sServiceAccountToken {
public static void main(String[] args) {
try {
// 创建API客户端
ApiClient client = Config.defaultClient();
Configuration.setDefaultApiClient(client);
CoreV1Api api = new CoreV1Api();
// 获取default命名空间下的default服务账号关联的secret
// 注意:实际使用时需要根据你的服务账号名称和命名空间调整
V1Secret secret = api.readNamespacedSecret(
"default-token-xxxxx", // secret名称通常为<serviceaccount-name>-token-xxxx
"default", // 命名空间
null);
// 从secret中获取token
String token = new String(
secret.getData().get("token").decode(),
"UTF-8");
System.out.println("Token: " + token);
} catch (Exception e) {
e.printStackTrace();
}
}
}
如果使用Kubernetes Java客户端,需要在pom.xml中添加:
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java</artifactId>
<version>12.0.0</version>
</dependency>
问题1:无法读取Token文件
问题2:API访问被拒绝
以上方法提供了在Java中获取OpenShift服务账号Token的完整解决方案,可根据实际需求选择适合的方式。
没有搜到相关的文章