Kubernetes高可用集群搭建(kubeadm)

2024-09-08 04:48

本文主要是介绍Kubernetes高可用集群搭建(kubeadm),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 Kubernetes高可用集群介绍

前面已经介绍了Kubernetes的集群部署,但是都只是介绍的单master节点的情况,由于单master节点的可靠性不高,不适合实际的生产环境,此处介绍如何实现多master节点的高可用集群的搭建。

2 安装要求

  • 一台或多台机器,操作系统CentOS7.x-x86_64
  • 硬件配置:2G或更多ARM,2个CPU或更多CPU,硬盘20G及以上
  • 集群中所有机器网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap分区

3 环境准备

3.1 安装虚拟机

准备4台虚拟机,并给每个虚拟机安装centos7.x操作系统。如果有条件还是准备6台虚拟机最好,3台master节点,3台node节点,保证master节点数为>=3的奇数个。
CentOS-7.6.1810-x86_64下载:
https://pan.baidu.com/s/1-DgYThgkNbZ42QC5zKp84w 密码: mj9h

角色IP主机名称
master192.168.75.136k8s-master1
master192.168.75.137k8s-master2
node192.168.75.138k8s-node1
node192.168.75.139k8s-node2
VIP192.168.75.140k8s-vip

3.2 系统初始化

# 1、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld# 2、关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久关闭
setenforce 0 #临时关闭# 3、关闭swap
swapoff -a #临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭# 4、根据规划设置主机名
hostnamectl set-hostname <主机名> #修改主机名
hostname #查看主机名# 5、在master节点中添加hosts (IP后面跟的是hostname)
cat >> /etc/hosts << EOF
192.168.75.136 master1.k8s.io k8s-master1
192.168.75.137 master2.k8s.io k8s-master2
192.168.75.138 node1.k8s.io k8s-node1
192.168.75.139 node2.k8s.io k8s-node2
192.168.75.140 master.k8s.io k8s-vip
EOF# 6、将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge‐nf‐call‐ip6tables=1
net.bridge.bridge‐nf‐call‐iptables=1
EOF
sysctl --system #生效# 7、时间同步
yum install ntpdate -y
ntpdate time.windows.com

4 在每个master节点安装keepalived

4.1 安装相关依赖包

yum install -y conntrack-tools libseccomp libtool-ltdl
yum install -y keepalived

4.2 配置maser节点

4.2.1 k8s-master1节点配置

# 创建目录
mkdir -p /etc/keepalived
# 创建配置文件
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {router_id k8s
}
vrrp_script check_haproxy {script "killall -0 haproxy"interval 3weight -2fall 10rise 2
}
vrrp_instance VI_1 {state MASTER# 网卡的名称interface ens33virtual_router_id 51priority 250advert_int 1authentication {auth_type PASSauth_pass ceb1b3ec013d66163d6ab}
virtual_ipaddress {# 虚拟IP192.168.75.140
}
track_script {check_haproxy
}
}
EOF

4.2.2 k8s-master2节点配置

后续添加的其他master节点也使用此配置。

# 创建目录
mkdir -p /etc/keepalived
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {router_id k8s
}
vrrp_script check_haproxy {script "killall -0 haproxy"interval 3weight -2fall 10rise 2
}
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 200adver_int 1authentication {auth_type PASSauth_pass ceb1b3ec013d66163d6ab}
virtual_ipaddress {# 虚拟IP192.168.75.140
}
track_script {check_haproxy
}
}
EOF

4.3 启动和检查

在每个master节点都执行

# 启动keepalived
systemctl start keepalived.service
# 设置开机启动
systemctl enable keepalived.service
# 查看启动状态
systemctl status keepalived.service
# 启动完成后在master1查看网络信息
ip a s ens33

在这里插入图片描述

5 在每个master节点安装haproxy

5.1 安装

yum install -y haproxy

5.2 配置

每台master节点中的配置均相同,配置中声明了后端代理的每个master节点服务器,指定了haproxy的端口为16443,因此16443端口为集群的入口。

