飞道的博客

【云原生Kubernetes系列第四篇】二进制部署多master集群Kubernetes(k8s)v1.20( 一生不缺浪漫,唯独装不下遗憾)

470人阅读  评论(0)


系列文章目录

😜即日起,更新云原生相关知识,喜欢的小伙伴可以给我点个三连喔

😜收录至专栏 云原生

😜【云原生Docker系列第一篇】Docker镜像管理

😜【云原生Docker系列第二篇】Docker容器管理

😜【云原生Docker系列第三篇】Docker网络模式

😜【云原生Docker系列第四篇】Docker Cgroups资源控制操作

😜【云原生Docker系列第五篇】Docker数据管理

😜【云原生Docker系列第六篇】基于docker创建镜像

😜【云原生Docker系列第七篇】浅谈镜像的分层原理

😜【云原生Docker系列第九篇】Docker-Compose 容器集群的快速编排

😜【云原生Docker系列项目实战第一篇】dockerfile+lnmp+workpress

😜【云原生Kubernetes系列第一篇】深入理解容器集群管理系统Kubernetes(k8s)

😜【云原生Kubernetes系列第二篇】Kubernetes(k8s)核心组件

😜【云原生Kubernetes系列第三篇】二进制部署单节点Kubernetes(k8s)v1.20

前言

搭建多master集群Kubernetes之前先要完成单节点部署,单节点部署参照上一篇博客【云原生Kubernetes系列第三篇】二进制部署单节点Kubernetes(k8s)v1.20

一、多master集群概述

1.1 node如何找到master

node节点的kubelet.kubeconfig和kube-proxy.kubeconfig文件写明了apiserver的端口号和master节点的IP地址,从而找到master节点,当我们在部署集群的时候,就要有两个master,但是一个集群中只能有一个主,该如何指定呢?我们可以使用VIP地址。

1.2 如何配置master集群

我们可以把master集群当做nginx服务器群,node节点是客户端,客户端想要找到服务器需要通过负载均衡器实现转发,我们可以安装一个调度器,调度器使用LVS、nginx、haproxy都可以,为了简单我们安装nginx做负载均衡器,再考虑负载均衡器的高可用,搭建两台nginx服务器实现调度器的高可用。

1.3 集群架构

多master一般装两到三台,三台比两台更有保障,同时会有一个选举机制,需要使用奇数台,两台master可仅仅满足高可用和负载

#scheduler.sh文件中定义了多节点的选举机制
--leader-elect=true:当该组件启动多个时,自动启动 leader 选举

k8s中Controller-Manager和Scheduler的选主逻辑:k8s中的etcd是整个集群所有状态信息的存储,涉及数据的读写和多个etcd之间数据的同步,对数据的一致性要求严格,所以>使用较复杂的 raft 算法来选择用于提交数据的主节点。而 apiserver 作为集群入口,本身是无状态的web服务器,多个 apiserver 服务之间直接负载请求并不需要做选主。Controller-Manager 和 Scheduler 作为任务类型的组件,比如 controller-manager 内置的 k8s 各种资源对象的控制器实时的 watch apiserver 获取对象最新的变化事件做期望状>态和实际状态调整,调度器watch未绑定节点的pod做节点选择,显然多个这些任务同时工作是完全没有必要的,所以 controller-manager 和 scheduler 也是需要选主的,但是选主逻辑和 etcd 不一样的,这里只需要保证从多个 controller-manager 和 scheduler 之间选出一个 leader 进入工作状态即可,而无需考虑它们之间的数据一致和同步。

二、多master集群部署过程

2.1 实验环境

主机 IP地址 组件
k8s集群master01 192.168.109.131 kube-apiserver kube-controller-manager kube-scheduler
k8s集群master02 192.168.109.134
k8s集群node01 192.168.109.132 kubelet kube-proxy docker
k8s集群node02 192.168.109.133 kubelet kube-proxy docker
etcd集群节点1 192.168.109.131 etcd
etcd集群节点2 192.168.109.132 etcd
etcd集群节点3 192.168.109.133 etcd
负载均衡nginx+keepalive01(master) 192.168.109.135
负载均衡nginx+keepalive02(backup) 192.168.109.137
VIP 192.168.109.200

考虑到电脑性能,我将etcd部署在master和node节点上,master集群实现高可用,并且我这边只搭建两个node节点

2.2 操作系统初始化配置

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
#-X清除自定义的规则

#关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config

#关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab 

#根据规划设置主机名
hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02

#在master添加hosts
cat >> /etc/hosts << EOF
192.168.109.131 master01
192.168.109.134 master02
192.168.109.132 node01
192.168.109.133 node02
EOF

#调整内核参数
cat > /etc/sysctl.d/k8s.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF

sysctl --system

#时间同步
yum install ntpdate -y
ntpdate time.windows.com

 

2.3 配置master02节点

#我们直接将master01的文件复制到master02,不在重复安装
[root@master01 opt]# scp -r kubernetes/ master02:/opt

#创建软连接到系统,便于识别
[root@master02 bin]# ln -s /opt/kubernetes/bin/* /usr/local/bin/

[root@master02 cfg]# vim kube-apiserver 
--bind-address=192.168.109.134  #修改
--advertise-address=192.168.109.134  #修改

#将master01的etcd证书复制过去
[root@master01 opt]# scp -r etcd/ master02:/opt

#将master01中kubectl的配置文件复制过去
[root@master01 ~]# scp -r .kube/ master02:/root

