【问题标题】:Kubernetes HyperV Cluster Expose ServiceKubernetes HyperV 集群公开服务
【发布时间】:2019-01-05 14:24:30
【问题描述】:

TL;DR;

如何从主机连接到我的 kubernetes 集群,通过 Hyper-V 连接到 Kubernetes 代理 (kube-proxy)。


所以我有两个 Ubuntu 18.04.1 LTS 服务器的 hyper-v 设置。相同的设置。

一个是大师

OS Image:                   Ubuntu 18.04.1 LTS
Operating System:           linux
Architecture:               amd64
Container Runtime Version:  docker://18.6.0
Kubelet Version:            v1.11.1
Kube-Proxy Version:         v1.11.1

另外一个节点:

OS Image:                   Ubuntu 18.04.1 LTS
Operating System:           linux
Architecture:               amd64
Container Runtime Version:  docker://18.6.0
Kubelet Version:            v1.11.1
Kube-Proxy Version:         v1.11.1

它默认运行这些 pod:

kube-system   coredns-78fcdf6894-6ld8l               1/1       Running   1          4h
kube-system   coredns-78fcdf6894-ncp79               1/1       Running   1          4h
kube-system   etcd-node1                             1/1       Running   1          4h
kube-system   kube-apiserver-node1                   1/1       Running   1          4h
kube-system   kube-controller-manager-node1          1/1       Running   1          4h
kube-system   kube-proxy-942xh                       1/1       Running   1          4h
kube-system   kube-proxy-k6jl4                       1/1       Running   1          4h
kube-system   kube-scheduler-node1                   1/1       Running   1          4h
kube-system   kubernetes-dashboard-6948bdb78-9fbv8   1/1       Running   0          25m
kube-system   weave-net-fzj8h                        2/2       Running   2          3h
kube-system   weave-net-s648g                        2/2       Running   3          3h

这两个节点通过两个 IP 地址暴露给我的 LAN:

192.168.1.116
192.168.1.115

我已经公开了我的部署:

service.yml:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort # internal cluster management
  ports:
  - port: 80 # container port
    nodePort: 30001 # outside port
    protocol: TCP
    targetPort: http
  selector:
    app: my-api
    tier: backend

列出:

$ kubectl get svc -o wide
my-service   NodePort    10.105.166.48   <none>        80:30001/TCP   50m       app=my-api,tier=backend
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        4h        <none>

如果我坐在我的主节点上并卷曲 pod

$ kubectl get pods -o wide
my-api-86db46fc95-2d6wf   1/1       Running   0          22m       10.32.0.7   node2
$ curl 10.32.0.7:80/api/health
{"success": true}

我的 api 显然在 pod 中。

当我查询服务IP时

$ curl 10.105.166.48:80/api/health

或

$ curl 10.105.166.48:30001/api/health

只是超时

我的主网络配置:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 192.168.1.116  netmask 255.255.255.0  broadcast 192.168.1.255

weave: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1376
    inet 10.40.0.0  netmask 255.240.0.0  broadcast 10.47.255.255

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
    inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

我的 iptables 只是将所有内容列为 source anywhere destination anywhere 并引用了大量对 KUBE 和 DOCKER 的引用。

我什至尝试设置dashboard 无济于事...

访问网址:

https://192.168.1.116:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

执行nslookup 不会显示主机名:

$ nslookup my-service
Server:         127.0.0.53
Address:        127.0.0.53#53

** server can't find eyemenu-api-service: SERVFAIL

【问题讨论】:

    标签: docker ubuntu kubernetes ubuntu-18.04


    【解决方案1】:

    要访问节点端口 30001,您需要使用节点的 ip。

    curl nodeip:30001/api/health

    集群内的 Pod 不知道节点端口 30001。

    nodePort 会将端口暴露给 Kubernetes 集群的所有工作节点,因此您可以使用以下任一方式:

    curl node1:30001/api/health 或 curl node2:30001/api/health

    【讨论】:

    • 我不应该卷曲节点,我应该能够卷曲服务......节点是短暂的
    • Kubernetes 服务在集群内部。如果不在 kube 集群中,您将无法访问服务名称。为了从外部访问您的 pod,您可以使用 ingress(例如 Ingress nginx)和指向运行 ingress 控制器的节点的虚拟主机或通过 nodeport。
    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 2020-06-15
    • 2020-09-13
    • 2017-02-13
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多