k8s Java客户端中的示例均使用默认客户端,请参见here。
ApiClient client = Config.defaultClient();
Configuration.setDefaultApiClient(client);
我如何配置k8s客户端,以便它可以与k8s集群Pod中的k8s CRD(例如,sparkoperator)对话?我应该如何配置此客户端? (basePath,身份验证?)在同一k8s集群中的pod中应该使用什么basePath?
答案 0 :(得分:1)
您也可以使用defaultClient
。
如果应用程序正在群集中运行并且具有正确的服务帐户,则defaultClient()
方法将创建一个群集内客户端。
您可以在方法here的注释中看到defaultClient
的规则:
/**
* Easy client creation, follows this plan
*
* <ul>
* <li>If $KUBECONFIG is defined, use that config file.
* <li>If $HOME/.kube/config can be found, use that.
* <li>If the in-cluster service account can be found, assume in cluster config.
* <li>Default to localhost:8080 as a last resort.
* </ul>
*
* @return The best APIClient given the previously described rules
*/
因此,如果使用k8s Java客户端的应用程序在其自身的集群上运行,则只要它具有正确的权限,它就应该能够访问集群上的内容。
您需要允许您的客户端应用程序能够访问CRD,例如CRDs of Prometheus Operator的ClusterRole
的示例:
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: prometheus-crd-view
labels:
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rbac.authorization.k8s.io/aggregate-to-view: "true"
rules:
- apiGroups: ["monitoring.coreos.com"]
resources: ["alertmanagers", "prometheuses", "prometheusrules", "servicemonitors"]
verbs: ["get", "list", "watch"]
答案 1 :(得分:0)
您可以使用Kubernetes API,只需安装curl。
curl http://localhost:8080/api/v1/namespaces/default/pods
只需将localhost
更改为apiserver ip address
/ dns name
您应该阅读Kubernetes API documentation。
此外,您将需要配置RBAC的访问和权限。
群集中的容器填充有用于对API服务器进行身份验证的令牌。
您可以通过在cat /var/run/secrets/kubernetes.io/serviceaccount/token
内执行POD
来验证。
这样,您从容器内部对apiserver的请求可能如下所示:
curl -ik \
-H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
https://kubernetes.default.svc.cluster.local/api/v1/namespaces/default/pods
您还可以将kubectl
安装在容器内,并设置所需的权限see this for more details。
我建议您阅读Installing kubectl in a Kubernetes Pod和The Kubernetes API call is coming from inside the cluster!
与其他Java客户端一样,还有非官方客户端库,例如Java (OSGi)和Java (Fabric8, OSGi)。