K8s nodePort、port、targetPort、hostPort

1. nodePort

外部流量访问k8s集群中service入口的一种方式(另一种方式是LoadBalancer),即nodeIP:nodePort是提供给外部流量访问k8s集群中service的入口。比如外部用户要访问k8s集群中的一个Web应用,那么我们可以配置对应service的type=NodePort,nodePort=30001。其他用户就可以通过浏览器http://node:30001访问到该web服务。而数据库等服务可能不需要被外界访问,只需被内部服务访问即可,那么我们就不必设置service的NodePort。

2. port

k8s集群内部服务之间访问service的入口。即clusterIP:port是service暴露在clusterIP上的端口。mysql容器暴露了3306端口,集群内其他容器通过33306端口访问mysql服务,但是外部流量不能访问mysql服务,因为mysql服务没有配置NodePort。对应的service.yaml如下:

apiVersion: v1
kind: Service
metadata:
 name: mysql-service
spec:
 ports:
 - port: 33306
   targetPort: 3306
 selector:
  name: mysql-pod

3.targetPort

容器的端口(最终的流量端口)。targetPort是pod上的端口,从port和nodePort上来的流量,经过kube-proxy流入到后端pod的targetPort上,最后进入容器。
制作容器时暴露的端口一致(使用DockerFile中的EXPOSE),例如官方的nginx(参考DockerFile)暴露80端口。 对应的service.yaml如下

apiVersion: v1
kind: Service
metadata:
 name: nginx-service
spec:
 type: NodePort         // 有配置NodePort,外部流量可访问k8s中的服务
 ports:
 - port: 30080          // 服务访问端口
   targetPort: 80       // 容器端口
   nodePort: 30001      // NodePort
 selector:
  name: nginx-pod

4.hostPort

这是一种直接定义Pod网络的方式。hostPort是直接将容器的端口与所调度的节点上的端口路由,这样用户就可以通过宿主机的IP加上来访问Pod了,如:

apiVersion: v1
kind: Pod
metadata:
  name: influxdb
spec:
  containers:
    - name: influxdb
      image: influxdb
      ports:
        - containerPort: 8086
          hostPort: 8086

这样做有个缺点,因为Pod重新调度的时候该Pod被调度到的宿主机可能会变动,这样就变化了,用户必须自己维护一个Pod与所在宿主机的对应关系。
使用了 hostPort 的容器只能调度到端口不冲突的 Node 上,除非有必要(比如运行一些系统级的 daemon 服务),不建议使用端口映射功能。如果需要对外暴露服务,建议使用 NodePort Service

5. 总结

总的来说,port和nodePort都是service的端口,前者暴露给k8s集群内部服务访问,后者暴露给k8s集群外部流量访问。从上两个端口过来的数据都需要经过反向代理kube-proxy,流入后端pod的targetPort上,最后到达pod内的容器。

参考:

https://blog.csdn.net/yjk13703623757/article/details/79819415

https://jimmysong.io/posts/accessing-kubernetes-pods-from-outside-of-the-cluster/

https://feisky.gitbooks.io/kubernetes/practice/portmap.html


 

Kubernetesk8s)中配置域名加端口访问,可以通过多种方式实现。以下是几种常见的方法: 1. **使用Ingress**: - Ingress是k8s中的一个API对象,用于管理外部访问到集群内服务的路由规则。通过Ingress,你可以将外部的URL路径映射到集群内部的服务。 - 创建一个Ingress资源,指定路径和对应的服务及端口。例如: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: yourdomain.com http: paths: - path: / pathType: Prefix backend: service: name: my-service port: number: 8080 ``` - 在这个例子中,`yourdomain.com`是你要配置的域名,`my-service`是集群内部的服务名称,`8080`是该服务的端口号。 2. **使用NodePort类型的Service**: - NodePort服务会在每个节点上打开一个指定范围的端口(默认为30000-32767),通过这个端口可以访问到集群内部的服务。 - 创建NodePort服务,并指定端口。例如: ```yaml apiVersion: v1 kind: Service metadata: name: my-nodeport-service spec: type: NodePort ports: - protocol: TCP port: 8080 targetPort: 80 nodePort: 30080 ``` - 在这个例子中,外部访问`<NodeIP>:30080`会转发到集群内的`my-nodeport-service`服务的80端口。 3. **使用LoadBalancer类型的Service**: - 如果你的云提供商支持,可以使用LoadBalancer类型的服务,它会自动分配一个负载均衡器和一个外部IP地址。 - 创建LoadBalancer服务。例如: ```yaml apiVersion: v1 kind: Service metadata: name: my-loadbalancer-service spec: type: LoadBalancer ports: - protocol: TCP port: 80 targetPort: 80 ``` - 云提供商会自动处理外部流量并将其路由到集群内的服务。 4. **使用ExternalName类型的Service**: - ExternalName服务可以将域名解析为外部的DNS名,这样可以通过集群内部访问外部的服务。 - 创建ExternalName服务。例如: ```yaml apiVersion: v1 kind: Service metadata: name: my-externalname-service spec: type: ExternalName externalName: yourdomain.com ``` - 这样,集群内部可以通过`my-externalname-service`来访问`yourdomain.com`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值