Kubernetes那点事儿——暴露服务之Service

Kubernetes那点事儿——暴露服务之Service

  • 前言
  • 一、Service
  • 二、Service与Pod关系
  • 三、Service常用类型
    • ClusterIP
    • NodePort
    • LoadBalancer
  • 四、Service代理模式
    • Iptables
    • IPVS
    • 修改代理模式


前言

K8s中,我们将应用跑在Pod里。多数情况下是一组Pod,用户如何访问这一组Pod,K8s提供了Service资源,来实现一组Pod的负载均衡。

一、Service

Kubernetes 中 Service 是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法。为后端Pod提供负载均衡及服务发现的能力。

Kubernetes那点事儿——暴露服务之Service_第1张图片

  • 关联Pod(服务发现)
  • 定义一组Pod的访问策略(负载均衡)

二、Service与Pod关系

Service与Pod通过Label关联,Service实现Pod的负载均衡(4层)

Kubernetes那点事儿——暴露服务之Service_第2张图片

示例:

apiVersion: v1
kind: Service
metadata:
  name: web-service
  labels:
    app: svc-web
spec:
  selector:
    app: web
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

上述配置创建一个名称为 “web-service” 的 Service 对象,它会将请求代理到使用 TCP 端口 8080,并且具有标签 “app=web” 的 Pod 上。
metadata定义了service本身的名称,标签。spec定义的标签选择器是pod的标签(对应pod中的labels)

三、Service常用类型

ClusterIP

ClusterIP在集群内部使用。默认分配一个稳定的IP地址,即VIP,只能在集群内部访问(同Namespace内的Pod)

Kubernetes那点事儿——暴露服务之Service_第3张图片

apiVersion: v1
kind: Service
metadata:
  name: web-service
  labels:
    app: web-service
spec:
  selector:
    app: web
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      
# kubectl get svc
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes    ClusterIP   10.96.0.1        >        443/TCP   45d
web-service   ClusterIP   10.105.115.247   >        80/TCP    5m11s

NodePort

NodePort:在每个节点上启用一个端口来暴露服务,可以在集群外部访问(访问任意节点ip)。也会分配一个稳定内部集群IP地址。
访问地址:NodeIP:NodePort

Kubernetes那点事儿——暴露服务之Service_第4张图片

apiVersion: v1
kind: Service
metadata:
  name: web-service
  labels:
    app: web-service
spec:
  type: NodePort
  selector:
    app: web
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      
# kubectl get svc
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes    ClusterIP   10.96.0.1        >        443/TCP        45d
web-service   NodePort    10.105.115.247   >        80:31087/TCP   33m

集群内所有节点均会监听31087端口,此时可以用集群内任意节点ip+31087访问到业务(nodeip+31087),可以手动指定nodeport,端口范围30000-32767

ports:
  - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30001

port是Service监听的端口,也就是LB监听的端口。targetport是业务端口,也就是image服务的监控端口。
Nodeport是集群节点监听端口(暴露服务)。可以使用不同的Nodeport实现不同业务访问
数据流向:用户访问节点端口(Nodeport)->转发到LB端口(Port)->分发到业务端口(targetport)

LoadBalancer

与NodePort类似,在每个节点上启用一个端口来暴露服务。除此之外,Kubernetes会请求底层云平台上的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加进去。

Kubernetes那点事儿——暴露服务之Service_第5张图片

四、Service代理模式

Service代理模式分为Iptables与IPVS两种。

流程包流程:客户端 ->NodePort/ClusterIP(iptables/Ipvs负载均衡规则) -> 分布在各节点Pod

Iptables

Kubernetes那点事儿——暴露服务之Service_第6张图片

  • 灵活,功能强大
  • 规则遍历匹配和更新,呈线性时延

IPVS

Kubernetes那点事儿——暴露服务之Service_第7张图片

  • 工作在内核态,有更好的性能
  • 调度算法丰富:rr,wrr,lc,wlc,ip hash…

修改代理模式

kubeadm方式

# kubectl edit configmap kube-proxy -n kube-system
...
mode: "ipvs"
...
# kubectl delete pod kube-proxy-btz4p -n kube-system
注:
1、kube-proxy配置文件以configmap方式存储
2、如果让所有节点生效,需要重建所有节点kube-proxy pod

二进制方式

# vi kube-proxy-config.yml 
mode: ipvs
ipvs:
scheduler: "rr"
# systemctl restart kube-proxy

你可能感兴趣的:(Kubernetes,kubernetes,运维,docker,linux,容器)