了解kubernetes端口转发、端口和目标端口
因此,我的理解是,了解kubernetes端口转发、端口和目标端口,kubernetes,portforwarding,Kubernetes,Portforwarding,因此,我的理解是,port是服务提供请求的端口,targetPort是容器服务器中的应用程序请求的端口 targetPort甚至不需要指定,它通常与containerPort相同(我是从StackOverflow答案中得到的,并通过删除targetPort对其进行验证) Kubernetes端口转发将在本地端口接收到的请求转发到远程端口(服务运行的位置) 在我的应用程序中,规范是使用helm创建的。我的端口设置为80,我的容器端口设置为5000(这是一个非常简单的烧瓶应用程序) 按照该链接中提到
port
是服务提供请求的端口,targetPort
是容器服务器中的应用程序请求的端口
targetPort
甚至不需要指定,它通常与containerPort
相同(我是从StackOverflow
答案中得到的,并通过删除targetPort
对其进行验证)
Kubernetes端口转发将在本地端口接收到的请求转发到远程端口(服务运行的位置)
在我的应用程序中,规范是使用helm
创建的。我的端口
设置为80
,我的容器端口
设置为5000
(这是一个非常简单的烧瓶应用程序)
按照该链接中提到的示例,以下内容应起作用:
kubectl --namespace default port-forward $POD_NAME 7000:80
但这一条起作用了:
kubectl --namespace default port-forward $POD_NAME 7000:5000
有什么我没听懂的吗?以下是我的pod的kubectl描述:
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
...
和我的服务.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 }}
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
这将允许您将k8s外部连接到端口7000上的应用程序
您的应用程序侦听端口设置为5000,而不是80…当使用端口转发时,它会通过隧道连接到集群内的指定资源,因此命令kubectl——名称空间默认端口转发$POD\u NAME 7000:80
,表示您要从本地主机端口7000连接到名为$POD_NAME
的资源,并连接到端口80上的资源
根据您的描述,您实际上不想连接到pod,而是要连接到服务(当集群内的端口80发出请求时,该服务指向端口5000上您想要的pod)。因此,您需要在命令中指定服务名称,如下所示:
kubectl port-forward svc/{{your service name}} 7000:80
我刚刚添加了规格-可以检查一下吗?我确实有。我刚刚在问题中发布了我的完整规范哦,那么你想转发到一个服务,对吗?试试这个kubectl-port-forward-svc/{{your-service-name}}7000:80
…这很有效!!那么,当我没有提到service/my service
时,在前面的命令中会发生什么?为什么它只能成功地从本地端口上的7000
转发到集装箱上的5000
?