K8s: 从集群外部访问Service

发布于:2024-04-28 ⋅ 阅读:(32) ⋅ 点赞:(0)

从集群外部访问 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
    
  • $ kubectl apply -f node-port-nginx.yaml
    service/svc-node-port-nginx created
    deployment.apps/dep-node-port-nginx created
    
  • $ 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
    
  • 我们知道,这个服务的地址应该是这个Node的ip地址,而端口就是暴露出来的30001
  • $ kubectl describe pod dep-node-port-nginx-854c74b9f4-96cmt | grep Node 查看部署到了哪台机器上
    Node:         node2.k8s/10.211.55.12
    Node-Selectors:              <none>
    
  • 从上面可知道,外网可访问的地址为: 10.211.55.12:30001
  • 在浏览器上输入上述地址,呈现出: “Welcome to nginx!” 的页面,说明网络通畅了
  • 因为这台WorkNode节点是可以被外网访问到的, 基于之前的Service, 在这个Node节点上开了 30001 的端口
  • 访问这个 30001 端口会被路由到后端Service的80端口, 这个Service的80端口又会被转发到pod的80端口
  • 基于这种层层转发,才能访问到这个 nginx

网站公告

今日签到

点亮在社区的每一天
去签到