二、k8s1.12 master多节点(高可用)

https://blog.csdn.net/qq_25611295/article/details/84068193

二、k8s1.12 master多节点(高可用)
原创 超级大饭粒 最后发布于2018-11-14 16:02:00 阅读数 4736 收藏
展开

架构图
在这里插入图片描述
master 节点我们要避免单节点,防止故障
1、多节点部署

我们在192.168.1.9上面部署另外一台master
首先我们将主节点文件拷贝过去:

cd /opt
scp -r kubernetes 192.168.1.9:/opt/
scp -r etcd 192.168.1.9:/opt/
scp /usr/lib/systemd/system/kube-* 192.168.1.9:/usr/lib/systemd/system/

    1
    2
    3
    4

此时我们在master02上面修改配置文件,
需要修改的地方就2个:

cd /opt/kubernetes/cfg
 vim kube-apiserver
--bind-address=192.168.1.9
--advertise-address=192.168.1.9

    1
    2
    3
    4

其他的配置文件都是指向本地不用修改,
直接启动:

systemctl start kube-apiserver
systemctl start kube-controller-manager.service
systemctl start kube-scheduler.service

    1
    2
    3

检测:
将kubectl工具复制出来:

cp /opt/kubernetes/bin/kubectl /usr/local/bin/

[root@master02 cfg]# kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok
scheduler            Healthy   ok
etcd-1               Healthy   {"health":"true"}
etcd-0               Healthy   {"health":"true"}
etcd-2               Healthy   {"health":"true"}

    1
    2
    3
    4
    5
    6
    7
    8
    9

此处可以看到多节点没啥难度,搞定。
2、master负载均衡

我们用nginx的stream模块做负载均衡,因此,master将不直连kube-apiserver,而是连接nginx,再由nginx转发,(做nginx高可用的就需要写vip,因为ip需要漂移),此处我们nginx master为192.168.1.21,nginx backup为192.168.1.111,vip为192.168.1.10
如果是编译安装的,没有加入此模块的,我们需要加入此模块:
加入方法:
./sbin/nginx -V 获取到编译的参数,
进入源码路径编译,并且加上–with-stream

cd nginx-1.12.1/
./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-pcre --with-stream
make
cp -rf ./objs/nginx /usr/local/nginx/sbin
/etc/init.d/nginx restart

    1
    2
    3
    4
    5

/usr/local/nginx/sbin/nginx -V
此时可以发现stream模块已经编译进去

nginx.conf配置:

stream {
    log_format main "$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent";
    access_log  /var/log/nginx/k8s.log  main;

    upstream k8s-apiserver {
        server 192.168.1.39:6443;
        server 192.168.1.9:6443;
  }

  server  {
        listen 6443;
        proxy_pass k8s-apiserver;
  }

}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

注意:这个是4层TCP协议,不要写到http{}模块里面,不然会报错
重新加载nginx:
./sbin/nginx -s reload

此时我们需要信任nginx高可用的机器,所以,如果我们之前没有添加信任IP,我们现在需要添加上,master上,server证书需要重新配置:、
在我们Master节点生成证书处,
加上192.168.1.9和192.168.1.111和192.168.1.10

