原文:https://www.cnblogs.com/minseo/p/12525861.html
nodePort,port,targetPort講解:
1.nodePort
外部流量通路k8s叢集service入口的一組方式(另一種方式是LoadBalaner),即nodeIP:nodePort是提供給外部流量通路k8s叢集中service的入口。
比如外部使用者要通路k8s叢集中的一個Web應用,那麼我們可以配置對應service的
type=NodePort
,
nodePort=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
[[email protected] ~]# 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
檢視
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yNwUTO0QjZ3gzNkhDMmVjN2MTNiRWYiJWYwMGZxUmNh9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
修改首頁
為了友善檢視分别登入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通路
[[email protected] ~]``# curl 172.17.71.2``node01``
[[email protected] ~]``# 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
叢集外部通路測試nodeIP:nodePort通路
叢集内部通路測試
分類: Kubernetes