如何在新命名空间内部公开Kubernetes API?

时间:2017-07-15 22:21:13

标签: networking kubernetes

默认情况下,Kubernetes会在默认的namesapce中添加kubernetes服务。这允许从该命名空间中的任何pod访问kubernetes API。

例如,我可以

TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
kubectl exec -it $SOME_POD -- bash
curl -v https://kubernetes/api/v1/ \
  -H "Authorization: Bearer $TOKEN" \
  -k -v

得到类似的东西:

< HTTP/1.1 200 OK
< Content-Type: application/json
< Date: Sat, 15 Jul 2017 22:16:09 GMT
< Transfer-Encoding: chunked
<
{
  "kind": "APIResourceList",
  "groupVersion": "v1",
  "resources": [
    {
      "name": "bindings",
      "namespaced": true,
  ...

如果我创建新的命名空间,默认情况下没有kubernetes服务。我尝试使用以下资源服务定义创建一个(基本上从默认命名空间复制):

apiVersion: v1
kind: Service
metadata:
  labels:
    component: apiserver
    provider: kubernetes
  name: kubernetes
  resourceVersion: "12"
spec:
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
  sessionAffinity: ClientIP
  type: ClusterIP

但这似乎不起作用,因为似乎与任何吊舱有关。

基本上,我想要在新创建的命名空间中与default命名空间中的行为相同。

当前版本:

{
  "major": "1",
  "minor": "5",
  "gitVersion": "v1.5.7",
  "gitCommit": "8eb75a5810cba92ccad845ca360cf924f2385881",
  "gitTreeState": "clean",
  "buildDate": "2017-04-27T09:42:05Z",
  "goVersion": "go1.7.5",
  "compiler": "gc",
  "platform": "linux/amd64"
}

2 个答案:

答案 0 :(得分:2)

您可以通过限定主机名来访问其他命名空间中的kubernetes服务:

主机名kubernetes.default.svckubernetes.default.svc.cluster.local$KUBERNETES_SERVICE_HOST中包含的IP都将从任何命名空间解析为kubernetes API服务。

按照您的示例,您可以从任何命名空间执行此操作:

TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
kubectl exec -it $SOME_POD -- bash
curl -v https://kubernetes.default.svc/api/v1/ \
  -H "Authorization: Bearer $TOKEN" 
  -k -v

答案 1 :(得分:1)

我认为所有名称空间的服务IP都是相同的。对于新的命名空间kubernetes服务IP作为环境变量 KUBERNETES_SERVICE_HOST 来到POD。

你可以像这样访问api。

TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
curl -k -v https://$KUBERNETES_SERVICE_HOST/api/v1/   -H "Authorization: Bearer $TOKEN

我测试了这个版本1.7.1。我没有旧版本的群集。你可以测试一下并更新状态。

由于 SR