kube-proxy是Kubernetes的核心组件,部署在每个Node节点上,它是实现Kubernetes Service的通信与负载均衡机制的重要组件; kube-proxy负责为Pod创建代理服务,从apiserver获取所有server信息,并根据server信息创建代理服务,实现server到Pod的请求路由和转发,从而实现K8s层级的虚拟转发网络
在k8s中,提供相同服务的一组pod可以抽象成一个service,通过service提供的统一入口对外提供服务,每个service都有一个虚拟IP地址(VIP)和端口号供客户端访问。kube-proxy存在于各个node节点上,主要用于Service功能的实现,具体来说,就是实现集群内的客户端pod访问service,或者是集群外的主机通过NodePort等方式访问service。在当前版本的k8s中,kube-proxy默认使用的是iptables模式,通过各个node节点上的iptables规则来实现service的负载均衡,但是随着service数量的增大,iptables模式由于线性查找匹配、全量更新等特点,其性能会显著下降。从k8s的1.8版本开始,kube-proxy引入了IPVS模式,IPVS模式与iptables同样基于Netfilter,但是采用的hash表,因此当service数量达到一定规模时,hash查表的速度优势就会显现出来,从而提高service的服务性能。
kube-proxy负责为Service提供cluster内部的服务发现和负载均衡,它运行在每个Node计算节点上,负责Pod网络代理, 它会定时从etcd服务获取到service信息来做相应的策略,维护网络规则和四层负载均衡工作。在K8s集群中微服务的负载均衡是由Kube-proxy实现的,它是K8s集群内部的负载均衡器,也是一个分布式代理服务器,在K8s的每个节点上都有一个,这一设计体现了它的伸缩性优势,需要访问服务的节点越多,提供负载均衡能力的Kube-proxy就越多,高可用节点也随之增多。
service是一组pod的服务抽象,相当于一组pod的LB,负责将请求分发给对应的pod。service会为这个LB提供一个IP,一般称为cluster IP。kube-proxy的作用主要是负责service的实现,具体来说,就是实现了内部从pod到service和外部的从node port向service的访问。
简单来说:
-> kube-proxy其实就是管理service的访问入口,包括集群内Pod到Service的访问和集群外访问service。
-> kube-proxy管理sevice的Endpoints,该service对外暴露一个Virtual IP,也成为Cluster IP, 集群内通过访问这个Cluster IP:Port就能访问到集群内对应的serivce下的Pod。
-> service是通过Selector选择的一组Pods的服务抽象,其实就是一个微服务,提供了服务的LB和反向代理的能力,而kube-proxy的主要作用就是负责service的实现。
-> service另外一个重要作用是,一个服务后端的Pods可能会随着生存灭亡而发生IP的改变,service的出现,给服务提供了一个固定的IP,而无视后端Endpoint的变化。
集群规划
主机名 | 角色 | IP地址 |
---|---|---|
mfyxw30.mfyxw.com | kube-proxy | 192.168.80.30 |
mfyxw40.mfyxw.com | kube-proxy | 192.168.80.40 |
注意:这里部署文档以mfyxw30.mfyxw.com主机为例,另外一台运算节点安装部署方法类似
1.创建生成kube-proxy证书签名请求(csr)的JSON配置文件
在mfyxw50.mfyxw.com主机上操作
[root@mfyxw50 ~]#cd /opt/certs/
[root@mfyxw50 certs]#cat > /opt/certs/kube-proxy.json << EOF
{
"CN": "system:kube-proxy",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "GuangDong",
"L": "GuangZhou",
"O": "od",
"OU": "ops"
}
]
}
EOF
温馨提示:CN这个值有二个方式:
1.可以随便起,但是,如果随便起的名字,需要后面进行clusterRoleBinding
2.可以直接让CN的值指定使用原k8s集群角色的名称,这样就能让此证书默认拥有了k8s角色的权限
2.生成kube-proxy证书和私钥
在mfyxw50.mfyxw.com主机上执行
[root@mfyxw50 ~]#cd /opt/certs/
[root@mfyxw50 certs]#cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kube-proxy.json | cfssljson -bare kube-proxy-client
3.将生成的kube-proxy证书和私钥复制至Node节点
在mfyxw50.mfyxw.com主机上执行
[root@mfyxw50 certs]#scp -r kube-proxy-client.pem kube-proxy-client-key.pem mfyxw30:/opt/kubernetes/server/bin/cert/
[root@mfyxw50 certs]#scp -r kube-proxy-client.pem kube-proxy-client-key.pem mfyxw40:/opt/kubernetes/server/bin/cert/
4.在各Node节点查看复制过来的证书及私钥
温馨提示:请注意 私钥的文件属性是否是600
在mfyxw30.mfyxw.com主机上执行
[root@mfyxw30 ~]#
在mfyxw40.mfyxw.com主机上执行
[root@mfyxw40 ~]#
5.创建配置
在mfyxw30.mfyxw.com主机上执行即可,不需要二台都执行
(1)set-cluster
注意:在/opt/kubernetes/server/bin/conf目录
[root@mfyxw30 conf]#cd /opt/kubernetes/server/bin/conf
[root@mfyxw30 conf]# kubectl config set-cluster myk8s
--certificate-authority=/opt/kubernetes/server/bin/cert/ca.pem
--embed-certs=true
--server=https://192.168.80.100:7443
--kubeconfig=kube-proxy.kubeconfig
(2)set-credentials
注意:在/opt/kubernetes/server/bin/conf目录
[root@mfyxw30 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
(3)set-context
注意:在/opt/kubernetes/server/bin/conf目录
[root@mfyxw30 conf]#kubectl config set-context myk8s-context
--cluster=myk8s
--user=kube-proxy
--kubeconfig=kube-proxy.kubeconfig
(4)use-context
注意:在/opt/kubernetes/server/bin/conf目录
[root@mfyxw30 conf]#kubectl config use-context myk8s-context --kubeconfig=kube-proxy.kubeconfig
(5)将生成的kube-proxy.kubeconfig文件发送给mfyxw40.mfyxw.com主机
[root@mfyxw30 conf]# scp -r kube-proxy.kubeconfig mfyxw40:/opt/kubernetes/server/bin/conf/
6.开启IPVS模块
在mfyxw30.mfyxw.com主机上执行
先查看是否已经加载了ipvs模块
[root@mfyxw30 ~]lsmod | grep ip_vs
如果未加载ipvs模块,请添加,使用脚本添加如下:
[root@mfyxw30 ~]#cat > /root/ipvs.sh << EOF
#!/bin/bash
ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
for i in $(ls $ipvs_mods_dir|grep -o "^[^.]*")
do
/sbin/modinfo -F filename $i &>/dev/null
if [ $? -eq 0 ];then
/sbin/modprobe $i
fi
done
EOF
执行添加ipvs模块脚本
[root@mfyxw30 ~]#cd /root
[root@mfyxw30 ~]#chmod +x ipvs.sh
[root@mfyxw30 ~]#./ipvs.sh
[root@mfyxw30 ~]#lsmod | grep ip_vs
7.添加kube-proxy启动脚本
在mfyxw30.mfyxw.com主机上执行
[root@mfyxw30 ~]#cat > /opt/kubernetes/server/bin/kube-proxy.sh << EOF
#!/bin/sh
./kube-proxy
--cluster-cidr 10.10.0.0/16
--hostname-override mfyxw30.mfyxw.com
--proxy-mode=ipvs
--ipvs-scheduler=nq
--kubeconfig /opt/kubernetes/server/bin/conf/kube-proxy.kubeconfig
EOF
在mfyxw40.mfyxw.com主机上执行
[root@mfyxw40 ~]#cat > /opt/kubernetes/server/bin/kube-proxy.sh << EOF
#!/bin/sh
./kube-proxy
--cluster-cidr 10.10.0.0/16
--hostname-override mfyxw40.mfyxw.com
--proxy-mode=ipvs
--ipvs-scheduler=nq
--kubeconfig /opt/kubernetes/server/bin/conf/kube-proxy.kubeconfig
EOF
8.授予脚本kube-proxy.sh可执行权限及创建目录
在mfyxw30.mfyxw.com和mfyxw40.mfyxw.com主机上分别执行
#在mfyxw30.mfyxw.com主机上执行
[root@mfyxw30 ~]#chmod +x /opt/kubernetes/server/bin/kube-proxy.sh
#在mfyxw30.mfyxw.com主机上创建存放kube-proxy日志文件
[root@mfyxw30 ~]#mkdir -p /data/logs/kubernetes/kube-proxy
#在mfyxw40.mfyxw.com主机上执行
[root@mfyxw40 ~]#chmod +x /opt/kubernetes/server/bin/kube-proxy.sh
#在mfyxw40.mfyxw.com主机上创建存放kube-proxy日志文件
[root@mfyxw40 ~]#mkdir -p /data/logs/kubernetes/kube-proxy
9.为kube-proxy创建supervisor的开机自启配置文件
在mfyxw30.mfyxw.com主机上执行
[root@mfyxw30 ~]#cat > /etc/supervisord.d/kube-proxy.ini << EOF
[program:kube-proxy-80-30]
command=/opt/kubernetes/server/bin/kube-proxy.sh ; the program (relative uses PATH, can take args)
numprocs=1 ; number of processes copies to start (def 1)
directory=/opt/kubernetes/server/bin ; directory to cwd to before exec (def no cwd)
autostart=true ; start at supervisord start (default: true)
autorestart=true ; retstart at unexpected quit (default: true)
startsecs=30 ; number of secs prog must stay running (def. 1)
startretries=3 ; max # of serial start failures (default 3)
exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT ; signal used to kill process (default TERM)
stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
user=root ; setuid to this UNIX account to run the program
redirect_stderr=false ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/kubernetes/kube-proxy/proxy.stdout.log ; stdout log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=4 ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false ; emit events on stdout writes (default false)
stderr_logfile=/data/logs/kubernetes/kube-proxy/proxy.stderr.log ; stderr log path, NONE for none; default AUTO
stderr_logfile_maxbytes=64MB ; max # logfile bytes b4 rotation (default 50MB)
stderr_logfile_backups=4 ; # of stderr logfile backups (default 10)
stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
stderr_events_enabled=false ; emit events on stderr writes (default false)
EOF
在mfyxw40.mfyxw.com主机上执行
[root@mfyxw40 ~]#cat > /etc/supervisord.d/kube-proxy.ini << EOF
[program:kube-proxy-80-40]
command=/opt/kubernetes/server/bin/kube-proxy.sh ; the program (relative uses PATH, can take args)
numprocs=1 ; number of processes copies to start (def 1)
directory=/opt/kubernetes/server/bin ; directory to cwd to before exec (def no cwd)
autostart=true ; start at supervisord start (default: true)
autorestart=true ; retstart at unexpected quit (default: true)
startsecs=30 ; number of secs prog must stay running (def. 1)
startretries=3 ; max # of serial start failures (default 3)
exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT ; signal used to kill process (default TERM)
stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
user=root ; setuid to this UNIX account to run the program
redirect_stderr=false ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/kubernetes/kube-proxy/proxy.stdout.log ; stdout log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=4 ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false ; emit events on stdout writes (default false)
stderr_logfile=/data/logs/kubernetes/kube-proxy/proxy.stderr.log ; stderr log path, NONE for none; default AUTO
stderr_logfile_maxbytes=64MB ; max # logfile bytes b4 rotation (default 50MB)
stderr_logfile_backups=4 ; # of stderr logfile backups (default 10)
stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
stderr_events_enabled=false ; emit events on stderr writes (default false)
EOF
10.启动服务并检查
分别在mfyxw30.mfyxw.com和mfyxw40.mfyxw.com主机上执行
#在mfyxw30主机上执行
[root@mfyxw30 ~]#supervisorctl update
[root@mfyxw30 ~]#supervisorctl status
#在mfyxw40主机上执行
[root@mfyxw40 ~]#supervisorctl update
[root@mfyxw40 ~]#supervisorctl status
11.ipvsadm
ipvsadm是用于设置、维护和检查Linux内核中虚拟服务器列表的命令
在mfyxw30和mfyxw40服务器上分行执行
[root@mfyxw30 ~]#ipvsadm -Ln
[root@mfyxw40 ~]#ipvsadm -Ln
12.创建一个daemonset验证
在mfyxw30.mfyxw.com主机上执行
[root@mfyxw30 ~]#cat > /root/daemon.yaml <<EOF
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: nginx-ds
labels:
addonmanager.kubernetes.io/mode: Reconcile
spec:
template:
metadata:
labels:
app: nginx-ds
spec:
containers:
- name: my-nginx
image: harbor.od.com/public/nginx:v1.7.9
ports:
- containerPort: 80
EOF
#使用kubectl create命令来创建
[root@mfyxw30 ~]#kubectl create -f /root/daemon.yaml
跨节点的二个pod是无法ping,因没有安装网络插件(网络插件后面安装,安装完即能ping通)