天天看點

k8s中 nodeport,port,targetport對比

原文: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
           

檢視

k8s中 nodeport,port,targetport對比

修改首頁

為了友善檢視分别登入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

k8s中 nodeport,port,targetport對比

叢集外部通路測試nodeIP:nodePort通路

k8s中 nodeport,port,targetport對比

叢集内部通路測試

k8s中 nodeport,port,targetport對比

分類: Kubernetes

k8s

繼續閱讀