Kubernetes中nodeport,port,targetport对⽐
  Kubernetes中容易混淆的⼏个port
  1.nodePort
  外部流量访问k8s集service⼊⼝的⼀组⽅式(另⼀种⽅式是LoadBalaner),即nodeIP:nodePort是提供给外部流量访问k8s集中service的⼊⼝。
  ⽽数据库等服务可能不需要被外界访问,只需被内部服务访问即可,那么我们就不必设置service的NodePort。
  2.port
  k8s集内部服务之间访问service的⼊⼝。即cluseterIP:poer是service保留是clusterIP上的端⼝
  3.targetPort
  容器的端⼝(最终流量的端⼝)。targrtPort是pod上的端⼝,从port和nodePort上来的流量,经过kube-prosy流⼊到后端的pod的targetPort 上,最终进⼊容器。
  与制作容器时暴露的端⼝⼀致(使⽤DockerFile中的EXPOSE),例如官⽅的nginx(参考)暴露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.总结
  总的来说,port和nodePort都是service的端⼝,前者暴露给k8s集内部服务访问,后者暴露给k8s集外部流量访问。从上两个端⼝过来的数据都需要经过反向代理kube-proxy,流⼊后端pod的targetPort上,最后到达pod内的容器。
  5.举例说明
#创建⽰例⽂件夹
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
  查看
  为了⽅便查看分别登录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
  在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
nodeselector--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
  集外部访问测试nodeIP:nodePort访问
  集内部访问测试

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。