基于kubeadm搭建高可用(多master)kubernetes v1.19集群-高可用篇

1、架构规划

在master节点和node节点之间,需要增加负载均衡器,使node节点的访问流量可以负载均衡到master节点。

  • keeplive:类似F5作用,配置虚拟IP,用于检查当前节点状态;
  • haproxy:类似节点niginx,负载均衡(虚拟IP会集中到其中一个master节点),可以平均分配流量到master1,master2;
    haproxy与nginx的区别:nginx是master-workers多进程,每个线程单线程,多核CPU能充分利用;haproxy是多线程,单线程实现超高性能,虽然haproxy也能多进程,但网上多看多看进程也不能提升性能,不建议多进程跑。

在这里插入图片描述

2、环境准备

2.1、节点规划

角色主机名IP组件
mastermaster1192.168.0.4keepalived,haproxy,kube-apiserver,kube-controller-manager,kube-scheduler,etcd
mastermaster2192.168.0.5keepalived,haproxy,etcd
nodenode1192.168.0.6kubelet,kube-proxy,docker,flannel、etcd
VIPk8s-vip192.168.0.7虚拟IP

2.2、后置环境准备

  • 设置主机名称和主机配置
hostnamectl set-hostname master1 
hostnamectl set-hostname master2 
hostnamectl set-hostname node1
hostnamectl set-hostname k8s-vip
#辅助命令:hostname   查看主机名称
  • 全部虚拟机修改vi /etc/ hosts
cat > /etc/hosts << EOF 
192.168.0.4 master01.k8s.io master1 
192.168.0.5 master02.k8s.io master2 
192.168.0.6 node01.k8s.io node1 
192.168.0.7 master.k8s.io vip 
EOF

其他配置:参考我的《基于二进制方式搭建K8s集群-前置环境准备》。

3、master节点部署keepalived

3.1、安装包准备

  • 离线下载到本地安装
 #下载到本地目录的/opt/keepalived
 yum install --downloadonly --downloaddir=/opt/keepalived conntrack-tools
 yum install --downloadonly --downloaddir=/opt/keepalived libseccomp 
 yum install --downloadonly --downloaddir=/opt/keepalived libtool-ltdl 
 yum install --downloadonly --downloaddir=/opt/keepalived keepalived 
 #离线安装
 yum install *
  • 在线安装
 yum install -y conntrack-tools,libseccomp,libtool-ltdl,keepalived

3.2、配置master节点

参考资料: kubeadm 创建高可用集群kubeadm高可用配置文件编写

3.2.1、master1节点配置

  • 配置master1 keepalived
    高可用haproxy配置,网卡名称(interface)配置
    在这里插入图片描述
 #interface 网卡名:需要配置为实际的网卡名称
 #virtual_ipaddress: 改为VIP的IP地址
 cat > /etc/keepalived/keepalived.conf  << EOF 
 ! Configuration File for keepalived

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id k8s
}
vrrp_script check_haproxy{
   script "killall -0 haproxy"
   interval 3 #每隔3秒执行一次上面的检测
   weight -2  #权重减2
   rise 2
   fall 10
}
vrrp_instance VI_1 {
    state MASTER         #名称唯一
    interface eth0      #通过ifconfig获取实际:网卡名称
    virtual_router_id 51 #VRRP 路由ID实例,每个实例是唯一的
    priority 100         #优先级,备服务器设置 90
    advert_int 1         #指定VRRP 心跳包通告间隔时间,默认1秒
    authentication {
        auth_type PASS
        auth_pass ceb1b3ec013d66163d6ab
    }
    # 虚拟IP(虚拟服务器节点IP)
    virtual_ipaddress {
        192.168.0.7
    }
    track_script {
        chk_haproxy
    }
}
EOF

