kubernetes二进制集群部署--------多master集群

一、我的虚拟机 IP地址规划:

Master节点

master01:192.168.66.130

master02:192.168.66.131

VIP 地址:

192.168.66.100

Node节点

node01:192.168.66.132

node02:192.168.66.133

负载均衡

Nginx01:192.168.66.134 master

Nginx02:192.168.66.139 backup

Harbor私有仓库

192.168.66.138

在单master节点的K8s集群上搭建 多master节点集群 和 LB负载均衡服务器

二、部署环境—单 master 节点的 k8s集群

部署步骤在之前的博客中已经介绍了。

三、添加 master2 多节点K8s集群

1、复制/opt/kubernetes/目录下的所有文件到master02节点上

[root@localhost kubeconfig]# scp -r /opt/kubernetes/ [email protected]:/opt

2、复制master1中三个组件的启动脚本:kube-apiserver.service、kube-controller-manager.service、kube-scheduler.service

[root@localhost kubeconfig]# scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service [email protected]:/usr/lib/systemd/system/

3.2、master2修改复制的配置文件

只有kube-apiserver文件里有IP地址,所以只需要修改这个文件即可。

[root@master2 ~]# cd /opt/kubernetes/cfg/
[root@master2 cfg]# ls
kube-apiserver  kube-controller-manager  kube-scheduler  token.csv
[root@master2 cfg]# vi kube-apiserver 
#修改两处:

kubernetes二进制集群部署--------多master集群_第1张图片

3.3、制作master2 的ETCD证书

master2节点与node节点之间的操作信息需要保存在ETCD集群中,所以 master 节点都必须有etcd证书,实现通信。

拷贝master1上已有的 etcd 证书给 master2 使用

[root@master1 ~]# scp -r /opt/etcd/ [email protected]:/opt/

3.4、启动 master2 的三个组件

//开启 apiserver 组件
[root@master2 cfg]# systemctl start kube-apiserver.service 
[root@master2 cfg]# systemctl enable kube-apiserver.service 

////开启 controller-manager 组件
[root@master2 cfg]# systemctl start kube-controller-manager.service
[root@master2 cfg]# systemctl enable kube-controller-manager.service 

//开启 scheduler 组件
[root@master2 cfg]# systemctl start kube-scheduler.service
[root@master2 cfg]# systemctl enable kube-scheduler.service 

增加环境变量,优化kubectl命令

[root@master2 cfg]# vim /etc/profile
在末尾添加:
export PATH=$PATH:/opt/kubernetes/bin/

[root@master2 cfg]# source /etc/profile    使之生效

3.5、验证master2是否加入K8s集群

在master2 上查看node节点情况(和 master01一样就好)

[root@localhost cfg]# kubectl get node

kubernetes二进制集群部署--------多master集群_第2张图片

四、搭建nginx负载均衡

准备两台虚拟机 搭建 nginx的高可用群集。

Nginx01:192.168.66.134 master

Nginx02:192.168.66.139 backup

1、首先关闭防火墙

[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0

2、建立本地yum官方nginx源

//编写repo文件
[root@localhost ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0

[root@localhost ~]# yum list
[root@localhost ~]# yum install nginx -y   //下载nginx

3、接下来在配置文件设置 nginx的四层负载均衡

[root@localhost ~]# vim /etc/nginx/nginx.conf
在events模块下添加以下内容:日志格式、日志存放位置、upstream模块
stream {

   log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
    access_log  /var/log/nginx/k8s-access.log  main;

    upstream k8s-apiserver {
        server 192.168.66.130:6443;   // master1节点
        server 192.168.66.131:6443;   // master2节点
    }
    server {
                listen 6443;
                proxy_pass k8s-apiserver;
    }
    }

kubernetes二进制集群部署--------多master集群_第3张图片

//检查配置文件是否有语法错误
[root@localhost ~]# nginx -t   
[root@localhost ~]# systemctl start nginx     //开启服务

//注意:查看端口6443必须在监听中,如下图。
[root@localhost ~]# netstat -natp | grep nginx   

kubernetes二进制集群部署--------多master集群

kubernetes二进制集群部署--------多master集群

五、搭建 keepalived 高可用服务

5.1、搭建 nginx 的高可用

1、yum安装keepalived软件

[root@localhost ~]# yum install keepalived -y

2、修改 nginx1 和 nginx2 的配置文件

nginx1节点作为master。

[root@nginx1 ~]# vi /etc/keepalived/keepalived.conf 
//删除配置文件全部内容,添加以下内容:

! Configuration File for keepalived
global_defs {
   # 接收邮件地址
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   # 邮件发送地址
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id NGINX_MASTER
}
vrrp_script check_nginx {
    script "/etc/nginx/check_nginx.sh"   ##检测nginx脚本的路径,稍后会创建
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100     ##优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.66.100/24      ##虚拟IP地址
    }
    track_script {
        check_nginx
    }
}

nginx2 节点作为backup。

[root@nginx2 ~]# vi /etc/keepalived/keepalived.conf 
//删除配置文件全部内容,添加以下内容:
! Configuration File for keepalived
global_defs {
   # 接收邮件地址
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   # 邮件发送地址
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id NGINX_MASTER
}
vrrp_script check_nginx {
    script "/etc/nginx/check_nginx.sh"   ##检测脚本的路径,稍后会创建
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90     ##优先级低于master
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.66.100/24      ##虚拟IP地址
    }
    track_script {
        check_nginx
    }
}

