【问题标题】:How to access a kubernetes service in GCP by name from a vm?如何从虚拟机按名称访问 GCP 中的 kubernetes 服务?
【发布时间】:2019-11-01 08:54:06
【问题描述】:

我在命名空间 myNamespace 中有一个名为 myService 的 gcp 中托管的负载平衡 kubernetes 服务。我给它一个标签“myKubeTag”。我还有一个正在运行的 vm,它本身正在运行一个想要与 myService 通信的 docker 容器。我已经创建了一个防火墙规则来允许两者之间的 tcp 流量。

我可以把服务的IP地址给vm来连接,我想问的是,如何设置名称代理,让vm直接通过名称引用?

工作负载和服务从 helm 启动,如下所示:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: {{ template "app.prefix" . }}
spec:
  selector:
    matchLabels:
      name: {{ template "app.prefix" . }}
  template:
    metadata:
      labels:
        name: {{ template "app.prefix" . }}
    spec:
      nodeSelector:
        target_workload: {{ .Values.prefix }}-myApp
      containers:
        - name: myApp
          image: {{ .Values.myApp.image }}
      tolerations:
        - key: "target_workload"
          operator: "Equal"
          value: {{ .Values.prefix }}-myApp
          effect: "NoSchedule"

---

apiVersion: v1
kind: Service
metadata:
  name: {{ template "app.prefix" . }}
spec:
  ports:
    - name: http
      protocol: TCP
      port: 8080
      targetPort: 8080
  type: LoadBalancer
  selector:
    role: {{ template "app.prefix" . }}

我已准备好以下内容: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

这让我认为主机名是 myService.myNamespace.sxc.cluster-domain.myCluster,但是在我的 VM 上运行的容器抛出了一个未知主机异常。

【问题讨论】:

  • 您能否澄清它是否已经在使用 IP 地址工作(假设 GKE 集群是使用 IP 别名设置的)?展示它的工作示例会很有帮助,这样我们就有了更多的上下文。
  • 你是如何设置 LB 的?
  • @AndyShinn 我已对其进行了更新以包含工作负载和服务的清单。他们非常标准。我可以从服务中请求集群 IP,并取回一个有效的 IP。我想知道的是,从在同一个项目中运行的虚拟机的角度来看,访问同一个服务的有效主机名是什么?
  • 我基本上想知道您是否根据cloud.google.com/kubernetes-engine/docs/how-to/alias-ips 设置了别名 IP。但我不想只给出这个链接作为答案,所以我试图使用私有云 DNS 给出一个更好的例子。

标签: networking kubernetes google-cloud-platform hostname


【解决方案1】:

一旦您在GCP 中使用服务type: LoadBalancer,它就会自动为您分配一个外部IP:

$ kubectl get svc
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
kubernetes   ClusterIP      10.12.0.1      <none>         443/TCP        162m
nginx-svc    LoadBalancer   10.12.15.100   35.232.130.5   80:30826/TCP   8m27s

在此示例中,域如下所示5.130.232.35.bc.googleusercontent.com

我已经通过在 nginx pod 内部执行 nslookup 进行了检查

$ kubectl exec nginx-deployment-85c9bf4fd7-h5tt9 nslookup 35.232.130.5
Server:         10.12.0.10
Address:        10.12.0.10#53

Non-authoritative answer:
5.130.232.35.in-addr.arpa       name = 5.130.232.35.bc.googleusercontent.com.

请记住,默认 nginx 图像中没有 nslookup,因此您需要安装它。

希望这就是您想要的。

【讨论】:

  • 这不是我想要的。问题是服务会上下波动,而且不一定每次都具有相同的 IP 地址。我想引用它的虚拟机寿命很长,所以我不想不断更新 IP。如果我可以给它一个静态主机名会更好,当那里存在某些东西时,VM 可以与之通信。
  • @Andy,你可以看看Access service from outside Kubernetes cluster。但这只会暴露集群内的Service
  • 老实说,我还是迷路了。它确实表明负载均衡器有一个外部 IP,但这仍然是一个生成的值?
  • 这不是静态IP,每次申请Service时都会生成。你可以使用Automatic DNS for Kubernetes Ingresses with ExternalDNS
猜你喜欢
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 2021-04-24
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多