Kubernets二进制安装(12)之部署Node节点服务的kube-Proxy
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通)
Kubernets二进制安装(12)之部署Node节点服务的kube-Proxy的更多相关文章
- Kubernets二进制安装(11)之部署Node节点服务的kubelet
集群规划 主机名 角色 IP地址 mfyxw30.mfyxw.com kubelet 192.168.80.30 mfyxw40.mfyxw.com kubelet 192.168.80.40 注意: ...
- Kubernets二进制安装(6)之部署主控节点服务--etcd
Etcd是Kubernetes集群中的一个十分重要的组件,用于保存集群所有的网络配置和对象的状态信息. 整个kubernetes系统中一共有两个服务需要用到etcd用来协同和存储配置,分别是 网络插件 ...
- Kubernets二进制安装(7)之部署主控节点服务--apiserver简介
API Server简介 Kubernetes API Server提供了K8S各类资源对象(如:pod.RC.Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和 ...
- Kubernets二进制安装(7)之部署主控节点服务--apiserver二进制安装
kube-apiserver集群规划 主机名 角色 IP地址 mfyxw30.mfxyw.com kube-apiserver主 192.168.80.30 mfyxw40.mfyxw.com kub ...
- Kubernets二进制安装(9)之部署主控节点控制器controller-manager
kube-controller-manager运行控制器,它们是处理集群中常规任务的后台线程 Controller Manager就是集群内部的管理控制中心,由负责不同资源的多个Controller构 ...
- Kubernets二进制安装(10)之部署主控节点部署调度器服务kube-scheduler
Kubernetes Scheduler是一个策略丰富.拓扑感知.工作负载特定的功能,调度器显著影响可用性.性能和容量.调度器需要考虑个人和集体的资源要求.服务质量要求.硬件/软件/政策约束.亲和力和 ...
- 二进制安装 kubernetes 1.12(四) - 部署 Node 节点组件
在 master 上操作 vi /etc/profile export PATH=/opt/kubernetes/bin:$PATH source /etc/profile 将 kubelet-boo ...
- Kubernets二进制安装(13)之部署Flannel
Flannel简介 Flannel是CoreDNS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址 ...
- Kubernets二进制安装(8)之部署四层反向代理
四层反向代理集群规划 主机名 角色 IP地址 mfyxw10.mfyxw.com 4层负载均衡(主) 192.168.80.10 mfyxw20.mfyxw.com 4层负载均衡(从) 192.168 ...
随机推荐
- ctfshow—pwn10
格式化字符串漏洞 具体什么是格式化字符串请大家参考如下文章 https://wiki.x10sec.org/pwn/fmtstr/fmtstr_intro/ printf函数格式化输出符号及详细说明 ...
- REUSE_ALV_FIELDCATALOG_MERGE函数
今天使用REUSE_ALV_FIELDCATALOG_MERGE函数,就是获取不到fieldcat, 搞了半天才发现,原来参数要全部大写才行!!小写字符就是获取不到,唉,悲哀...
- [Usaco2002 Feb]Rebuilding Roads重建道路
题目描述 一场可怕的地震后,奶牛用N个牲口棚(1 <= N <= 150,编号1..N)重建了农民John的牧场.奶牛没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是唯一 ...
- 输入12V,输出12V的限流芯片
随着手机充电电流的提升,和设备的多样化,USB限流芯片就随着需求的增加而越来越多,同时为了更好的保护电子设备,需要进行一路或者多路的负载进行限流. USB限流芯片,5V输入 1, PW1502,常使用 ...
- JVM虚拟机基础
JVM 全称Java Virtual Machine,也就是我们耳熟能详的Java 虚拟机.它能识别.class 后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作. Ja ...
- odoo之技巧合集一
罗列一些odoo开发中的简单但有效的方法: 1.重写odoo登录代码 参考链接:odoo10-重写登录方法 from odoo import models, fields, api, SUPERUSE ...
- CTO也糊涂的常用术语:功能模块、业务架构、用户需求、文档……
功能模块.业务架构.需求分析.用户需求.系统分析.功能设计.详细设计.文档.业务.技术--很多被随口使用的名词,其实是含糊甚至错误的. 到底含糊在哪里,错误在哪里,不仅仅是新手软件开发人员糊涂,许多入 ...
- jmeter-并发及常数吞吐量定时器设定
- 通俗易懂的解释:什么是API
API 全称 Application Programming Interface,即应用程序编程接口. 看到这里,急性子的小白同学马上就憋不住了:这不管是英文还是中文我每个字都懂啊,只是凑一块就不知道 ...
- Hyper-v安装centos后的网络配置
修改配置文件 进入目录:cd /etc/sysconfig/network-scripts/ 修改ifcfg-eth0文件(不通机器文件名可能不同,可以通过 ip addr 命令查看网卡名) HWAD ...