3、创建检测脚本

[root@localhost ~]# vim /etc/nginx/check_nginx.sh

count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
    systemctl stop keepalived
fi

[root@localhost ~]# chmod +x /etc/nginx/check_nginx.sh   //授权

4、开启keepalived 服务

systemctl start keepalived.service 

5、查看ip地址,可以看到高可用群集中的master节点上有漂移地址,backup节点上没有。

[root@nginx1 ~]# ip a

kubernetes二进制集群部署--------多master集群_第4张图片

5.2、验证高可用功能

1、此时 虚拟ip在 nginx1 上,验证地址漂移,可以在 lb01 中使用 pkill nginx 停止nginx服务,再在 lb02 上使用 ip a 命令查看地址是否进行了漂移。

[root@nginx1 ~]# pkill nginx

kubernetes二进制集群部署--------多master集群_第5张图片

2、恢复操作:此时在 nginx02上,我们先启动 nginx服务,再启动 keepalived服务,再用 ip a命令查看,地址又漂移回来了,而 nginx02上没有虚拟ip。

[root@nginx1 ~]# systemctl start nginx
[root@nginx1 ~]# systemctl start keepalived.service 

kubernetes二进制集群部署--------多master集群_第6张图片

六、node节点指向 LB 高可用群集

1、修改 两个node节点的配置文件,server ip 地址为统一的VIP地址(三个文件)

//修改内容:server: https://192.168.66.100:6443(都改成vip地址)

[root@localhost cfg]# vim /opt/kubernetes/cfg/bootstrap.kubeconfig

[root@localhost cfg]# vim /opt/kubernetes/cfg/kubelet.kubeconfig

[root@localhost cfg]# vim /opt/kubernetes/cfg/kube-proxy.kubeconfig

kubernetes二进制集群部署--------多master集群_第7张图片

重启服务

[root@localhost cfg]# systemctl restart kubelet.service 
[root@localhost cfg]# systemctl restart kube-proxy.service

2、检查修改内容

//确保必须在此路径下 grep 检查
[root@localhost ~]# cd /opt/kubernetes/cfg/
[root@localhost cfg]#  grep 100 *

kubernetes二进制集群部署--------多master集群_第8张图片

3、接下来在 nginx1 上查看 nginx 的 k8s日志:

[root@localhost ~]# tail /var/log/nginx/k8s-access.log

kubernetes二进制集群部署--------多master集群_第9张图片

七、k8s多节点集群测试

在 master1上操作,创建 Pod进行测试

[root@master1 kubeconfig]# kubectl run nginx --image=nginx

查看 Pod 状态

[root@master1 ~]# kubectl get pods

kubernetes二进制集群部署--------多master集群_第10张图片

查看刚刚创建的nginx日志

[root@master1 ~]# kubectl logs nginx-dbddb74b8-x59b4

kubernetes二进制集群部署--------多master集群

#出现 error 是由于权限不足,下面来授权解决一下这个问题。
解决办法(添加匿名用户授予权限):

[root@master1 ~]# kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous 

kubernetes二进制集群部署--------多master集群

查看 Pod 网络

[root@localhost kubeconfig]# kubectl get pods -o wide

kubernetes二进制集群部署--------多master集群

我们可以在对应网络的node节点上操作就可以直接访问。

故在node01上操作:

[root@localhost cfg]# curl 172.17.51.2

kubernetes二进制集群部署--------多master集群_第11张图片

我们在node节点之间部署了 flannel网络组件,实现node节点互通。所以在node1和node2的浏览器上访问这个地址:172.17.51.2

kubernetes二进制集群部署--------多master集群_第12张图片

kubernetes二进制集群部署--------多master集群_第13张图片