【问题标题】:Kubernetes - Curl a Cluster-IP ServiceKubernetes - 卷曲集群 IP 服务
【发布时间】:2020-11-09 20:57:10
【问题描述】:

我正在按照这个 kubernetes 教程创建服务https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#creating-a-service

我在本地环境中使用 minikube。一切正常,但我无法卷曲我的集群 IP。我有一个操作超时:

curl: (7) Failed to connect to 10.105.7.117 port 80: Operation timed out

我的kubectl get svc

NAME           TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes     ClusterIP      10.96.0.1       <none>        443/TCP        5d17h
my-nginx       ClusterIP      10.105.7.117    <none>        80/TCP         42h

我的问题似乎与这里没有找到任何答案的人相同:https://github.com/kubernetes/kubernetes/issues/86471

我尝试在我的 gcloud 控制台上执行相同的操作,但结果相同。我只能 curl 我的外部 IP 服务。

如果我理解得很好,我想当我启动 minikube 时我已经在我的 minikube 本地集群中,所以对我来说,我应该能够像教程中提到的那样卷曲服务。

我做错了什么?

【问题讨论】:

  • 您需要实际位于集群内部,例如 kubectl run pod。仅仅在 pod 外的节点上,或者在你碰巧运行 minikube 的主机上,是不够的。

标签: kubernetes


【解决方案1】:

虽然每个 Pod 都有一个唯一的 IP 地址,但这些 IP 在没有 Service 的情况下不会暴露在集群之外。服务允许您的应用程序接收流量。通过在 ServiceSpec 中指定 type,可以以不同的方式公开服务:

  • ClusterIP(默认)- 在集群的内部 IP 上公开服务。这种类型使服务只能从集群内访问。这就是为什么您无法从集群外部通过 ClusterIP 访问您的服务的原因。
  • NodePort - 使用 NAT 在集群中每个选定节点的同一端口上公开服务。使用 &lt;NodeIP&gt;:&lt;NodePort&gt; 从集群外部访问服务。 ClusterIP 的超集。
kind: Service
apiVersion: v1
metadata:
  name: example
  namespace: example
spec:
  type: NodePort
  selector:
    app: example
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      name: ui

然后执行命令:

$ kubectl get svc --namespace=example

NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
jenkins-ui         NodePort    yy.zz.xx.xx     <none>        8080:30960/TCP   1d

获取minikube ip获取nodeIP

$ minikube ip
aa.bb.cc.dd

然后你可以卷曲它:

curl http://aa.bb.cc.dd:8080
  • LoadBalancer - 在当前云中创建一个外部负载均衡器(如果支持)并为服务分配一个固定的外部 IP。 NodePort 的超集。
kind: Service
apiVersion: v1
metadata:
  name: example
spec:
  selector:
    app: example
  ports:
  - protocol: "TCP"
    port: 8080
    targetPort: 8080
  type: LoadBalancer
  externalIPs:
  - <your minikube ip>

然后你可以卷曲它:

$ curl http://yourminikubeip:8080/
  • ExternalName - 通过返回带有名称的 CNAME 记录,使用任意名称(由规范中的 externalName 指定)公开服务。没有使用代理。此类型需要 v1.7 或更高版本的 kube-dns。服务本身仅在集群内公开,但是 FQDN external-name 不由集群处理或控制。这可能是一个可公开访问的 URL,因此您可以从任何地方进行 curl。您必须以限制谁可以访问它的方式配置您的域。

服务类型 externalName 在集群外部,实际上只允许 CNAME 从集群内重定向到外部路径。

查看更多:esposing-services-kubernetes。

【讨论】:

    【解决方案2】:

    ClusterIP 仅在 Kubernetes 网络内可用。

    如果您希望能够从集群外部访问它,请使用 LoadBalancer 公开一个公共 IP,然后您可以从集群外部访问该 IP

    或者..

    kubectl 端口转发 8080:80

    然后卷曲

    卷曲 http://localhost:8080

    它将通过端口转发路由到 pod 的端口 80。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多