Kube-proxy

kube-proxy是Kubernetes的核心组件,部署在每个Node节点上,它是实现Kubernetes Service的通信与负载均衡机制的重要组件; kube-proxy负责为Pod创建代理服务,从apiserver获取所有server信息,并根据server信息创建代理服务,实现server到Pod的请求路由和转发,从而实现K8s层级的虚拟转发网络。

我们知道kube-proxy支持 iptables 和 ipvs 两种模式, 在kubernetes v1.8 中引入了 ipvs 模式,在 v1.9 中处于 beta 阶段,在 v1.11 中已经正式可用了。iptables 模式在 v1.1 中就添加支持了,从 v1.2 版本开始 iptables 就是 kube-proxy 默认的操作模式,ipvs 和 iptables 都是基于netfilter的,那么 ipvs 模式和 iptables 模式之间有哪些差异呢?

  • ipvs 为大型集群提供了更好的可扩展性和性能
  • ipvs 支持比 iptables 更复杂的复制均衡算法(最小负载、最少连接、加权等等)
  • ipvs 支持服务器健康检查和连接重试等功能
  • 可以动态修改ipset集合。即使iptables的规则正在使用这个集合。

ipvs 依赖 iptables

由于ipvs 无法提供包过滤、SNAT、masquared(伪装)等功能。因此在某些场景(如Nodeport的实现)下还是要与iptables搭配使用,ipvs 将使用ipset来存储需要DROP或masquared的流量的源或目标地址,以确保 iptables 规则的数量是恒定的。假设要禁止上万个IP访问我们的服务器,则用iptables的话,就需要一条一条地添加规则,会在iptables中生成大量的规则;但是使用ipset的话,只需要将相关的IP地址(网段)加入到ipset集合中即可,这样只需要设置少量的iptables规则即可实现目标。 

这里还是推荐使用ipvs

IPVS 是 LVS 项目的一部分,是一款运行在 Linux Kernel 当中的 4 层负载均衡器,性能异常优秀。

使用调优后的内核,可以轻松处理每秒 10 万次以上的转发请求。
目前在中大型互联网项目中,IPVS 被广泛的用于承接网站入口处的流量。

实验一 在不启动 kube-proxy 的情况下尝试创建 nodeport 服务

apiVersion: apps/v1

kind: Deployment

metadata:

  name: nginx-deployment

  labels:

    app: nginx

spec:

  replicas: 3

  selector:

    matchLabels:

      app: nginx

  template:

    metadata:

      labels:

        app: nginx

    spec:

      containers:

      - name: nginx

        image: nginx:latest

        ports:

        - containerPort: 80
apiVersion: v1

kind: Service

metadata:

  name: nginx-service

  labels:

    app: nginx

spec:

  ports:

  - port: 88

    targetPort: 80

    nodePort: 30791

  selector:

    app: nginx

  type: NodePort

实验二 启动 kube-proxy 服务

创建一个 proxy.yaml 文件

kind: KubeProxyConfiguration

apiVersion: kubeproxy.config.k8s.io/v1alpha1

clientConnection:

  burst: 200

  kubeconfig: "/home/lizhe/minik8s/kubeconfig.yaml"

  qps: 100

bindAddress: 127.0.0.1

healthzBindAddress: 127.0.0.1:10256

metricsBindAddress: 127.0.0.1:10249

enableProfiling: true

clusterCIDR: 169.169.0.0/16

hostnameOverride: ##NODE_NAME##

mode: "iptables"

portRange: ""

kubeProxyIPTablesConfiguration:

  masqueradeAll: false

kubeProxyIPVSConfiguration:

  scheduler: rr

  excludeCIDRs: []

之前使用的kubeconfig文件

apiVersion: v1

kind: Config

clusters:

- cluster:

    server: http://127.0.0.1:8080

  name: mink8s

contexts:

- context:

    cluster: mink8s

  name: mink8s

current-context: mink8s

使用如下命令行启动 

sudo ./kube-proxy --config=proxy.yaml
Send a Message