Kubernetes中nodeport,port,targetport对比
<p> 参考:https://blog.csdn.net/yjk13703623757/article/details/79819415</p><p> Kubernetes中容易混淆的几个port</p>
<h3> 1.nodePort</h3>
<p> 外部流量访问k8s集群service入口的一组方式(另一种方式是LoadBalaner),即nodeIP:nodePort是提供给外部流量访问k8s集群中service的入口。</p>
<p> 比如外部用户要访问k8s集群中的一个Web应用,那么我们可以配置对应service的<code>type=NodePort</code>,<code>nodePort=30001</code>。其他用户就可以通过浏览器<code>http://node:30001</code>访问到该web服务。</p>
<p> 而数据库等服务可能不需要被外界访问,只需被内部服务访问即可,那么我们就不必设置service的NodePort。</p>
<h3> 2.port</h3>
<p> k8s集群内部服务之间访问service的入口。即cluseterIP:poer是service保留是clusterIP上的端口</p>
<h3> 3.targetPort</h3>
<p> 容器的端口(最终流量的端口)。targrtPort是pod上的端口,从port和nodePort上来的流量,经过kube-prosy流入到后端的pod的targetPort上,最终进入容器。</p>
<p> 与制作容器时暴露的端口一致(使用DockerFile中的EXPOSE),例如官方的nginx(参考DockerFile)暴露80端口。 对应的service.yaml如下:</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">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
</pre>
</div>
<h3> 4.总结</h3>
<p> 总的来说,port和nodePort都是service的端口,前者暴露给k8s集群内部服务访问,后者暴露给k8s集群外部流量访问。从上两个端口过来的数据都需要经过反向代理kube-proxy,流入后端pod的targetPort上,最后到达pod内的容器。</p>
<h3> 5.举例说明</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">#创建示例文件夹
mkdir nginx
cd nginx
#创建nginxdeployment的yaml文件
kubectl create deployment nginx-deployment --image=nginx --dry-run -o yaml>nginx-deployment.yaml
</pre>
</div>
<p> 修改配置文件</p>
<p> 把副本数修改为2</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># 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
</pre>
</div>
<p> 创建deployment</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">kubectl apply -f nginx-deployment.yaml
</pre>
</div>
<p> 查看</p>
<p><img src="https://img2020.cnblogs.com/i-beta/1144139/202003/1144139-20200320110459174-50479029.png"></p>
<p> </p>
<p> 为了方便查看分别登录Pod修改首页</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">#修改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
</pre>
</div>
<p> 在node节点可以直接使用Pod的IP访问</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># curl 172.17.71.2
node01
# curl 172.17.49.11
node02
</pre>
</div>
<p> 创建Service</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">#创建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暴露的端口不能自定义
</pre>
</div>
<p> 修改以后查看</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># 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
</pre>
</div>
<p> 应用</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">kubectl apply -f nginx-service.yaml
</pre>
</div>
<p> 查看创建的Service</p>
<p><img src="https://img2020.cnblogs.com/i-beta/1144139/202003/1144139-20200320112435578-1128489365.png"></p>
<p> </p>
<p> 集群外部访问测试nodeIP:nodePort访问</p>
<p><img src="https://img2020.cnblogs.com/i-beta/1144139/202003/1144139-20200320112537378-1218929545.png"></p>
<p> </p>
<p> 集群内部访问测试</p>
<p><img src="https://img2020.cnblogs.com/i-beta/1144139/202003/1144139-20200320112853889-1182769644.png"></p>
<p> </p><br><br>
来源:https://www.cnblogs.com/minseo/p/12525861.html
頁:
[1]