# 创建目录
mkdir -p /etc/haproxy
cat > /etc/haproxy/haproxy.cfg << EOF
#-------------------------------
# Global settings
#-------------------------------
globallog       127.0.0.1 local2chroot    /var/lib/haproxypidfile   /var/run/haproxy.pidmaxconn   4000user      haproxygroup     haproxydaemonstats socket /var/lib/haproxy/stats
#--------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# usr if not designated in their block
#--------------------------------
defaultsmode                httplog                 globaloption              httplogoption              dontlognulloption http-server-closeoption forwardfor   except 127.0.0.0/8option              redispatchretries             3timeout http-request  10stimeout queue         1m timeout connect       10stimeout client        1mtimeout server        1mtimeout http-keep-alive 10stimeout check           10smaxconn                 3000
#--------------------------------
# kubernetes apiserver frontend which proxys to the backends
#--------------------------------
frontend kubernetes-apiservermode              tcpbind              *:16443option            tcplogdefault_backend   kubernetes-apiserver
#---------------------------------
#round robin balancing between the various backends
#---------------------------------
backend kubernetes-apiservermode              tcpbalance           roundrobinserver            master1.k8s.io    192.168.75.136:6443 checkserver            master2.k8s.io    192.168.75.137:6443 check
#---------------------------------
# collection haproxy statistics message
#---------------------------------
listen statsbind              *:1080stats auth        admin:awesomePasswordstats refresh     5sstats realm       HAProxy\ Statisticsstats uri         /admin?stats
EOF

5.3 启动和检查

每台master都要启动

# 启动haproxy
systemctl start haproxy
# 设置开机启动
systemctl enable haproxy
# 查看启动状态
systemctl status haproxy
# 检查端口
netstat -lntup|grep haproxy

6 所有节点安装Docker/kubeadm/kubelet

6.1 安装Docker

Docker安装移步: Docker for CentOS安装

6.2 添加阿里云yum软件源

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

6.3 安装kubeadm、kubelet、kubectl

kubeadm:部署工具
kubelet:systemd守护进程管理
kubectl:k8s命令行管理工具

# 最新版本安装
yum install -y kubelet kubeadm kubectl
# 安装指定版本 
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
#设置开机启动
systemctl enable kubelet

7 部署Kubernetes Master

7.1 创建kubeadm配置文件

在具有vip的master上操作。此处的vip节点为k8s-master1。

# 创建文件夹
mkdir -p /usr/local/kubernetes/manifests
# 进入文件夹
cd /usr/local/kubernetes/manifests
# 创建kubeadm-config.yaml文件
cat > kubeadm-config.yaml << EOF
apiServer:certSANs:- k8s-master1- k8s-master2- master.k8s.io- 192.168.75.136- 192.168.75.137- 192.168.75.140- 127.0.0.1extraArgs:authorization-mode: Node,RBACtimeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta1
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "master.k8s.io:6443"
controllerManager: {}
dns:type: CoreDNS
etcd:local:dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:dnsDomain: cluster.localpodSubnet: 10.244.0.0/16serviceSubnet: 10.1.0.0/16
scheduler: {}
EOF

7.2 使用kubeadm命令初始化k8s

# 执行初始化命令
kubeadm init --config kubeadm-config.yaml
# 重置kubeadm初始化
kubeadm reset
如果在执行的过程中出现以下错误:
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...` To see the stack trace of this error execute with --v=5 or higher

解决办法:
# 执行,然后重新执行初始化命令
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables

看到以下消息则表示安装成功,执行保存成功后的命令,因为在后续的加入master和加入node会使用到。
在这里插入图片描述

7.3 根据初始化的结果操作

注意:此命令直接在安装成功后的消息中复制,此处只是提供一个案例

# 此命令直接在k8s-master1执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看集群状态

kubectl get cs
# 查看pod信息
kubectl get pods -n kube-system
# 查看节点信息
kubectl get nodes

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

7.4 安装集群网络

在k8s-master1节点执行:
方式一:

# 如果此地址无法访问,可以更改网络的DNS为8.8.8.8试试,如果还是不行就只能使用方式二
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

方式二:
kube-flannel.yml下载:
链接: https://pan.baidu.com/s/1ANoUdrexA6N_VVc5HOc3QA 密码: h11w

# 安装flannel
kubectl apply -f kube-flannel.yml

看到以下消息则表示安装成功:
在这里插入图片描述
再次查看节点信息:

kubectl get nodes

在这里插入图片描述

7.5 添加k8s-master2节点

1、在k8s-master2节点创建文件夹

mkdir -p /etc/kubernetes/pki/etcd

2、从k8s-master1复制秘钥和相关文件到k8s-master2

# 远程复制,在k8s-master1节点执行
scp /etc/kubernetes/admin.conf root@192.168.75.137:/etc/kubernetes
scp /etc/kubernetes/pki/{ca.*,sa.*,front-proxy-ca.*} root@192.168.75.137:/etc/kubernetes/pki
scp /etc/kubernetes/pki/etcd/ca.* root@192.168.75.137:/etc/kubernetes/pki/etcd

3、将k8s-master2节点加入集群
注意:此命令直接在初始化结束后的消息中复制即可,此处为范例:

kubeadm join master.k8s.io:6443 --token 1q5204.4g95k2jkhulmy1pg \--discovery-token-ca-cert-hash sha256:3b59671996f0a5092d90bfc5626cc1decce339898d69bc9bfd64cc6a2421c2a5 \--control-plane 
如果在执行的过程中出现以下错误:
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...` To see the stack trace of this error execute with --v=5 or higher

