• 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

  • 相关阅读:
    linux 服务器---FastDFS分布式文件服务器配置
    JFinal getModel方法(从页面表单中获取Model对象)+数据库存储问题
    实现Callable接口。带返回值的线程
    Spring 自动化装配Bean
    Spring--基于代理类ProxyFactoryBean的AOP实现
    Jfinal中的validator理解/详解
    Jfinal中的文件上传
    HotSpot学习(二):虚拟机的启动过程源码解析
    HotSpot学习(一):编译、启动与调试
    Netty的对象池
  • 原文地址:https://www.cnblogs.com/Heroge/p/12658380.html
Copyright © 2020-2023  润新知