Kubernetes - Curl 集群 IP 服务

Kev*_*vin 6 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
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

看来我遇到了同样的问题,这些人没有找到他的问题的任何答案:https://github.com/kubernetes/kubernetes/issues/86471

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

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

我做错了什么?

Mal*_*ata 8

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

  • 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
Run Code Online (Sandbox Code Playgroud)

然后执行命令:

$ 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
Run Code Online (Sandbox Code Playgroud)

Get minikube ip 获取nodeIP

$ minikube ip
aa.bb.cc.dd
Run Code Online (Sandbox Code Playgroud)

然后你可以卷曲它:

curl http://aa.bb.cc.dd:8080
Run Code Online (Sandbox Code Playgroud)
  • 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>
Run Code Online (Sandbox Code Playgroud)

然后你可以卷曲它:

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

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

查看更多:espose-services-kubernetes