• 【云原生 · Kubernetes】部署 kube-proxy 组件


    个人名片:
    因为云计算成为了监控工程师👨🏻‍💻
    个人博客🏆:念舒_C.ying
    CSDN主页✏️:念舒_C.ying

    kube-proxy 运行在所有 worker 节点上,它监听 apiserver 中 service 和 endpoint 的变化情况,创建路由规则以提供服务 IP 和负载均衡功能。
    讲解部署 ipvs 模式的 kube-proxy 过程。
    注意:如果没有特殊指明,所有操作均在 qist 节点上执行,然后远程分发文件和执行命令。

    15.1 创建 kube-proxy 证书

    创建证书签名请求:

    cd /opt/k8s/work
    cat > /opt/k8s/cfssl/k8s/kube-proxy.json << EOF
    {
    "CN": "system:kube-proxy",
    "hosts": [""],
    "key": {
    "algo": "rsa",
    "size": 2048
    },
    "names": [
    {
    "C": "CN",
    "ST": "GuangDong",
    "L": "GuangZhou",
    "O": "system:node-proxier",
    "OU": "Kubernetes-manual"
    }
    ]
    }
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • CN:指定该证书的 User 为 system:kube-proxy ;
    • 预定义的 RoleBinding system:node-proxier 将User system:kube-proxy 与 Role system:nodeproxier绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;
    • 该证书只会被 kube-proxy 当做client 证书使用,所以 hosts 字段为空;

    生成证书和私钥:

    cd /opt/k8s/work
    cfssl gencert \
    -ca=/opt/k8s/cfssl/pki/k8s/k8s-ca.pem \
    -ca-key=/opt/k8s/cfssl/pki/k8s/k8s-ca-key.pem \
    -config=/opt/k8s/cfssl/ca-config.json \
    -profile=kubernetes \
    /opt/k8s/cfssl/k8s/kube-proxy.json | \
    cfssljson -bare /opt/k8s/cfssl/pki/k8s/kube-proxy
    ls /opt/k8s/cfssl/pki/k8s/kube-proxy*
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    15.2 创建和分发 kubeconfig 文件

    cd /opt/k8s/kubeconfig
    kubectl config set-cluster kubernetes \
    --certificate-authority=/opt/k8s/cfssl/pki/k8s/k8s-ca.pem \
    --embed-certs=true \
    --server=https://127.0.0.1:6443 \
    --kubeconfig=kube-proxy.kubeconfig
    kubectl config set-credentials system:kube-proxy \
    --client-certificate=/opt/k8s/cfssl/pki/k8s/kube-proxy.pem \
    --client-key=/opt/k8s/cfssl/pki/k8s/kube-proxy-key.pem \
    --embed-certs=true \
    --kubeconfig=kube-proxy.kubeconfig
    kubectl config set-context default \
    --cluster=kubernetes \
    --user=system:kube-proxy \
    --kubeconfig=kube-proxy.kubeconfig
    kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    分发 kubeconfig 文件:

    cd /opt/k8s/kubeconfig
    scp kube-proxy.kubeconfig root@192.168.2.175:/apps/k8s/conf
    scp kube-proxy.kubeconfig root@192.168.2.176:/apps/k8s/conf
    scp kube-proxy.kubeconfig root@192.168.2.177:/apps/k8s/conf
    scp kube-proxy.kubeconfig root@192.168.2.185:/apps/k8s/conf
    scp kube-proxy.kubeconfig root@192.168.2.187:/apps/k8s/conf
    scp kube-proxy.kubeconfig root@192.168.3.62:/apps/k8s/conf
    scp kube-proxy.kubeconfig root@192.168.3.70:/apps/k8s/conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    15.3 创建 kube-proxy 配置文件

    从 v1.10 开始,kube-proxy 部分参数可以配置文件中配置。可以使用 –write-config-to 选项生成该配置文件。
    创建 kube-proxy配置:
    k8s-master-1 为例
    修改以下参数为对应节点名字跟kubelet一致:

    --hostname-override=k8s-master-1
    
    • 1

    所有节点执行

    cat > /apps/k8s/conf/kube-proxy <<EOF
    KUBE_PROXY_OPTS="--logtostderr=true \
    --v=2 \
    --masquerade-all=true \
    --proxy-mode=ipvs \
    --profiling=true \
    --ipvs-min-sync-period=5s \
    --ipvs-sync-period=5s \
    --ipvs-scheduler=rr \
    --conntrack-max-per-core=0 \
    --cluster-cidr=10.80.0.0/12 \
    --log-dir=/apps/k8s/log \
    --metrics-bind-address=0.0.0.0 \
    --alsologtostderr=true \
    --hostname-override=k8s-master-1 \
    --kubeconfig=/apps/k8s/conf/kube-proxy.kubeconfig"
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • bindAddress : 监听地址; --hostname-override=k8s-master-1
      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 模式;

    15.4 创建和分发 kube-proxy systemd unit 文件

    cd /opt/k8s/work
    cat > kube-proxy.service <<EOF
    [Unit]
    Description=Kubernetes Proxy
    After=network.target
    [Service]
    LimitNOFILE=655350
    LimitNPROC=655350
    LimitCORE=infinity
    LimitMEMLOCK=infinity
    EnvironmentFile=-/apps/k8s/conf/kube-proxy
    ExecStart=/apps/k8s/bin/kube-proxy \$KUBE_PROXY_OPTS
    Restart=on-failure
    RestartSec=5
    [Install]
    WantedBy=multi-user.target
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    分发
    kube-proxy systemd unit 文件:

    cd /opt/k8s/work
    scp kube-proxy.service root@192.168.2.175:/usr/lib/systemd/system/
    scp kube-proxy.service root@192.168.2.176:/usr/lib/systemd/system/
    scp kube-proxy.service root@192.168.2.177:/usr/lib/systemd/system/
    scp kube-proxy.service root@192.168.2.185:/usr/lib/systemd/system/
    scp kube-proxy.service root@192.168.2.187:/usr/lib/systemd/system/
    scp kube-proxy.service root@192.168.3.62:/usr/lib/systemd/system/
    scp kube-proxy.service root@192.168.3.70:/usr/lib/systemd/system/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    15.5 启动 kube-proxy 服务

    所有节点执行

    # 全局刷新service
    systemctl daemon-reload
    # 设置kubelet开机启动
    systemctl enable kubelet
    #重启kubelet
    systemctl restart kubelet
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    15.6 检查启动结果

    所有节点执行

    systemctl status kube-proxy|grep Active
    
    • 1

    确保状态为 active (running) ,否则查看日志,确认原因:

    journalctl -u kube-proxy
    
    • 1

    15.7 查看监听端口

    [root@k8s-master-1 conf]# netstat -lnpt|grep kube-prox
    tcp6 0 0 :::10249 :::* LISTEN
    906/kube-proxy
    tcp6 0 0 :::10256 :::* LISTEN
    906/kube-proxy
    
    • 1
    • 2
    • 3
    • 4
    • 5

    15.8 查看 ipvs 路由规则

    任意节点执行

    /usr/sbin/ipvsadm -ln
    
    • 1

    预期输出:

    [root@k8s-master-1 conf]# /usr/sbin/ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
    -> RemoteAddress:Port Forward Weight ActiveConn InActConn
    TCP 10.66.0.1:443 rr
    -> 192.168.2.175:5443 Masq 1 2 0
    -> 192.168.2.176:5443 Masq 1 4 0
    -> 192.168.2.177:5443 Masq 1 0 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    可见所有通过 https 访问 K8S SVC kubernetes 的请求都转发到 kube-apiserver 节点的 5443 端口;

    期待下次的分享,别忘了三连支持博主呀~
    我是 念舒_C.ying ,期待你的关注~💪💪💪

    附专栏链接
    【云原生 · Kubernetes】部署高可用kube-scheduler集群
    【云原生 · Kubernetes】部署高可用 kube-controller-manager 集群
    【云原生 · Kubernetes】runtime组件
    【云原生 · Kubernetes】apiserver高可用
    【云原生 · Kubernetes】kubernetes v1.23.3 二进制部署(三)
    【云原生 · Kubernetes】kubernetes v1.23.3 二进制部署(二)
    【云原生 · Kubernetes】kubernetes v1.23.3 二进制部署(一)
    【云原生 · Kubernetes】Kubernetes 编排部署GPMall(一)

  • 相关阅读:
    DPDK 网卡设备scan及probe流程
    Selenium--常用元素操作方法
    边缘计算网关的主要功能有哪些?天拓四方
    金仓数据库 KingbaseES SQL 语言参考手册 (14. SQL语句:COMMIT 到 CREATE LANGUAGE)
    基于html+css的图展示118
    微服务的构建
    Mysql按照中文首字母排序
    聊聊 C++ 和 C# 中的 lambda 玩法
    使用公式在Excel中指定列值的变化实现自动间隔着色(不是按照固定的行数)
    Git_02_查看本地未推送的commit记录
  • 原文地址:https://blog.csdn.net/qq_52716296/article/details/126775610