当前位置:   article > 正文

K8s: 从集群外部访问Service

K8s: 从集群外部访问Service

从集群外部访问 Service


1 )概述

  • 在前面我们一直实践的是在集群内部访问 Service,之前有2种方法
    • 方法1:在一个node节点上,通过对创建的的时候,对port进行一个环境变量的注册
    • 来保证Service能够正确对 不同的pod 访问到
    • 就是在这个node节点上,也是在集群内部
    • 方法2:另外一种方式呢是通过DNS记录
    • 比如说静态的pod创建这种专有域名的方式来保证集群内部都能访问到这个pod,这个service
  • 但是,有些服务,比如说前端的应用 nginx,它要对集群外部进行服务提供的
  • 所以在这种情况下,需要集群提供对外部访问的这种机制
  • K8s提供了ClusterIP, NodePort和 LoadBalancer 这三种方式提供集群外部的访问
  • ClusterIP
    • 仅仅使用一个集群内部的IP地址 - 这是默认值
    • 选择这个值意味着你只想这个服务在集群内部才可以被访问到
    • 像你创建这个 Service, 默认,它会给你创建一个集群内部的一个IP地址
    • 它是一个相当于是一个内网的IP这个IP, 实际上, 外网(公网)它是访问不到的
    • 如果你是在内网的话,不推荐用这种方式创建 Service
  • NodePort
    • 在集群内部IP的基础上,在集群的每一个节点的端口上开放这个服务
    • 你可以在任意:NodePort地址上访问到这个服务
    • 这里的node指的是 worknode,在这个node上开一个端口,任何在这个端口口的请求
    • 它会会被转发到咱们的这个NodePort类型的service上
    • 如果是自己实践的话,可以实现这种NodePort类型的方式
  • LoadBalancer
    • 在使用一个集群内部IP地址和在NodePort上开放一个Service的基础上
    • 还可以向云提供者申请一个负载均衡器
    • 将流量转发到已经以NodePort形式开发的Service上
    • 在公网生产环境使用的时候,推荐是用这个LoadBalancer去负载均衡的方式
    • 向云提供商申请一个负载均衡器,然后这个负载均衡器再把流量转发到咱们的集群内部
    • 或者NodePort上开个放一个Service, 一般在公有云上上可以用 ELB 服务去构建Service域名

2 )基于NodePort来实践

  • 首先还是创建Service, 用于pod的通信
  • 之后创建这个deployment,创建deployment之后,它会创建一个nginx中的一个pod
  • 新建 node-port-nginx.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: svc-node-port-nginx
      labels:
        app: nginx
        name: nginx-deployment
    spec:
      type: NodePort
      selector:
        app: nginx
      ports:
      - port: 80
        name: svc-nginx-30001
        protocol: TCP
        targetPort: 80
        nodePort: 30001
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dep-node-port-nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            resources:
              limits:
                memory: "64Mi"
                cpu: "500m"
            ports:
            - containerPort: 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • $ kubectl apply -f node-port-nginx.yaml
    service/svc-node-port-nginx created
    deployment.apps/dep-node-port-nginx created
    
    • 1
    • 2
  • $ kubectl get all
    NAME                                       READY   STATUS             RESTARTS          AGE
    pod/dep-node-port-nginx-854c74b9f4-96cmt   1/1     Running            0                 51s
    
    NAME                          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    service/svc-node-port-nginx   NodePort    10.1.135.122   <none>        80:30001/TCP   51s
    
    NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/dep-node-port-nginx   1/1     1            1           51s
    
    NAME                                             DESIRED   CURRENT   READY   AGE
    replicaset.apps/dep-node-port-nginx-854c74b9f4   1         1         1       51s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 我们知道,这个服务的地址应该是这个Node的ip地址,而端口就是暴露出来的30001
  • $ kubectl describe pod dep-node-port-nginx-854c74b9f4-96cmt | grep Node 查看部署到了哪台机器上
    Node:         node2.k8s/10.211.55.12
    Node-Selectors:              <none>
    
    • 1
    • 2
  • 从上面可知道,外网可访问的地址为: 10.211.55.12:30001
  • 在浏览器上输入上述地址,呈现出: “Welcome to nginx!” 的页面,说明网络通畅了
  • 因为这台WorkNode节点是可以被外网访问到的, 基于之前的Service, 在这个Node节点上开了 30001 的端口
  • 访问这个 30001 端口会被路由到后端Service的80端口, 这个Service的80端口又会被转发到pod的80端口
  • 基于这种层层转发,才能访问到这个 nginx
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/505949
推荐阅读
相关标签
  

闽ICP备14008679号