前言:
可以使用 Kubernetes API 获取集群信息。使用 Service Account(SA)进行身份验证,可以以安全的方式访问 Kubernetes API,而无需在 Pod 中使用明文凭据。
以下是一个使用 Service Account 访问 Kubernetes API 获取集群信息的示例:
整体步骤
以下是一个使用 Service Account 访问 Kubernetes API 获取集群信息的示例:
1 创建一个名为 "my-sa" 的 Service Account:
bash
kubectl create serviceaccount my-sa
2. 创建一个名为 "my-role" 的 Role,并授予访问 "pods" 和 "nodes" 资源的权限:
cat <<EOF | kubectl apply -f -
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: my-role
rules:
- apiGroups: [""]
resources: ["pods", "nodes"]
verbs: ["get", "list", "watch"]
EOF
上面命令好像没有结尾 2-role的 yaml如下
yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: my-role
rules:
- apiGroups: [""]
resources: ["pods", "nodes"]
verbs: ["get", "list", "watch"]
3. 将 "my-role" Role 绑定到 "my-sa" Service Account:
bash
kubectl create rolebinding my-role-binding --role=my-role --serviceaccount=default:my-sa
4. 在 Pod 中使用 "my-sa" Service Account 访问 Kubernetes API:
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
serviceAccountName: my-sa
containers:
- name: my-container
image: yauritux/busybox-curl # curlimages/curl gep推荐镜像 curl版本较高
command: ["sh", "-c", "while true; do sleep 3600; done"]
5. 进入 Pod 中,并使用 curl 命令访问 Kubernetes API 获取集群信息:
kubectl exec -it my-pod -- sh
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
#curl -H "Authorization: Bearer $TOKEN" https://kubernetes.default.svc/api/v1/nodes
推荐跳过认证 不然会报证书错误 curl: (35) error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
curl -k -H "Authorization: Bearer $TOKEN" https://kubernetes.default.svc/api/v1/nodes
在上述示例中,我们创建了一个名为 "my-sa" 的 Service Account,并使用 Role 和 RoleBinding 为其授予了访问 "pods" 和 "nodes" 资源的权限。然后,在 Pod 中使用 "my-sa" Service Account 访问 Kubernetes API,使用 curl 命令获取集群中的节点信息。
最后虽然报错,但是还是一次不错的实践
powershell
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "nodes is forbidden: User \"system:serviceaccount:default:my-sa\" cannot list resource \"nodes\" in API group \"\" at the cluster scope",
"reason": "Forbidden",
"details": {
"kind": "nodes"
},
"code": 403