原文:https://www.cnblogs.com/minseo/p/12525861.html

nodePort,port,targetPort讲解:

1.nodePort

外部流量访问k8s集群service入口的一组方式(另一种方式是LoadBalaner),即nodeIP:nodePort是提供给外部流量访问k8s集群中service的入口。

比如外部用户要访问k8s集群中的一个Web应用,那么我们可以配置对应service的type=NodePortnodePort=30001。其他用户就可以通过浏览器http://node:30001访问到该web服务。

而数据库等服务可能不需要被外界访问,只需被内部服务访问即可,那么我们就不必设置service的NodePort。

2.port

k8s集群内部服务之间访问service的入口。即cluseterIP:poer是service保留是clusterIP上的端口

kubectl get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP        56m
nginx-service   NodePort    10.105.89.146   <none>        81:30008/TCP   16m

[root@k8smaster ~]# curl 10.105.89.146:81
node02 #会负载均衡

3.targetPort

容器的端口(最终流量的端口)。

targrtPort是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

总的来说,port和nodePort都是service的端口,

前者暴露给k8s集群内部服务访问,

后者暴露给k8s集群外部流量访问。

从上两个端口过来的数据都需要经过反向代理kube-proxy,流入后端pod的targetPort上,最后到达pod内的容器。

举个栗子

创建配置 create deployment并执行

#创建示例文件夹
mkdir nginx
cd nginx
#创建nginxdeployment的yaml文件
kubectl create deployment nginx-deployment --image=nginx --dry-run -o yaml>nginx-deployment.yaml

修改配置文件

把副本数修改为2

# cat nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deployment
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deployment
  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
      - image: nginx
        name: nginx
        #定义容器暴露端口为80
        #不设置也可以nginx镜像默认暴露端口就是80
        ports:
        - containerPort: 80

创建deployment

kubectl apply -f nginx-deployment.yaml

查看

img

修改首页

为了方便查看分别登录Pod修改首页

#修改node01的首页
kubectl exec -it nginx-deployment-fc86dcbd-qhdst bash
echo node01>/usr/share/nginx/html/index.html

#修改node02的首页
kubectl exec -it nginx-deployment-fc86dcbd-znrtk bash
echo node02>/usr/share/nginx/html/index.html

kubectl exec -it xxxx bash

在node节点可以直接使用Pod的IP访问

[root@localhost ~]``# curl 172.17.71.2``node01``
[root@localhost ~]``# curl 172.17.49.11``node02

创建service 对外暴露端口

#创建service配置文件
kubectl expose deployment nginx-deployment --name=nginx-service --port=81 --target-port=80 --type=NodePort --dry-run -o yaml>nginx-service.yaml

#参数说明
deployment nginx-deployment 
该service对应的是deployment
对应的name是ngin-deployment

 --name=nginx-service 自定义serice名称,如果不指定service name与对应的deployment同名
 
 --port=81 定义service端口为81,为了区分80定义成81
 
 --target-port=80 对应的容器端口是80 nginx默认暴露的端口是80,必须对应Pod暴露的端口不能自定义

修改以后查看

# cat nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-deployment
  name: nginx-service
spec:
  ports:
  - port: 81 #service端口
    protocol: TCP
    targetPort: 80 #Pod即容器端口
    nodePort: 30008 #定义NodePort端口如果不定义会随机生成一个端口
  selector:
    app: nginx-deployment
  type: NodePort #映射模式是NodePort

应用

kubectl apply -f nginx-service.yaml

查看测试

查看创建的Service

img

集群外部访问测试nodeIP:nodePort访问

img

集群内部访问测试

img

分类: Kubernetes

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