【问题标题】:kubernetes get endpint in the containerskubernetes 在容器中获取端点
【发布时间】:2021-05-13 22:38:23
【问题描述】:

在 kubernetes vm 上运行,例如:kubectl get endpoints 如何在 pod 内获得相同的输出,我应该在 pod 内运行什么? 我知道有一个 kubeapi,但我是 kubernetes 的新手,有人可以解释我如何使用它

这是我的集群角色绑定:

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: {{ template "elasticsearch.fullname" . }}
  labels:
    app: {{ template "elasticsearch.name" . }}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    release: "{{ .Release.Name }}"
    heritage: "{{ .Release.Service }}"
subjects:
- kind: ServiceAccount
  name: {{ template "elasticsearch.serviceAccountName.client" . }}
  namespace: {{ .Release.Namespace }}
roleRef:
  kind: ClusterRole
  name: {{ template "elasticsearch.fullname" . }}
  apiGroup: rbac.authorization.k8s.io

clusterrole.yaml:


apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name:  {{ template "elasticsearch.fullname" . }}
  labels:
    app: {{ template "elasticsearch.name" . }}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    release: "{{ .Release.Name }}"
    heritage: "{{ .Release.Service }}"
rules:
#
# Give here only the privileges you need
#
- apiGroups: [""]
  resources:
  - pods
  - endpoints
  verbs:
  - get
  - watch
  - list

服务帐户:

---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app: {{ template "elasticsearch.name" . }}
    chart: {{ .Chart.Name }}-{{ .Chart.Version }}
    component: "{{ .Values.client.name }}"
    heritage: {{ .Release.Service }}
    release: {{ .Release.Name }}
  name: {{ template "elasticsearch.client.fullname" . }}

【问题讨论】:

标签: kubernetes containers kubernetes-pod kube-apiserver


【解决方案1】:

您不必在 pod 中安装 kubectl 即可访问 Kubernetes API。您将能够使用任何可以发出 HTTP 请求的工具来完成。

Kubernetes API 是一个简单的 HTTP REST API,如果容器作为集群中的 Pod 运行,您需要的所有身份验证信息都存在于容器中。

从集群中的容器内到名为your-serviceget the Endpoints object,您可以这样做:

$ curl -k -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
  https://kubernetes.default.svc:443/api/v1/namespaces/{namespace}/endpoints/your-service

{namespace} 替换为your-service Endpoints 资源的命名空间。_

要提取返回的 JSON 管道的 IP 地址,请将输出发送到 jq 等工具:

... | jq -r '.subsets[].addresses[].ip'

重要提示: 执行此操作的 Pod 需要 Endpoints 资源的读取权限,否则 API 请求将被拒绝。

您可以通过创建 ClusterRole、ClusterRoleBinding 和服务帐户来做到这一点 - 设置一次:

$ kubectl create sa endpoint-reader-sa
$ kubectl create clusterrole endpoint-reader-cr --verb=get,list --resource=endpoints
$ kubectl create clusterrolebinding endpoint-reader-crb --serviceaccount=default:endpoint-reader-sa --clusterrole=endpoint-reader-cr

接下来使用创建的 ServiceAccount - endpoint-reader-sa 用于您要从中执行上述 curl 命令的 Pod,方法是在 pod.spec.serviceAccountName 字段中指定它。

为任何不同的 API 操作授予权限的工作方式相同。

来源:get-pod-ip

@ITChap 也提到了类似的答案:kubectl-from-inside-the-pod

【讨论】:

  • 感谢您帮助我添加了我的配置问题,但我不断收到:},“状态”:“失败”,“消息”:“端点被禁止:用户\“系统:匿名\”不能在命名空间 \default\"" 中的 API 组 \"\" 中列出资源 \"endpoints\", "reason": "Forbidden", "details": { "kind": "endpoints" }, "code": 403这里可能有什么问题?
  • 您能否确保您的 kubelet 使用 --authentication-token-webhook 标志 kubernetes.io/docs/reference/command-line-tools-reference/… 运行?如果不添加,然后使用命令重启 kubelet:sudo systemctl restart kubelet
  • 我成功地仅在我的命名空间中为我的服务获取端点有没有办法从所有命名空间获取? curl -k -H "授权:承载 $(cat /var/run/secrets/kubenetes.io/serviceaccount/token)" kubernetes.default.svc:443/api/v1/namespaces/default/endpoints/…
  • 我认为你不能在 pod 中做到这一点,Pod 被隔离在命名空间中。通常,如果他们没有足够的权限,他们没有关于不同命名空间(简单应用程序 pod)或不同 pod 中的资源的信息。如果我的回答有用,请接受并投票以在社区中更显眼。
猜你喜欢
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 2020-06-27
  • 2019-12-20
  • 1970-01-01
  • 2019-07-21
  • 2019-05-29
相关资源
最近更新 更多