了解kubernetes端口转发、port和targetPort

Understanding kubernetes port forwarding, port and targetPort

所以,据我了解,port 是服务处理请求的端口,targetPort 是容器服务器中的应用请求的端口。

targetPort 甚至不需要指定,它通常与 containerPort 相同(我从 Whosebug 答案中得到这个,我通过删除 targetPort)

Kubernetes 端口转发将本地端口上收到的请求转发到远程端口(服务运行的地方)。 I have been following this article to understand this better

在我的应用程序中,规范是使用 helm 创建的。我的 port 设置为 80,我的 containerPort 设置为 5000(这是一个非常简单的 Flask 应用程序)。

按照 link 中提到的示例,以下应该有效:

kubectl --namespace default port-forward $POD_NAME 7000:80

但这个有效:

kubectl --namespace default port-forward $POD_NAME 7000:5000

有没有我没理解正确的地方?这是我的广告连播的 kubectl describe

Name:           mock-python-server-9f5b557f5-klxq8
Namespace:      default
Priority:       0
Node:           docker-desktop/192.168.65.3
Start Time:     Thu, 21 Jan 2021 13:59:40 -0800
Labels:         app.kubernetes.io/instance=mock-python-server
                app.kubernetes.io/name=mock-python-server
                pod-template-hash=9f5b557f5
Annotations:    <none>
Status:         Running
IP:             10.1.2.39
Controlled By:  ReplicaSet/mock-python-server-9f5b557f5
Containers:
  master:
    Container ID:   docker://7e258d94c458f47c1add418c7969e77fbaa532c56df7405681e778d5f0e63d01
    Image:          <image>
    Image ID:       <image_id>
    Port:           5000/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Thu, 21 Jan 2021 13:59:43 -0800
    Ready:          True
    Restart Count:  0
    Limits:
      cpu:     100m
      memory:  128Mi
    Requests:
      cpu:      100m
      memory:   128Mi
    Liveness:   http-get http://:http/health delay=0s timeout=1s period=10s #success=1 #failure=3
    Readiness:  http-get http://:http/health delay=0s timeout=1s period=10s #success=1 #failure=3
    Environment:
      env:  LOCAL
...

这是来自 deployment.yaml 的片段:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "master.fullname" . }}
  labels:
    {{- include "master.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "master.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "master.selectorLabels" . | nindent 8 }}
    spec:
    {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
    {{- end }}

      serviceAccountName: {{ include "master.serviceAccountName" . }}
      securityContext:
        {{- toYaml .Values.podSecurityContext | nindent 8 }}
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          env:
            - name: env
              value: {{ .Values.environment }}
          ports:
            - name: http
              containerPort: 5000 #{{ .Values.flaskPort }}
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /health
              port: http
          readinessProbe:
            httpGet:
              path: /health
              port: http
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
    {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
    {{- end }}
    {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
    {{- end }}

和我的 service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: {{ include "master.fullname" . }}
  labels:
    {{- include "master.labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: 80 #{{ .Values.service.port }}
      targetPort: 5000
      protocol: TCP
      name: http
  selector:
    {{- include "master.selectorLabels" . | nindent 4 }}

我哪里错了?

您的 kubernetes(k8s) 应用程序正在侦听其容器端口:5000,因此为了能够从您的机器访问您:

 kubectl --namespace default port-forward $POD_NAME 7000:5000

这将允许您在端口 7000 上将外部 k8s 连接到您的应用程序

您的应用监听端口设置为 5000 ,而不是 80 ...

当使用端口转发时,它会连接到集群内的指定资源,因此命令 kubectl --namespace default port-forward $POD_NAME 7000:80 意味着您要从本地主机端口 7000 连接到名为 $POD_NAME 的资源端口 80

上的资源

根据您的描述,您实际上不想连接到 pod,而是连接到服务(当集群内部的端口 80 发出请求时,它指向您想要在端口 5000 上的 pod)。所以你需要在你的命令中指定服务名称,像这样:

kubectl port-forward svc/{{your service name}} 7000:80