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 }} 

 

分类:

技术点:

相关文章: