网站域名icp 备案价格,天水建设银行网站,wordpress超炫模板,网络整合营销的目的是什么简单记录问题
一、问题描述
希望通过Java程序使用Kubernetes提供的工具包实现对Kubernetes集群core API的调用#xff0c;但是在高版本上遇见权限验证问题4xx。 dependencygroupIdio.kubernetes/groupIdartifactIdclient-java/artifact…简单记录问题
一、问题描述
希望通过Java程序使用Kubernetes提供的工具包实现对Kubernetes集群core API的调用但是在高版本上遇见权限验证问题4xx。 dependencygroupIdio.kubernetes/groupIdartifactIdclient-java/artifactIdversion20.0.0/version !-- 请根据需要选择合适的版本 --/dependency
权限验证的问题
{kind: Status,apiVersion: v1,metadata: {},status: Failure,message: pods is forbidden: User \system:anonymous\ cannot list resource \pods\ in API group \\ at the cluster scope,reason: Forbidden,details: {kind: pods},code: 403
}
大意是system:anonymous匿名用户被禁止去访问相应集群的pods资源信息。
Kubernetes支持许多不同的身份验证方案这些方案几乎总是在集群外部实现包括X.509证书基本身份验证bearer令牌用于通过可信身份提供商进行身份验证的OpenID ConnectOIDC等。使用API服务器上的相关配置选项可以启用多种方案因此请务必为计划使用的身份验证方案提供这些选项。例如X.509客户端证书身份验证需要包含一个或多个CA证书 -client-ca-file文件路径。需要记住的一点是默认情况下任何未通过其中一种身份验证方案验证的API请求都会被视为匿名请求。匿名用户system:anonymous默认被拒绝访问任何 API。即使是基本的 API如列出 Pods也需要显式分配权限现阶段所有 API 调用都需要经过明确的认证和授权。
查看一下集群的默认验证模式设置
grep -C3 authorization-mode /etc/kubernetes/manifests/kube-apiserver.yaml 默认开启的是RBAC基于角色的访问控制。
各类模式以及下方各类k8s资源的介绍可参见
Kubernetes K8S之鉴权RBAC详解 - 踏歌行666 - 博客园
二、解决方案
我需要针对集群中相关资源pods lists通过Java client进行增删改查操作那么最直接快速的方式就是创建一个具有集群超级用户权限的用户并将其对应的Key用于Java client进行API的访问操作。
Prepare:查看clusterrole
clusterrole是集群范围的角色用于管理整个集群中的资源。
通过指令
kubectl get clusterroles
查看到集群下有众多的clusterrole 其中有cluster-admin角色我们可以通过如下指令查看其权限
kubectl get clusterrole cluster-admin -o yaml 我们能看出它是 Kubernetes 内置的超级权限角色其中rules部分均为通配符表明该角色对所有 API 组的所有资源具有所有操作权限即为管理员提供对集群所有资源的完全控制。
具体操作
1.将用户与cluster-admin角色相绑定
kubectl create clusterrolebinding admin-access --clusterrolecluster-admin --userapiinvoker2.创建serviceaccount
#serviceaccount 后接名称
kubectl create serviceaccount apiinvoker -n kube-system2.将serviceaccount绑定到cluster-admin
kubectl create clusterrolebinding admin-sa-binding --clusterrolecluster-admin --serviceaccountkube-system:apiinvoker 3.创建Token
分为临时的选择一以及永久的选择二两种方式。
选择一 下述代码能直接生成并显示token但是该方式的token是存在有效期的。
# 需要设置有效期 添加参数--duration 其他参数使用指令kubectl -n kube-system create token --help查看
kubectl -n kube-system create token apiinvoker
选择二
要创建永久有效的Token需要使用Secret方式
在创建serviceaccount之后为其手动创建Secret并将其与serviceaccount绑定。
1. 创建apiinvoker-token.yaml
apiVersion: v1
kind: Secret
metadata:name: apiinvoker-tokennamespace: kube-systemannotations:kubernetes.io/service-account.name: apiinvoker # 绑定到服务账户 改成你自定义的serviceaccount
type: kubernetes.io/service-account-token2. 运行yaml文件
kubectl apply -f apiinvoker-token.yaml4.获取serviceaccount的Token
kubectl -n kube-system describe secret apiinvoker-token这样就能在Java client使用这个token进行API的调用了。
5.编写Java程序代码示例
在pom中添加依赖 dependencygroupIdio.kubernetes/groupIdartifactIdclient-java/artifactIdversion20.0.0/version !-- 请根据需要选择合适的版本 --/dependency
运行如下示例代码
package com.yang.collector;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.V1NamespaceList;
import io.kubernetes.client.openapi.models.V1PodList;import java.io.IOException;public class K8SAPITest {public static void main(String[] args) {try {ApiClient client new ApiClient();client.setBasePath(https://k8s-master IP:6443); // 集群的 API 地址client.setApiKey(Bearer 生成的Token);
// client.setDebugging(true);client.setVerifyingSsl(false);Configuration.setDefaultApiClient(client);// 将配置设置为默认的 API 客户端io.kubernetes.client.openapi.Configuration.setDefaultApiClient(client);// 创建 CoreV1Api 实例CoreV1Api api new CoreV1Api();// 获取所有命名空间中的 Pod 列表CoreV1Api.APIlistPodForAllNamespacesRequest list api.listPodForAllNamespaces();V1PodList execute list.execute();// 遍历并打印每个 Pod 的信息execute.getItems().forEach(v1Pod - {System.out.println(v1Pod.toJson());});} catch (Exception e) {e.printStackTrace();}}
}结果如下 说明调用成功克服权限验证问题。
注当然在实际的生产环境中不建议直接将 超级权限如 cluster-admin 交给 Java 程序或任何外部程序。这样做存在高安全风险可能导致集群被误操作或恶意利用。
但是使用 服务账户ServiceAccount 的 Token的形式进行细粒度权限控制API的调用是推荐的本文直接赋值所有资源的所有操作权限十分不可取仅供学习参考。
推荐方式在生产环境中所有权限分配都应该基于实际需求授予 Java 程序仅需要的权限即可。创建自定义Role或ClusterRole仅授予程序需要的权限再通过Rolebinding或ClusterRoleBinding将权限绑定到服务账户再将此token交给API调用程序。token的使用也不建议永久有效通过使用kubectl create token动态生成短期 Token供程序动态获取使用更为安全避免了长期token的泄露风险。
参考文献
1.Kubernetes K8S之鉴权RBAC详解 - 踏歌行666 - 博客园
2.API 访问控制 | Kubernetes
3.Kubernetes集群组件的安全_手机搜狐网