3.2.2、master2节点配置

  • 查看网卡名称命令(ifconfig),注意每台机器网卡名称可能不一样;
    在这里插入图片描述
  • 配置master2 keepalived
    高可用haproxy配置,网卡名称(interface)配置,和master1不一样地方:`state: BACKUP,interface:eth0 ;
#interface 网卡名:需要配置为实际的网卡名称
#virtual_ipaddress: 改为VIP的IP地址
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id k8s
}
vrrp_script check_haproxy{
   script "killall -0 haproxy"
   interval 3 #每隔3秒执行一次上面的检测
   weight -2  #权重减2
   rise 2
   fall 10
}
vrrp_instance VI_1 {
    state BACKUP        #名称唯一
    interface eth0      #通过ifconfig获取实际:网卡名称
    virtual_router_id 51 #VRRP 路由ID实例,每个实例是唯一的
    priority 100         #优先级,备服务器设置 90
    advert_int 1         #指定VRRP 心跳包通告间隔时间,默认1秒
    authentication {
        auth_type PASS
        auth_pass ceb1b3ec013d66163d6ab
    }
    # 虚拟IP(虚拟服务器节点IP)
    virtual_ipaddress {
        192.168.0.7
    }
    track_script {
        chk_haproxy
    }
}

EOF

3.2.3、启动和检查

在两台master节点都执行;

 #启动keepalived并设置开机启动
 systemctl daemon-reload && systemctl start keepalived.service && systemctl enable keepalived.service
 #查看状态
 systemctl status keepalived.service

启动后查看master1的网卡信息,会发现增加虚拟IP地址 ;当master1节点挂掉,虚拟IP会飘到master2节点,从而实现高可用;

  #查看网卡,命令格式:ip as master1网卡名称
  ip a s eth0 
  #如下所示,将虚拟ip使用master1的IP,生产环境中需将虚拟IP转换为F5或nginx;

在这里插入图片描述

4、 haproxy

(1)社区版:https://www.haproxy.org/
(2)企业版:https://www.haproxy.com/

4.1、安装包准备

-离线下载到本地安装

#进入cd /opt/haproxy目录
yum install --downloadonly --downloaddir=/opt/haproxy haproxy
#安装
yum install *

-在线安装

yum install -y haproxy

4.2,配置

两台master节点的配置均相同,配置中声明了后端代理的两个master节点服务器,指定了haproxy运行的端口为16443,因此16443端口为集群的入口
在这里插入图片描述

#配置修改:backend kubernetes-apiserver出master1和master2的IP地址
cat > /etc/haproxy/haproxy.cfg << EOF 
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
 log 127.0.0.1 local2         ###[err warning info debug] 
 chroot /var/lib/haproxy
 pidfile /var/run/haproxy.pid ###haproxy的pid存放路径,启动进程的用户必须有权限访问此文件 
 maxconn 4000                 ###最大连接数,默认4000
 user haproxy
 group haproxy
 daemon                       ###创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon"
 #turn on stats unix socket
 stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will 
# use if not designated in their block
#---------------------------------------------------------------------
defaults
 mode http    ###默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
 log global   ###采用全局定义的日志
 option dontlognull        ###不记录健康检查的日志信息
 option http-server-close  ###每次请求完毕后主动关闭httpclose通道 
 option httplog            ###日志类别http日志格式 
 option forwardfor except 127.0.0.0/8   ###如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip 
 option redispatch        ###serverId对应的服务器挂掉后,强制定向到其他健康的服务器
 timeout http-request 10s ###http请求超时
 timeout queue 1m
 timeout connect 10s      #default 10 second timeout if a backend is not found
 timeout client 30s       ###客户端连接超时
 timeout server 30s       ###服务器连接超时
 timeout http-keep-alive 10s ###http alive时间
 timeout check 10s           ###检查超时
 maxconn  60000              ###最大连接数
 retries  3                  ###重试3次连接失败就认为服务不可用,也可以通过后面设置 
#---------------------------------------------------------------------
# kubernetes apiserver frontend which proxys to the backends
#---------------------------------------------------------------------
frontend kubernetes-apiserver
 mode tcp
 bind *:16443
 option tcplog
 default_backend kubernetes-apiserver ###响应默认backend
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------   
backend kubernetes-apiserver
 mode tcp
 balance roundrobin
 server   master1 192.168.0.4:6443 check maxconn 2000
 server   master2 192.168.0.5:6443 check maxconn 2000
#---------------------------------------------------------------------
# collection haproxy statistics message
#---------------------------------------------------------------------
listen stats
  bind *:1080         #监听端口 
  stats refresh 15s   #统计页面自动刷新时间 
  stats uri /admin?stats          #统计页面url 
  stats realm Haproxy\ Statistics #统计页面密码框上提示文本 
  stats auth admin:admin          #统计页面用户名和密码设置 
  #stats hide-version             #隐藏统计页面上HAProxy的版本信息  

EOF

4.3、启动和检查

在两台master节点都执行;

#启动haproxy并设置启动
systemctl daemon-reload && systemctl start haproxy && systemctl enable haproxy
#查看状态
systemctl status haproxy 

检查启动端口,会看到正在监听16443端口

netstat -lntup | grep haproxy 

在这里插入图片描述

5、所有节点安装docker/kubeadm/kubelet

5.1、安装docker

(1)在线部署docker,离线部署参考

 #配置
 wget http://mirrors.aliyun.com/docker-ce /linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
 #安装
 yum -y install docker-ce-18.09.9-3.el7 
 #启动设置开机启动
 systemctl enable docker && systemctl start docker && systemctl enable docker.service
 #查看安装版本
 docker --version

(2)配置镜像加速器

#添加阿里镜像仓库配置管理器
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  
#配置镜像加速器,官方:https://docker-cn.com 
#配置驱动器:“cgroupfs”默认作为Docker cgroup驱动程序, 官方推荐的驱动程序是“systemd”.
cat > /etc/docker/daemon.json << EOF 
{
 "exec-opts":["native.cgroupdriver=systemd"],
 "registry-mirrors": [
      "http://mirrors.aliyuncs.com",
      "https://registry.docker-cn.com",
      "https://docker.mirrors.ustc.edu.cn",
      "http://hub-mirror.c.163.com"]
}
EOF
#重启docker
systemctl daemon-reload && systemctl restart docker 

(3)可能错误处理

  • 添加阿里镜像仓库配置管理器
 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
  • 添加阿里源有时会报错,如果报错,执行如下命令使用官方源
 #异常源删除
 sudo rm -f /etc/yum.repos.d/docker-ce.repo 
 #使用官方源
 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

5.2、添加阿里云镜像

在线安装时,添加阿里云镜像,下载kubeadm、kubelet

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

EOF

5.3、安装kubeadm、kubelet和kubectl

由于版本号,最好指定版本安装,这里指定1.19.8版本。
-离线下载到本地安装`

 #下载到本地目录的/opt/kube
 yum install --downloadonly --downloaddir=/opt/kube kubelet-1.19.8
 yum install --downloadonly --downloaddir=/opt/kube kubeadm-1.19.8
 yum install --downloadonly --downloaddir=/opt/kube kubectl-1.19.8 
 #本地安装
 yum install *
 #查看版本:Kubernetes v1.19.8
 kubelet --version
 #设置kubelet开机启动
 systemctl enable kubelet

