13.k8s运算节点-kube-proxy
k8s运算节点-kube-proxykube-proxy 连接node网络和集群网络一、证书准备node200vi /opt/certs/kube-proxy-client-csr.json{"CN": "system:node-proxier","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN",
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
更多推荐
所有评论(0)