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

kubernetes容易混淆的几个端口的更多相关文章

  1. Kubernetes使用Eedpoints连接外部服务端口

    Kubernetes使用Eedpoints连接外部服务端口 背景: 在Kubernetes的使用环境中,我们经常要连接外部的一些服务,比如mysql Elasticsearch kafka 等等外部的 ...

  2. Kubernetes service 三种类型/NodePort端口固定

    Kubernetes service 三种类型 • ClusterIP:默认,分配一个集群内部可以访问的虚拟IP(VIP)• NodePort:在每个Node上分配一个端口作为外部访问入口• Load ...

  3. kubernetes 外部访问集群暴露端口服务

    在yaml文件中多个不同类型资源可以用“---”在划分 name: httpd2-svc namespace: kube-public    #给资源分配网络   所用资源将在 kube-public ...

  4. 在Openstack上创建并访问Kubernetes集群

    第一部分:创建集群 在Openstack部署Kubernetes集群运行Nginx容器的步骤,其中包括: 利用Murano部署Kubernetes集群 配置Openstack的安全性使Kubernet ...

  5. Docker Kubernetes 环境搭建

    Docker Kubernetes 环境搭建 节点规划 版本 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 etcd存储版本:etcd-3. ...

  6. Docker Kubernetes 常用命令

    Docker Kubernetes 常用命令 增 # 通过文件名或标准输入创建资源. kubectl create # 读取指定文件内容,进行创建.(配置文件可指定json,yaml文件). kube ...

  7. k8s技术--Kubernetes集群kubectl命令的常见使用方法

    简介:kubectl是一个命令行界面,用于运行针对Kubernetes群集的命令. 语法: kubectl [command] [TYPE] [NAME] [flags] command:指定您希望对 ...

  8. Kubernetes 选择 IPVS

    什么是 IPVS ? IPVS (IP Virtual Server)是在 Netfilter 上层构建的,并作为 Linux 内核的一部分,实现传输层负载均衡. IPVS 集成在 LVS(Linux ...

  9. [Kubernetes]Kubernetes的网络模型

    Kubernetes的网络模型从内至外由四个部分组成: Pod内部容器所在的网络 Pod所在的网络 Pod和Service之间通信的网络 外界与Service之间通信的网络 建议在阅读本文之前先了解D ...

随机推荐

  1. ubuntu报错解决和注意事项

    1.在容器中安装expect报错 [root@kube-node3 target]# docker exec -it 36563e55c42b sh$ sudo apt-get install exp ...

  2. flask的jinja2过滤器使用:遍历索引指定标签class属性,实现样式变化

    在flask项目中实现上图效果,采用使用自定义过滤器的形式对 span 标签的 class 指定. 1.定义过滤器 # common.py def do_index_class(index): &qu ...

  3. 如何使用thymeleaf显示控制传递过来的数据

    实例 <p th:text="'Hello, ' + ${name} + '!'" /> name为要显示的参数名

  4. POJ 3660 Cow Contest【floyd】

    题目链接: http://poj.org/problem?id=3660 题目大意: 给出n头牛,m个关系,关系为a的战力比b高.求最后可以确定排名的牛的数量 思路: 1.如果一头牛跟其他所有牛都确定 ...

  5. 拯救你丢失的精度——BigInteger和BigDecimal类(入门)

    第三阶段 JAVA常见对象的学习 BigInteger和BigDecimal类 BigInteger类 (一) 构造方法: //针对超过整数范围的运算(整数最大值:2147483647) BigInt ...

  6. [转帖]curl网站开发指南

    curl网站开发指南 http://www.ruanyifeng.com/blog/2011/09/curl.html linux 里面有非常多很好的工具 比如这个 curl 之前 以为 wget 就 ...

  7. TCP连接可能出现的异常总结

    1.java.net.BindException:Address already in use:bind 服务端出错,两次对同一个端口进行启动(会在服务端发生报错,抛出异常,不考虑) 2.java.n ...

  8. PAT题目AC汇总(待补全)

    题目AC汇总 甲级AC PAT A1001 A+B Format (20 分) PAT A1002 A+B for Polynomials(25) PAT A1005 Spell It Right ( ...

  9. C++目录

    C++ lambda表达式 C++中如何设计一个类只能在堆或者栈上创建对象,面试题 C++之STL总结精华笔记 指针强制类型转换的理解 关于指针类型和指针类型转换的理解 C++继承种类 C++ 单例模 ...

  10. 用shell脚本安装MySQL-5.7.22-官方版本多实例

    Install_CentOS7_MySQL57_multi_instance.sh #!/bin/bash #请提前准备好参数文件my.cnf PORT=3307 InitMySQL() { mkdi ...