在这里插入图片描述
-在线安装

 yum install -y kubelet-1.19.8 kubeadm-1.19.8 kubectl-1.19.8 
 #查看版本:Kubernetes v1.19.8
 kubelet --version
 #设置kubelet开机启动
 systemctl enable kubelet

6、部署kubernetes master

6.1、创建kubeadm配置文件

具有vip地址的master上操作,这里为master1;

  • 创建目录
mkdir /usr/local/kubernetes/manifests -p
#进入目录
cd /usr/local/kubernetes/manifests
  • 创建kubeadm文件
cat > kubeadm-config.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.19.8
#VIP地址和端口号
controlPlaneEndpoint: master.k8s.io:16443
apiserver:
  certSANs:
    #master hostname
    - master1
    - master2
    #VIP主机名(hostname)
    - master.k8s.io
    #VIP地址
    - 192.168.0.7
    #master1
    - 192.168.0.4
    #master2
    - 92.168.0.5
    - 127.0.0.1
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.1.0.0/16
scheduler: {}

EOF
kubeadm init --config kubeadm-config.yaml
#执行后如下图所示

在这里插入图片描述
查看初始化需要的镜像,可以单独拉取下载后,再执行上面命令安装:

[root@master1 manifests]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.19.8
k8s.gcr.io/kube-controller-manager:v1.19.8
k8s.gcr.io/kube-scheduler:v1.19.8
k8s.gcr.io/kube-proxy:v1.19.8
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0

