2054 kube-proxy

我们知道容器的特点是快速创建、快速销毁,Kubernetes Pod和容器一样只具有临时的生命周期,一个Pod随时有可能被终止或者漂移,随着集群的状态变化而变化,一旦Pod变化,则该Pod提供的服务也就无法访问,如果直接访问Pod则无法实现服务的连续性和高可用性,因此显然不能使用Pod地址作为服务暴露端口。

解决这个问题的办法和传统数据中心解决无状态服务高可用的思路完全一样,通过负载均衡和VIP实现后端真实服务的自动转发、故障转移。

这个负载均衡在Kubernetes中称为Service,VIP即Service ClusterIP,因此可以认为Kubernetes的Service就是一个四层负载均衡,Kubernetes对应的还有七层负载均衡Ingress,本文仅介绍Kubernetes Service。

这个Service就是由kube-proxy实现的,ClusterIP不会因为Pod状态改变而变,需要注意的是VIP即ClusterIP是个假的IP,这个IP在整个集群中根本不存在,当然也就无法通过IP协议栈无法路由,底层underlay设备更无法感知这个IP的存在,因此ClusterIP只能是单主机(Host Only)作用域可见,这个IP在其他节点以及集群外均无法访问。

Kubernetes为了实现在集群所有的节点都能够访问Service,kube-proxy默认会在所有的Node节点都创建这个VIP并且实现负载

部署策略:

  • 使用 kubeconfig 访问 apiserver 的安全端口;

  • 在 KubeProxyConfiguration 类型的 yaml 文件配置主要参数;

  • 使用 ipvs 代理模式;

01.创建Kube-proxy证书和私钥

cat > kube-proxy-csr.json <<EOF
{
  "CN": "system:kube-proxy",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "China",
      "L": "Beijing",
      "O": "Kubernetes",
      "OU": "Kubernetes",
      "ST": "Beijing"
    }
  ]
}
EOF

解释: CN:指定该证书的 User 为 system:kube-proxy; 预定义的 RoleBinding system:node-proxier 将User system:kube-proxy 与Role system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限; 该证书只会被 kube-proxy 当做 client 证书使用,所以 hosts 字段为空。

创建 kube-proxy 凭证与私钥:

结果将产生以下两个文件:

02.创建 kube-proxy kubeconfig 文件

  • 设置集群参数

  • 设置客户端认证参数

  • 设置上下文参数

  • 设置默认上下文

  • 设置集群参数和客户端认证参数时 --embed-certs 都为 true,这会将 certificate-authority、client-certificate 和 client-key 指向的证书文件内容写入到生成的 kube-proxy.kubeconfig 文件中;

  • kube-proxy.pem 证书中 CN 为 system:kube-proxy,kube-apiserver 预定义的 RoleBinding cluster-admin 将User system:kube-proxy 与 Role system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;

03.维护kube-proxy配置文件

同kubelet一样, kube-proxy中的很多参数已经废弃需要单独的配置文件支持, 你可以使用 --write-config-to 选项生成该配置文件

注意: 如果kubelet中配置了hostnameOverride那么kube-proxy也需要相同的配置

参数说明:

bindAddress: 监听地址;

clientConnection.kubeconfig: 连接 apiserver 的 kubeconfig 文件

clusterCIDR: kube-proxy 根据 --cluster-cidr 判断集群内部和外部流量,指定 --cluster-cidr 或 --masquerade-all 选项后 kube-proxy 才会对访问 Service IP 的请求做 SNAT;

hostnameOverride: 参数值必须与 kubelet 的值一致,否则 kube-proxy 启动后会找不到该 Node,从而不会创建任何 ipvs 规则;

mode: 使用 ipvs 模式。

04.使用systemd管理kube-proxy

根据实际情况替换--hostname-override

05.启动/停止 kube-proxy

kube-proxy can be started and stopped as follows:

06.验证

检查服务:

检查端口:

kube-proxy 监听 10249 和 10256 端口:

  • 10249:对外提供 /metrics;

  • 10256:对外提供 /healthz 的访问。

07.测试

创建pod测试

创建service

查看ipvs规则

Q&A

Q: 启动kube-proxy 日志文件一直报如下错误

最后更新于

这有帮助吗?