zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    springAOP实现原理
    cglib用法
    git 用法
    java基础算法之快速排序
    记一次与a标签相遇的小事
    java设计模式之建造者模式
    HashMap源码分析
    Linux下安装nginx
    java设计模式之策略模式
    java设计模式之中介者模式
  • 原文地址:https://www.cnblogs.com/scajy/p/15493248.html
Copyright © 2011-2022 走看看