#此时master02可以查看到node
[root@master02 opt]# kubectl get node
NAME              STATUS   ROLES    AGE     VERSION
192.168.109.132   Ready    <none>   7h11m   v1.20.11
192.168.109.133   Ready    <none>   7h1m    v1.20.11

#将master01节点的服务复制谷片区
[root@master01 ~]# cd /usr/lib/systemd/system
[root@master01 system]# ls kube*
kube-apiserver.service           kube-scheduler.service
kube-controller-manager.service
[root@master01 system]# scp kube* master02:`pwd`

#master02开启服务
ls kube*
systemctl start kube-apiserver.service kube-scheduler.service kube-controller-manager.service
systemctl enable kube-apiserver.service kube-scheduler.service kube-controller-manager.service
systemctl status kube-apiserver.service kube-scheduler.service kube-controller-manager.service

 







2.4 配置负载均衡器

两台相同

hostnamectl set-hostname nginx01
hostnamectl set-hostname nginx02

#将nginx.repo移到/etc/yum.repos.d/
yum -y install nginx

#配置四层反向代理,配置在http外面
#使用轮询算法
vim /etc/nginx/nginx.conf
stream{
   
    upstream k8s-masters{
   
        server 192.168.109.131:6443;
        server 192.168.109.134:6443;
}
    server{
   
        listen 6443;
        proxy_pass k8s-masters;
    }
}

#启动
systemctl enable --now nginx

 


负载均衡器高可用

#安装keepalived
yum install -y keepalived

#在/etc/keepalived目录下创建nginx检测脚本
cd /etc/keepalived/
vim check_nginx.sh
#!/bin/bash
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then    #如果nginx没有启动就启动nginx                        
      systemctl start nginx                #重启nginx
      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重启失败,则停掉keepalived服务,进行VIP转移
              killall keepalived                    
      fi
fi
 
#给脚本执行权限
chmod +x check_nginx.sh 

#修改keepalived配置文件
vim keepalived.conf
! Configuration File for keepalived
 
global_defs {
   
   notification_email {
   
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1     #修改邮箱地址
   smtp_connect_timeout 30
   router_id NGINX_01       #修改主备id
   #删掉这里的四行vrrp  
}
 
#加入周期性检测nginx服务脚本的相关配置
vrrp_script check_nginx{
   
    script "/etc/keepalived/check_nginx.sh" #心跳执行的脚本,检测nginx是否启动
    interval 2                           #(检测脚本执行的间隔,单位是秒)
}
 
vrrp_instance VI_1 {
   
    state MASTER
    interface ens33   #修改网卡名称
    virtual_router_id 51
    priority 100   #优先级,主不改,备改成比100小就行
    advert_int 1
    authentication {
   
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
   
        192.168.109.200   #修改VIP地址
    }
    #添加跟踪(执行脚本)
    track_script{
   
        check_nginx
    }
}
 
 
#重启服务
systemctl restart keepalived.service

#备服务器下载好keepalived后,在主服务器上将脚本和keepalived配置文件传过去
[root@nginx01 keepalived]# scp * 192.168.109.135:`pwd`
 
#传过去后修改三处
router_id NGINX_02 
state BACKUP
priority 90 
 
#然后重启服务
systemctl restart keepalived.service


 


2.5 修改其他节点

#将两个node节点的bootstrap.kubeconfig、kubelet.kubeconfig、kube-proxy.kubeconfig中的server改为VIP地址
cd kubernetes/cfg/
vim bootstrap.kubeconfig
vim kubelet.kubeconfig
vim kube-proxy.kubeconfig

server: https://192.168.109.200:6443

#重启
systemctl restart kubelet kube-proxy

#两个master节点中的kubectl配置文件改为VIP地址
vim ~/.kube/config

server: https://192.168.109.200:6443

2.6 创建pod

2.6.1 kubectl创建pod

[root@master01 ~]# kubectl get pods
No resources found in default namespace.
[root@master01 ~]# kubectl run stevelu01 --image=nginx:1.14
pod/stevelu01 created
[root@master01 ~]# kubectl run stevelu02 --image=nginx:1.14
pod/stevelu02 created
[root@master01 ~]# kubectl run stevelu03 --image=nginx:1.14
pod/stevelu03 created
[root@master01 ~]# kubectl get pods
NAME        READY   STATUS              RESTARTS   AGE
stevelu01   0/1     ContainerCreating   0          18s
stevelu02   1/1     Running             0          10s
stevelu03   1/1     Running             0          6s
[root@master01 ~]# kubectl get pods -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE   READINESS GATES
stevelu01   1/1     Running   0          35s   10.244.1.8    192.168.109.133   <none>           <none>
stevelu02   1/1     Running   0          27s   10.244.0.10   192.168.109.132   <none>           <none>
stevelu03   1/1     Running   0          23s   10.244.0.11   192.168.109.132   <none>           <none>

#创建基于centos镜像的pod
kubectl run centos01 -it --image=centos:7

 

并且可以看到pod运行的节点不一样,由调度算法决定

2.6.2 dashboard创建pod



总结

多master节点部署步骤

  • 先部署master02等其它master节点
  • 搭建Nginx/Haproxy +keepalived高可用负载均衡对接master节点群集
  • 修改node节点上的kubelet kube-proxy的kubeconfig配置文件对接 vip
  • kubectl的配置文件也要对接VIP或者当前节点的IP

转载:https://blog.csdn.net/qq_42327944/article/details/125809476
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场