5.3 将服务暴露给外部客户端

  1. 前提条件

    0.0 环境准备
    0.1 安装docker
    0.2 安装k8s
    kubectl run kubia --image=nuptaxin/kubia --port=8080

  2. 将服务暴露给外部客户端的方式(默认type为ClusterIP)
    1. 服务类型设置成NodePort:该服务仅在内部集群IP和端口上才可访问,但也可以通过所有节点上的专用端口访问
    2. 服务类型设置成LoadBalance:服务可以通过一个专用的负载均衡器来访问
    3. 创建一个Ingress资源:通过一个IP地址公开多个服务,运行在http层
  3. 使用NodePort类型的服务
    1. 创建NodePort类型的服务【指定nodePort端口不是强制的,如果忽略将选择一个随机端口】
    2. 定义:kubia-svc-np.yaml(指定的externalIPs此时为ECS的内部IP地址)
    apiVersion: v1
    kind: Service
    metadata:
      name: kubia-svc-np
    spec:
      type: NodePort
      externalIPs:
      - 172.26.166.148
      ports:
      - port: 8080
        targetPort: 8080
      selector:
        run: kubia
    
    1. 创建:
      kubectl create -f kubia-svc-np.yaml
    2. 查看:
      kubectl get svc kubia-svc-np
    3. 访问服务
      http://8.130.177.188:8080
    4. 删除服务
      kubectl delete svc kubia-svc-np
  4. 通过负载均衡器将服务暴露出来【如果在不支持Load Balancer服务的环境中运行,则不会调起负载均衡器,但该服务仍将表现的像一个NodePort服务。因为Load Balancer服务是NodePort服务的扩展】
    1. 定义:kubia-svc-lb.yaml(指定的externalIPs此时为ECS的内部IP地址)
    apiVersion: v1
    kind: Service
    metadata:
      name: kubia-svc-lb
    spec:
      type: LoadBalancer
      ports:
      - port: 8080
        targetPort: 8080
      selector:
        run: kubia
      externalIPs:
      - 172.26.166.148
    
    1. 创建:
      kubectl create -f kubia-svc-lb.yaml
    2. 查询:(可以查到External-IP)
      kubectl get svc kubia-svc-lb
    3. 请求:(如果有多个svc绑定到80端口,后创建的服务还需要指定lb的port,在查询中ports列可见)
      http://8.130.177.188:8080
    4. 会话亲和性:
      每次访问可能都是同一个pod,使用kubectl explain查看如果设置为None。原因是http请求会使用keep-alive,curl每次都会打开一个新连接
    5. 删除服务
      kubectl delete svc kubia-svc-lb
  5. 了解外部连接的特性
    1. 了解并防止不必要的网络跳数:通过节点端口连接服务时(包括先通过负载均衡器),随机选择的pod不一定在同一节点。阻止额外跳数配置externalTrafficPolicy。(安装了多个node可以测试下,只有一个node不好测试)
      1. 定义:kubia-svc-lb-local.yaml
      apiVersion: v1
      kind: Service
      metadata:
        name: kubia-svc-lb-local
      spec:
        externalTrafficPolicy: Local
        type: LoadBalancer
        ports:
        - port: 8080
          targetPort: 8080
        selector:
          run: kubia
        externalIPs:
        - 172.26.166.148
      
      1. 创建:
        kubectl create -f kubia-svc-lb-local.yaml
      2. 问题:
        1. 如果节点本地没有pod,则连接将挂起!!!
        2. 负载均衡器可能导致流量分配不均(每个节点上pod数量不一致时)
      3. 请求:(如果有多个svc绑定到80端口,后创建的服务还需要指定lb的port,在查询中ports列可见)
        http://8.130.177.188:8080
    2. 记住客户端IP是不记录的
      1. 通过节点端口接收连接时,进行了SNAT转换,因此数据包的源IP将发生改变(web应用的访问日志将无法显示浏览器的IP)
      2. 使用local策略将保留IP,因为此策略下不执行SNAT
  6. 资源清理
    kubectl delete po kubia
    kubectl delete svc kubia-svc-lb-local
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值