Skip to main content

在Pod中访问k8s接口

使用官方客户端库

这是最简单的方法,可以自动查找 api 服务和鉴权。

直接访问 rest 接口

可以通过集群的 kubernetes 服务和 default 命名空间访问,所以可以通过 kubernetes.default.svc 域名来访问服务。

推荐通过服务账号认证进行鉴权。默认Pod关联了一个服务账号和一个对应的鉴权 token, 文件被放在 Pod 的 container 的 /var/run/secrets/kubernetes.io/serviceaccount/token 目录。

认证文件放在 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 目录。

最后,用于命名空间 API 操作的默认命名空间放置在每个容器的 /var/run/secrets/kubernetes.io/serviceaccount/namespace 的文件中。

使用 kubectl 代理

执行 kubectl proxy 命令,kubectl proxy 自动对接口鉴权,在 Pod 中创建新的 container,Pod 中的其他 container 可以直接通过 localhost 访问,

不使用 kubectl 代理

也可以不通过鉴 kubectl 代理,直接通过鉴权 token 访问接口。

# Point to the internal API server hostname
APISERVER=https://kubernetes.default.svc

# Path to ServiceAccount token
SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount

# Read this Pod's namespace
NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)

# Read the ServiceAccount bearer token
TOKEN=$(cat ${SERVICEACCOUNT}/token)

# Reference the internal certificate authority (CA)
CACERT=${SERVICEACCOUNT}/ca.crt

# Explore the API with TOKEN
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api

输出

{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}

参考