解决办法:
# 执行
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables

默认token有效期为24小时,当过期之后,该token就不可用了,这时就需要重新创建token,操作如下:
该命令只能在k8s-master1节点执行!!!

kubeadm token create --print-join-command

看到以下消息,则表示安装成功:
在这里插入图片描述
4、在k8s-master1节点查看集群信息

# 节点信息
kubectl get nodes
# pod信息
kubectl get pods --all-namespaces

在这里插入图片描述
注意:需要等待一段时间,等flannel加载完成,k8s-master2的节点状态才会变成Ready。
5、根据结果消息操作
注意:此命令直接在安装成功后的消息中复制,此处只是提供一个案例

# 此命令直接在k8s-master2执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

至此,k8s-master2节点部署及加入集群完成。

8 加入Kubernetes Node

1、直接在node节点服务器上执行k8s-master1初始化成功后的消息即可:

# 此处命令为范例,请根据实际消息的返回命令执行
kubeadm join master.k8s.io:6443 --token 1q5204.4g95k2jkhulmy1pg \--discovery-token-ca-cert-hash sha256:3b59671996f0a5092d90bfc5626cc1decce339898d69bc9bfd64cc6a2421c2a5

看到以下消息则表示安装成功!
在这里插入图片描述
2、由于添加了新的node节点,所以需要重新安装CNI网络
k8s-master1节点执行,由于之前安装了网络,需要需要先删除再安装。
方式一:

# 删除网络
kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 如果此地址无法访问,可以更改网络的DNS为8.8.8.8试试,如果还是不行就只能使用方式二
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

方式二:
kube-flannel.yml下载:
链接: https://pan.baidu.com/s/1ANoUdrexA6N_VVc5HOc3QA 密码: h11w

# 删除网络
kubectl delete -f kube-flannel.yml
# 安装flannel
kubectl apply -f kube-flannel.yml

9 测试Kubernetes集群

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

# 创建镜像容器
kubectl create deployment nginx --image=nginx
# 对外暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看当前对外的端口
kubectl get pod,svc

在这里插入图片描述
通过浏览器访问nginx:http://k8s-vip:32375
顺便关闭一个master节点,刷新页面,发现还是能访问nginx,说明高可用集群部署成功。

10 注意事项

1、只要有一个master节点正常运行就可以正常对外提供服务。
2、如果需要在master节点使用kubectl相关的命令,必须保证至少有2个master节点正常运行才可以使用,不然会有 Unable to connect to the server: net/http: TLS handshake timeout 这样的错误。
3、节点故障,pod自动转移:当pod所在的节点宕机后,根据 controller-manager的–pod-eviction-timeout 配置,默认是5分钟,5分钟后k8s会把pod状态设置为unkown, 然后在其它节点启动pod。当故障节点恢复后,k8s会删除故障节点上面的unkonw pod。如果你想立即强制迁移,可以用 kubectl drain nodename
4、为了保证集群的高可用性,建议master节点和node节点至少分别部署3台及以上,且master节点应该部署基数个实例(3、5、7、9)。

这篇关于Kubernetes高可用集群搭建(kubeadm)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147161

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满