cat > server-csr.json <<EOF
{
    "CN": "kubernetes",
    "hosts": [
      "10.0.0.1",
      "127.0.0.1",
      "192.168.1.39",
      "192.168.1.40",
      "192.168.1.41",
      "192.168.1.42",
      "192.168.1.9",
      "192.168.1.21",
      "192.168.1.10",
      "192.168.1.111",
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37

将生成的server-key.pem和server.pem 将以前的覆盖,并且发送到另外一台master

cp server-key.pem server.pem /opt/kubernetes/ssl
scp server-key.pem server.pem 192.168.1.9:/opt/kubernetes/ssl

    1
    2

重启服务

systemctl restart kube-apiserver.service

    1

如果我们我们证书上面已经信任了ip,上面就可以忽略,现在我们需要将node节点配置里面的所有关于master节点的ip,全部换成nginxd代理机器的ip,(要做keepalived就得全部换成vip:192.168.1.10)
换后:
注意:这里的操作要完成了keepalived的高可用,才能改成这个ip,不然会找不到这个ip而报错,如果不需要keepalived高可用,直接填写nginx ip即可

[root@g2 cfg]# grep 10 *
bootstrap.kubeconfig:    server: https://192.168.1.10:6443
kubelet.kubeconfig:    server: https://192.168.1.10:6443
kube-proxy.kubeconfig:    server: https://192.168.1.10:6443

    1
    2
    3
    4

重启节点的服务:

systemctl restart kubelet.service
systemctl restart kube-proxy.service

    1
    2

此时,我们可以看到nginx有日志进来:

[root@server2 ~]# tail -f /var/log/nginx/k8s.log
192.168.1.42 192.168.1.9:6443 - [13/Nov/2018:15:59:21 +0800] 200 1119
192.168.1.42 192.168.1.39:6443 - [13/Nov/2018:15:59:21 +0800] 200 1118
192.168.1.40 192.168.1.39:6443 - [13/Nov/2018:15:59:21 +0800] 200 1566
192.168.1.42 192.168.1.9:6443 - [13/Nov/2018:15:59:21 +0800] 200 1566

    1
    2
    3
    4
    5

在master上面检查节点也正常:

[root@master k8s-cert]# kubectl get node
NAME           STATUS   ROLES    AGE   VERSION
192.168.1.40   Ready    <none>   23h   v1.12.1
192.168.1.42   Ready    <none>   23h   v1.12.1

    1
    2
    3
    4

3、keepalived高可用:

上面Nginx对k8s进行了高可用,现在我们还需要对nginx进行高可用,
安装

yum install -y keepalived

    1

keepalived主节点配置:

[root@server1 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     liao@liaochao.com
   }
   notification_email_from root@liaochao.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/usr/local/sbin/check_ng.sh" #检测脚本
    interval 3
}

vrrp_instance VI_1 {
    state MASTER #备需要设置为BACKUP
    interface eth0  #网卡名称
    virtual_router_id 51 #路由唯一id
    priority 100 #备需要设置为90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass aminglinux>com
    }
    virtual_ipaddress {
        192.168.1.10  #vip
    }

    track_script {
        chk_nginx
    }

}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35

nginx检测脚本:

[root@server1 ~]# cat /usr/local/sbin/check_ng.sh
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ]; then
        /etc/init.d/nginx start
        n2=`ps -C nginx --no-heading|wc -l`
        if [ $n2 -eq "0"  ]; then
                echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
 #               systemctl stop keepalived
        /etc/init.d/keepalived stop
        fi
fi

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

授权:

chmod+x  /usr/local/sbin/check_ng.sh

    1

通过这个脚本,我们可以实现nginx挂掉自动拉取,拉取失败就调用keepalived,进行准备切换 高可用。保证不宕机
启动keepalived:

systemctl start keepalived

    1

此时 我们可以使用:ip a观察vip已经绑定上去

在这里插入图片描述

备用机:
我们将keepalived配置和nginx脚本拷贝到备用机器上

scp /etc/keepalived/keepalived.conf 192.168.1.111:/etc/keepalived/
scp /usr/local/sbin/check_ng.sh 192.168.1.111:/usr/local/sbin/

    1
    2

然后呢更改下keepalived的设置就可以启动了:

需要更改的地方:

vim /etc/keepalived/keepalived.conf
    state BACKUP #备需要设置为BACKUP
    interface eth0  #网卡名称
    virtual_router_id 51 #路由唯一id
    priority 90 #备需要设置为90

    1
    2
    3
    4
    5

启动:

systemctl start keepalived

    1

检测keepalived:
我们在主节点关闭keepalived,看看vip会不会漂移到备用节点192.168.1.111上去。
我们在k8s主节点上面运行kubectl get node 将不会有任何感知,现在我们的机器宕机一台master也稳稳的了
————————————————
版权声明:本文为CSDN博主「超级大饭粒」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_25611295/article/details/84068193

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值