为什么我的服务不能将流量传递到 minikube 上具有命名端口的 pod?

Why can't my service pass traffic to a pod with a named port on minikube?

我在使用 Marko Luksa 的 Kubernetes In Action 的第 5.1.1 使用命名端口 节中的示例时遇到问题。这个例子是这样的:

首先 - 创建

我正在创建一个带有命名端口的 pod,它运行一个 Node.js 容器,当它被命中时以 You've hit <hostname> 响应:

apiVersion: v1
kind: Pod
metadata:
  name: named-port-pod
  labels:
    app: named-port
spec: 
  containers:
  - name: kubia
    image: michaellundquist/kubia
    ports:
    - name: http
      containerPort: 8080

还有这样的服务(请注意,这是 original example 的简化版本,它也不起作用。:

apiVersion: v1
kind: Service
metadata:
  name: named-port-service
spec:
  ports:
  - name: http
    port: 80
    targetPort: http
  selector:
    app: named-port

其次 - 验证

$ kubectl get po -o wide --show-labels
NAME             READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES   LABELS
named-port-pod   1/1     Running   0          45m   172.17.0.7   minikube   <none>           <none>            app=named-port


$ kubectl get services
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes           ClusterIP   10.96.0.1       <none>        443/TCP   53m
named-port-service   ClusterIP   10.96.115.108   <none>        80/TCP    19m

$ kubectl describe service named-port-service 
Name:              named-port-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=named-port
Type:              ClusterIP
IP:                10.96.115.108
Port:              http  80/TCP
TargetPort:        http/TCP
Endpoints:         172.17.0.7:8080
Session Affinity:  None
Events:            <none>

第三 - 测试(失败)

$ kubectl exec named-port-pod -- curl named-port-pod:8080
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    26    0    26    0     0   5494      0 --:--:-- --:--:-- --:--:--  6500
You've hit named-port-pod

$ kubectl exec named-port-pod -- curl --max-time 20 named-port-service
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:19 --:--:--     0curl: (28) Connection timed out after 20001 milliseconds
command terminated with exit code 28

如您所见,当我点击 named-port-pod:8080 时一切正常,但当我点击 named-port-service 时一切都失败了。我很确定我的映射是正确的,因为 kubectl describe service named-port-service 有正确的端点我认为 minikube can use named ports 但我的服务无法将连接传递到我的 pod。为什么?

p.s 这是我的 minikube 版本:

$ minikube version
minikube version: v1.6.2
commit: 54f28ac5d3a815d1196cd5d57d707439ee4bb392

这是 minikube 的已知问题。 Pod 无法通过服务 IP 访问自身。您可以尝试从不同的 pod 访问您的服务或使用以下解决方法来解决此问题。

minikube ssh
sudo ip link set docker0 promisc on

未决问题:https://github.com/kubernetes/minikube/issues/1568