k8s service使用NodePort對外暴露應用


1. NodePort:對外暴露應用(集群外)

  • NodePort:在每個節點上啟用一個端口來暴露服務,可以在集群

    • 外部訪問。也會分配一個穩定內部集群IP地址。
    • 訪問地址:<任意NodeIP>:
    • 端口范圍:30000-32767
  • 示例代碼:

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: web
      name: web
    spec:
      type: NodePort # 服務類型
      ports:
      - port: 80 # Service端口
        protocol: TCP # 協議
        targetPort: 80 # 容器端口
        nodePort: 30001  # 對外暴露的端口,可以指定
      selector:
        app: web # 指定關聯Pod的標簽
    
  • 示例圖片
    image

  • NodePort:

    會在每台Node上監聽端口接收用戶流量,在實際情況下,對用戶暴露的只會有一個IP和端口,那這么多台Node該使用哪台讓用戶訪問呢?
    

    這時就需要前面加一個公網負載均衡器為項目提供統一訪問入口了。

  • 示例圖片
    image

2. 案例

  • 我們先啟動一個pod容器

    [root@k8s-master deployment]# vim web.yaml 
    [root@k8s-master deployment]# cat web.yaml 
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web
      namespace: default
      annotations:       # 記錄回滾參數
        kubernetes.io/change-cause: "web.v1-nginx-1.19"   #記錄到revision中的內容,記錄版本號
    spec:
      replicas: 3 # Pod副本預期數量
      revisionHistoryLimit: 10 # RS歷史版本保存數量
      selector:
        matchLabels:
          app: web
      strategy:
        rollingUpdate:
          maxSurge: 25%             # 滾動更新過程最大pod副本數
          maxUnavailable: 25%       # 滾動更新過程中最大不可用pod副本數,
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: web # Pod副本的標簽
        spec:
          containers:
          - name: web
            image: nginx:1.16
            readinessProbe:          # 存活檢查,如果失敗,將殺死容器,來重啟
              httpGet:
                port: 80
                path: /index.html
              initialDelaySeconds: 10 #啟動容器后多少秒健康檢查
              periodSeconds: 10 #以后間隔多少秒檢查一次
    
            livenessProbe:   # 就緒檢查,失敗就會剔除 service 
              httpGet:
                port: 80
                path: /index.html
    
    
  • 啟動pod服務

    [root@k8s-master deployment]# kubectl apply -f web.yaml 
    deployment.apps/web unchanged
    
  • 使用service服務,暴露web應用

    [root@k8s-master service]# vim web-NodePort.yaml 
    [root@k8s-master service]# cat web-NodePort.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: web
      name: web
    spec:
      type: NodePort # 服務類型
      ports:
      - port: 80 # Service端口
        protocol: TCP # 協議
        targetPort: 80 # 容器端口
        nodePort: 30009  # 對外暴露的端口,可以指定
      selector:
        app: web # 指定關聯Pod的標簽
    
  • 啟動服務

    [root@k8s-master service]# kubectl apply -f  web-NodePort.yaml 
    service/web configured
    
  • 查詢服務

    [root@k8s-master service]# kubectl get service
    NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        7d19h
    probe-demo   ClusterIP   10.104.161.168   <none>        80/TCP         3d19h
    web          NodePort    10.100.222.42    <none>        80:30009/TCP   13h
    
  • 驗證服務

    [root@k8s-master service]# curl -I http://192.168.0.202:30009
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Thu, 03 Dec 2020 03:10:36 GMT
    Content-Type: text/html
    Content-Length: 612
    Last-Modified: Tue, 13 Aug 2019 10:05:00 GMT
    Connection: keep-alive
    ETag: "5d528b4c-264"
    Accept-Ranges: bytes
    

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM