了解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
所以,据我了解,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