【问题标题】:Why unable to access a service if setting externalTrafficPolicy to Local in a kubernetes cluster如果在 kubernetes 集群中将 externalTrafficPolicy 设置为 Local,为什么无法访问服务
【发布时间】:2018-04-30 21:59:36
【问题描述】:

我正在按照 this 指南将源 ip 功能应用到我的 kubernetes 集群。

首先,我通过运行创建了一个 pod:

$ kubectl run source-ip-app --image=gcr.io/google_containers/echoserver:1.4

然后将其公开为 NodePort 服务:

kubectl expose deployment source-ip-app --name=nodeport --port=80 --target-port=8080 --type=NodePort

此时,我可以从集群外部访问服务并获得正确的 client_address:

$ 卷曲 10.74.68.49:16860 | grep 客户端
% 总计 % 接收 % Xferd 平均速度 时间 时间 时间 当前
下载上传总花费的剩余速度
100 296 0 296 0 0 43167 0 --:--:-- --:--:-- --:--:-- 49333
客户端地址=10.168.193.130

但如果应用源 ip 功能:

kubectl patch svc nodeport -p '{"spec":{"externalTrafficPolicy":"Local"}}'

我会超时:

$ 卷曲 10.74.68.49:16860 | grep 客户端
% 总计 % 接收 % Xferd 平均速度 时间 时间 时间 当前
下载上传总花费的剩余速度
0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0curl: (7) 连接 10.74.68.49 端口 16860 失败:操作超时

我想知道这背后的原因是什么以及如何解决它。

我的环境信息:

$ kubectl 版本
客户端版本:version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.3", GitCommit:"2c2fe6e8278a5db2d15a013987b53968c743f2a1", GitTreeState:"clean", BuildDate:"2017-08-03T07:00: 21Z", GoVersion:"go1.8.3", 编译器:"gc", 平台:"linux/amd64"}
服务器版本:version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.3", GitCommit:"2c2fe6e8278a5db2d15a013987b53968c743f2a1", GitTreeState:"clean", BuildDate:"2017-08-03T06:43: 48Z", GoVersion:"go1.8.3", 编译器:"gc", 平台:"linux/amd64"}

更新:

我的集群有2个节点,无论访问哪个节点ip都会出现超时问题。

【问题讨论】:

  • 教程文档说如果服务没有本地端点,数据包将被丢弃并且不会转发。你能发布kubectl get ep nodeport -o json | grep nodeName的输出吗?
  • @stacksonstacks,感谢您的评论。得到的端点是:“nodeName”:“10.74.68.48”,“nodeName”:“10.74.68.49”。使用 --hostname-override=${ip} 部署集群。根据this 的说法,由于重命名,kube-proxy 无法找到本地端点。我试图弄清楚如何避免这种情况。因为在我的产品环境中,主机名被覆盖了。
  • 该线程说每个 kube-proxy 上的设置 --hostname-override=${ip} 应该可以解决问题。您是否这样做并重新启动了 kube-proxy pod?
  • 我正在尝试这样做,因为我的 kube-proxy 是一个 DaemonSet,我正在研究如何将 --hostname-override 传递给它。

标签: ip client kubernetes


【解决方案1】:

创建 kube-proxy.yaml

kubectl get ds -n kube-system kube-proxy -o yaml > kube-proxy.yaml

编辑kube-proxy.yaml 以包含HOST_IP 参数

# ...
spec:
  containers:
  - command:
    - ./hyperkube
    - proxy
    - --cluster-cidr=10.2.0.0/16
    - --hostname-override=$(HOST_IP)
    - --kubeconfig=/etc/kubernetes/kubeconfig
    - --proxy-mode=iptables
    env:
    - name: HOST_IP
      valueFrom:
          fieldRef:
              apiVersion: v1
              fieldPath: status.hostIP
    #...

更新 pod:

kubectl apply -f kube-proxy.yaml

这将应用https://github.com/kubernetes/kubernetes/issues/48437 中提到的修复,解决丢包问题。

【讨论】:

    猜你喜欢
    • 2021-04-12
    • 2020-11-20
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多