【问题标题】:Do Kubernetes service IPs change?Kubernetes 服务 IP 会改变吗?
【发布时间】:2016-09-23 16:29:57
【问题描述】:

我对 kubernetes/docker 很陌生,如果这是一个愚蠢的问题,我深表歉意。

我有一个正在访问一些服务的 pod。在我的容器中,我正在运行一个 python 脚本并且需要访问该服务。目前我正在使用服务的 IP 地址执行此操作。

服务IP地址稳定还是使用environment variables更好?如果是这样,一些关于这样做的提示会很棒。

Services Documentation 的开头段落给出了服务的动机,这意味着稳定的 IP 地址,但我从未看到它明确说明过:

虽然每个 Pod 都有自己的 IP 地址,但即使是这些 IP 地址也不能随着时间的推移保持稳定。这导致了一个问题:如果一组 Pod(我们称它们为后端)为 Kubernetes 集群内的其他 Pod(我们称它们为前端)提供功能,那么这些前端如何找出并跟踪该集合中的哪些后端?

进入服务。

我的 pod 规格供参考:

kind: Pod
apiVersion: v1
metadata:
  name: fetchdataiso 
  labels:
    name: fetchdataiso
spec:
  containers:
    - name: fetchdataiso 
      image: 192.111.1.11:5000/ncllc/fetch_data
      command: ["python"]
      args: ["feed/fetch_data.py", "-hf", "10.222.222.51", "-pf", "8880", "-hi", "10.223.222.173", "-pi","9101"]

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    简短的回答是“是的,服务 IP 可以改变”

    $ kubectl apply -f test.svc.yml
    service "test" created
    
    $ kubectl get svc
    NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    kubernetes   10.12.0.1       <none>        443/TCP   10d
    test         10.12.172.156   <none>        80/TCP    6s
    
    $ kubectl delete svc test
    service "test" deleted
    
    $ kubectl apply -f test.svc.yml
    service "test" created
    
    $ kubectl get svc
    NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    kubernetes   10.12.0.1       <none>        443/TCP   10d
    test         10.12.254.241   <none>        80/TCP    3s
    

    长答案是,如果你使用得当,你不会有任何问题。在您的问题范围内更重要的是 ENV 变量比 DNS/IP 耦合更糟糕。 您应该通过 serviceservice.namespace 甚至完整路径来引用您的服务,例如 test.default.svc.cluster.local强>。这将被解析为服务 ClusterIP,并且与您的 ENV 相反,它可以重新解析为新 IP(除非您明确删除并重新创建服务,否则这可能永远不会发生),而正在运行的进程的 ENV 不会改变

    【讨论】:

    • 我认为关键是服务 IP 将保持稳定,直到您决定删除/重新创建它。但我确实同意使用 dns 名称更好。
    • 在这种情况下(服务重启)是否有比 DNS(客户端可以缓存旧条目)更好的服务发现方式?
    • @prat0318 实际上这是一种非常罕见的情况,通常您会使用apply 而不是deletecreate,如我的示例所示。因为 kubernetes 服务发现非常强大(当你改变底层 pod 时,它们的 IP 会改变,但你仍然指向根本没有改变的 clusterIP)
    【解决方案2】:

    服务IP地址稳定。如果您没有更好的方法来发现 IP 地址(例如 DNS),您应该只需要使用环境变量。

    【讨论】:

    • 谢谢,文档链接会非常有帮助。我的老板不相信我!我尝试用环境变量替换 args 中的 IP 地址,例如:“$IQFEED_SERVICE_HOST”,但 pod 一直在崩溃。访问它们的正确方法是什么?我知道环境变量存在,因为我登录到一个正在运行的容器并运行显示 IP 的 echo $IQFEED_SERVICE_HOST。
    【解决方案3】:

    如果您使用集群中的 DNS 集群插件来访问您的服务,并且您的服务在命名空间 bar 中称为 foo,您也可以将其访问为 bar.foo,这可能比普通的更有意义IP 地址。

    http://kubernetes.io/docs/user-guide/services/#dns

    【讨论】:

    • 谢谢。我将如何在我的 pod 规范中使用它?我有两个命名空间 kube-systemdefault。我的服务名称是 ssdb-feed。那么我会通过 ssdb-feed.kube-system 代替 IP 地址吗?我试过了,吊舱崩溃了。
    • @Shuaib 您的服务可能在默认命名空间中。只要您的 pod 在同一个命名空间中,只需传入 ssdb-feed 就可以了。如果你想验证,你可以运行一个busybox pod并尝试从集群中解析服务的名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2017-12-08
    • 2017-10-21
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多