默认情况下,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"
}
答案 0 :(得分:2)
您可以通过限定主机名来访问其他命名空间中的kubernetes
服务:
主机名kubernetes.default.svc
,kubernetes.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