在这里插入图片描述

  • 按照安装提示配置环境变量
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

按照提示保存以下内容,后面会使用到

 kubeadm join master.k8s.io:16443 --token kyre7y.aacix6sgcy22i17b \
    --discovery-token-ca-cert-hash sha256:c1e0671fe33994f70b2716a2effc2af72f7cf22358862dcd3cbb9ac9a2927376
  • 使用kubectl工具查看集群和node状态
#查看node
kubectl get nodes
kubectl get pods -n kube-system
#查看集群状态
kubectl get cs
#会发现集群pods状态为Pending(等待),因尚未安装flannel网络
kubectl get pods -n kube-system

在这里插入图片描述

7、所有master节点安装集群网络

  • 从官方地址获取的flannel的yaml,在master1上执行;
 mkdir /opt/flannel
 cd /opt/flannel
 #国内被挡,可能需要访问外网
 wget -c https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 安装flannel网络
 kubectl apply -f kube-flannel.yml
  • 再次检查集群pods运行状态
    会发现在安装网络后,集群master1变为Ready,集群pods从Pending变为Running状态。
 kubectl get pods -n kube-system

在这里插入图片描述

8、master2节点加入集群

8.1、复制秘钥及相关文件

从master1复制秘钥及其相关文件到master2。

#在master2节点创建文件夹
mkdir -p /etc/kubernetes/pki/etcd
#从master1拷贝秘钥文件到master2
scp /etc/kubernetes/admin.conf root@192.168.0.5:/etc/kubernetes
scp /etc/kubernetes/pki/{ca.*,sa.*,front-proxy-ca.*} root@192.168.0.5:/etc/kubernetes/pki
scp /etc/kubernetes/pki/etcd/ca.* root@192.168.0.5:/etc/kubernetes/pki/etcd

在这里插入图片描述

8.2、master2加入集群

  • 加入集群master节点
    执行在master1上init后输出的jioin命令,并带上参数–control-plane表示把master控制节点加入集群;
kubeadm join master.k8s.io:16443 --token kyre7y.aacix6sgcy22i17b \
    --discovery-token-ca-cert-hash sha256:c1e0671fe33994f70b2716a2effc2af72f7cf22358862dcd3cbb9ac9a2927376 --control-plane    
  • 按照安装提示配置环境变量
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

在这里插入图片描述

  • 节点安装集群网络
    参考第7小节,在master2节点安装flannel;
    在这里插入图片描述
  • 检查状态
kubectl get node
kubectl get pods --all-namespaces

9、加入kubernetes node

  • 加入集群node节点
    在node1上执行向集群添加新节点,执行master1在kubeadm init输出的kubeadm join命令:
kubeadm join master.k8s.io:16443 --token kyre7y.aacix6sgcy22i17b \
    --discovery-token-ca-cert-hash sha256:c1e0671fe33994f70b2716a2effc2af72f7cf22358862dcd3cbb9ac9a2927376
  • 集群网络重新安装,因为添加了新的node节点
 kubectl delete -f kube-flannel.yml
 kubectl apply -f kube-flannel.yml
  • 检查状态
kubectl get node
kubectl get pods --all-namespaces

在这里插入图片描述

10、测试kubernetes集群

在kbernetes集群中创建一个pod,验证是否正常运行;

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc

在这里插入图片描述
在这里插入图片描述

11、kubernetes卸载

  • K8S卸载
#重置
kubeadm reset
#删除文件
rm -rf $HOME/.kube
  • Helm卸载
kubectl get -n kube-system secrets,sa,clusterrolebinding -o name|grep tiller|xargs kubectl -n kube-system deletekubectl get all -n kube-system -l app=helm -o name|xargs kubectl delete -n kube-system12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Moutai码哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值