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角色的权限

1586246650188

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

1586246861934

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/

1586247208836

4.在各Node节点查看复制过来的证书及私钥

温馨提示:请注意 私钥的文件属性是否是600

在mfyxw30.mfyxw.com主机上执行

[root@mfyxw30 ~]#

1586247389849

在mfyxw40.mfyxw.com主机上执行

[root@mfyxw40 ~]#

1586247430325

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

1586248144605

(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

1586248162922

(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

1586248179667

(4)use-context

注意:在/opt/kubernetes/server/bin/conf目录

[root@mfyxw30 conf]#kubectl config use-context myk8s-context --kubeconfig=kube-proxy.kubeconfig

1586248195632

(5)将生成的kube-proxy.kubeconfig文件发送给mfyxw40.mfyxw.com主机

[root@mfyxw30 conf]# scp -r kube-proxy.kubeconfig mfyxw40:/opt/kubernetes/server/bin/conf/

1586248481600

6.开启IPVS模块

在mfyxw30.mfyxw.com主机上执行

先查看是否已经加载了ipvs模块

[root@mfyxw30 ~]lsmod | grep ip_vs

1586248879687

如果未加载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

1586249206781

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

1586249737021

在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

1586249726325

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

1586249983226

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

1586250387659

11.ipvsadm

ipvsadm是用于设置、维护和检查Linux内核中虚拟服务器列表的命令

在mfyxw30和mfyxw40服务器上分行执行

[root@mfyxw30 ~]#ipvsadm -Ln
[root@mfyxw40 ~]#ipvsadm -Ln

1586250951676

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

1586251293946

跨节点的二个pod是无法ping,因没有安装网络插件(网络插件后面安装,安装完即能ping通)

1586251434196

posted on 2020-04-08 10:38  杨枫哥  阅读(522)  评论(0编辑  收藏  举报