Kubernetes-卷曲Cluster-IP服务

时间:2020-11-07 14:56:36

标签: kubernetes

我正在按照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控制台上执行相同的操作,但结果相同。我只能卷曲我的外部IP服务。

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

我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

  • ClusterIP (默认)-在群集的内部IP上公开服务。此类型使服务仅可从群集内访问。这就是为什么您无法从群集外部通过ClusterIP访问服务的原因。
  • NodePort -使用NAT将服务公开到群集中每个选定节点的相同端口上。使用<NodeIP>:<NodePort>从群集外部访问服务。 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指定)公开服务。不使用代理。此类型要求kube-dns的v1.7或更高版本。服务本身仅在群集中公开,但是FQDN external-name不受群集处理或控制。这可能是可公开访问的URL,因此您可以在任何地方卷曲。您必须以一种限制谁可以访问它的方式来配置域。

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

查看更多:esposing-services-kubernetes

答案 1 :(得分:0)

ClusterIP仅在kubernetes网络内部可用。

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

或..

kubectl端口转发 8080:80

然后卷曲

卷曲http:// localhost:8080

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