k8s运算节点-kube-proxy

kube-proxy 连接node网络和集群网络

一、证书准备

node200
vi /opt/certs/kube-proxy-client-csr.json

{
    "CN": "system:node-proxier",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "beijing",
            "L": "beijing",
            "O": "hzw",
            "OU": "hzwself"
        }
    ]
}    

注意,这里签的证书CN指定的system:node-proxier是k8s里内置已存在的角色(拥有proxy需要的权限),后面kube-proxy访问apiserver是会使用这里CN指定的用户。
若这里不指定成sysrem:kube-proxy,则后面还需要和为kubelete绑定system:node角色一样要创建一个ClusterRoleBinding型资源,为目标user绑定上system:node-proxier角色
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kube-proxy-csr.json | cfssljson -bare kube-proxy-client
[root@node21 cert]# scp node200:/opt/certs/kube-proxy*.pem ./ 分发证书

二、生成kube-proxy配置
  • set-cluster
[root@node21 conf]# pwd
/opt/kubernetes/server/bin/conf
[root@node21 conf]# kubectl config set-cluster myk8s \
>   --certificate-authority=/opt/kubernetes/server/bin/cert/ca.pem \
>   --embed-certs=true \
>   --server=https://172.10.10.10:7443 \
>   --kubeconfig=kube-proxy.kubeconfig
Cluster "myk8s" set.
  • set-credentials
[root@node21 conf]# pwd
/opt/kubernetes/server/bin/conf
[root@node21 conf]# kubectl config set-credentials kube-proxy \
>   --client-certificate=/opt/kubernetes/server/bin/cert/kube-proxy-client.pem \
>   --client-key=/opt/kubernetes/server/bin/cert/kube-proxy-client-key.pem \
>   --embed-certs=true \
>   --kubeconfig=kube-proxy.kubeconfig
User "kube-proxy" set.
  • set-context
[root@node21 conf]# pwd
/opt/kubernetes/server/bin/conf
[root@node21 conf]# kubectl config set-context myk8s-context \
>   --cluster=myk8s \
>   --user=kube-proxy \
>   --kubeconfig=kube-proxy.kubeconfig
Context "myk8s-context" created.

注意:这里的user和上面创建证书时指定的CN有联系

  • use-context
[root@node21 conf]# kubectl config use-context myk8s-context --kubeconfig=kube-proxy.kubeconfig
Switched to context "myk8s-context".
查看生成的配置文件

这种配置文件可以理解为k8s内,用户的配置文件
[root@node21 conf]# cat kube-proxy.kubeconfig

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJT...
    server: https://172.10.10.10:7443
  name: myk8s
contexts:
- context:
    cluster: myk8s
    user: kube-proxy
  name: myk8s-context
current-context: myk8s-context
kind: Config
preferences: {}
users:
- name: kube-proxy
  user:
    client-certificate-data: LS0tLS1CRUdJTiBD...
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJ...
三、使用ipvs调度流量
  • 常用的三种流量调度模式
    • Userspace(已废弃)
    • Iptables(濒临废弃)
    • Ipvs(推荐)

kubernetes的ipvs模式和iptables模式:https://blog.csdn.net/fanren224/article/details/86548398
K8S集群优化之路由转发:使用IPVS替代iptables:https://www.jianshu.com/p/9b4b700c7765
IPVS中实现的连接调度算法:https://www.jianshu.com/p/619c23fb1a14

开启ipvs支持
yum -y install ipvsadm  ipset
# 临时生效
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_nq
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
# 永久生效
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_nq
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

或使用脚本将所有ipvs模块都启动

#!/bin/bash
# ipvs内核模块地址
ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
# 遍历所有ipvs组件,并启动
for i in $(ls $ipvs_mods_dir | grep -o "^[^.]*")
do
    /sbin/modinfo -F filename $i &>/dev/null
    if [ $? -eq 0 ]; then
        echo "/sbin/modprobe $i"
        /sbin/modprobe $i
    fi
done
/sbin/modprobe ip_vs_dh
/sbin/modprobe ip_vs_ftp
/sbin/modprobe ip_vs
/sbin/modprobe ip_vs_lblc
/sbin/modprobe ip_vs_lblcr
/sbin/modprobe ip_vs_lc
/sbin/modprobe ip_vs_nq
/sbin/modprobe ip_vs_pe_sip
/sbin/modprobe ip_vs_rr
/sbin/modprobe ip_vs_sed
/sbin/modprobe ip_vs_sh
/sbin/modprobe ip_vs_wlc
/sbin/modprobe ip_vs_wrr

wrr、rr、wlc等等,其实是各调度算法的缩写,其对应模块也就是对应流量调度算法的实现模块
检查mod启动情况: lsmod | grep ip_vs

四、启动kube-proxy
启动脚本

vi /opt/kubernetes/server/bin/kube-proxy-1021.sh

#!/bin/sh
./kube-proxy \
  --cluster-cidr 172.20.0.0/16 \
  --hostname-override 172.10.10.21 \
  --proxy-mode=ipvs \           # 使用ipvs模式
  --ipvs-scheduler=nq \         # ipvs调度算法使用“不排队调度(Never Queue Scheduling)”
  --kubeconfig ./conf/kube-proxy.kubeconfig

kube-proxy 的 cluster-cidr (不设置默认值为空)。cluster-cidr 主要用于帮助 kube-proxy 区分内外流量:当值为空时,kube-proxy 认为所有流量都是内部流量,不做 SNAT(MASQ);当值非空时,来自 cluster-cidr 网络(即 Pod 网络)的流量被当成内部流量,访问 Service 时不做 SNAT(MASQ),来自其他网络的流量被当成外部流量,访问 Service 时需要做 SNAT(MASQ)。此外,kube-proxy 还提供了一个独立参数 masquerade-all,如果设置了该参数,那所有访问 Service 的流量都会做 SNAT(MASQ),不再区分内外流量。

supervisor托管启动

vi /etc/supervisord.d/kube-proxy.ini

[program:kube-proxy-10.21]
command=/opt/kubernetes/server/bin/kube-proxy-1021.sh
numprocs=1
directory=/opt/kubernetes/server/bin
autostart=true
autorestart=true
startsecs=22
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopasgroup=true
stopwaitsecs=10
user=root
redirect_stderr=true
stdout_logfile=/data/logs/kubernetes/kube-proxy.stdout.log
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=4
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
stderr_logfile=/data/logs/kubernetes/kube-proxy.stderr.log
stderr_logfile_maxbytes=64MB
stderr_logfile_backups=4
stderr_capture_maxbytes=1MB
stderr_events_enabled=false

supervisorctl update

启动验证

在这里插入图片描述

[root@node21 kubernetes]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.1:443 nq
  -> 172.10.10.21:6443            Masq    1      0          0         
  -> 172.10.10.22:6443            Masq    1      0          0  
[root@node22 kubernetes]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.1:443 nq
  -> 172.10.10.21:6443            Masq    1      0          0         
  -> 172.10.10.22:6443            Masq    1      0          0  
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