k8s服務的配置文件中幾個端口參數,nodePort、port、targetPort,剛開始的時候不理解什么意思很容易混淆寫錯,這里總結一下,概括來說就是nodePort和port都是k8s的service暴露的端口,targetPort是容器本身暴露的端口。區別是nodePort暴露給k8s集群外部流量訪問用,port暴露給k8s集群內部服務訪問用。從上兩個端口過來的數據最終都需要經過反向代理kube-proxy,流入后端pod的targetPort上,最后到達pod內的容器。
下面具體解釋一下
首先明確容器部署后是只需要k8s集群內部使用還是需要通過集群外使用,如果不需要集群外訪問就不需要nodePort,直接如下寫就可以
spec: clusterIP: None ports: - name: {{ .Values.service.name }}
下面詳細說說每個端口的意思
1、nodePort 端口
k8s集群中發發布完service之后,如果需要外部訪問,nodePort是一種訪問方式,即nodePort是提供給外部流量訪問k8s集群中service使用的端口。例如外部用戶要訪問k8s集群中的一個Web應用,那么我們可以配置對應的service如下,就可以從外部通過瀏覽器http://node:28080訪問到該web服務。
注意如果配置文件中不指定nodePort,部署后k8s會自動指定一個端口號來用。
spec: type: NodePort ports: - name: {{ .Values.service.name }} nodePort: 28080
2、port 端口
k8s集群內部服務之間相互訪問service的端口。例如連接mysql使用3306端口,容器創建后暴露了3306端口,集群內其他容器想通過23306端口訪問mysql服務,但是沒有配置NodePort,外部流量就不能訪問mysql服務。對應的service.yaml如下
spec: type: NodePort ports: - name: {{ .Values.service.name }} port: 23306 protocol: TCP targetPort: 3306
3、targetPort端口
從上面例子也能看出來targetPort是什么,它就是容器真正暴露的端口(使用DockerFile中的EXPOSE),targetPort是pod上的端口,從port和nodePort上來的流量,經過kube-proxy流入到后端pod的targetPort上,最后進入容器內。例如一個容器暴露8080端口的tomcat完整配置如下,nodePort可以不配,會自動指定一個端口。
spec: type: NodePort ports: - name: {{ .Values.service.name }} nodePort: 28080 # 外部通過28080訪問 port: 28081 # k8s集群內service通過28081訪問 protocol: TCP targetPort: 8080 # 容器實際暴露端口 selector: app: {{ .Values.appName }}
需要開放多個端口是,在ports下面依次配置多個端口就好,例如
spec: type: NodePort ports: - name: {{ .Values.service.name }} port: {{ .Values.service.port }} protocol: TCP targetPort: {{ .Values.service.targetPort }} - name: {{ .Values.service.managerName }} port: {{ .Values.service.managerPort }} protocol: TCP targetPort: {{ .Values.service.managerTargetPort }} selector: app: {{ .Values.appName }}