jjzjj

k8s master节点高可用方案部署

xhredeem 2024-01-04 原文

写在前面

使用的是堆叠方案,即etcd与控制平面被部署在同一节点当中,之所以最少使用三个master节点是因为ETCD的RAFT算法,集群中节点超过半数可用,集群才可用,所以一般使用奇数master节点,比如3、5等

第一步:环境准备

每台机器都做

至少2cpu,4g机器环境

关闭防火墙、关闭selinux、关闭交换分区

(1)关闭selinux,设置为disabled

sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux

sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

(2)关闭交换分区

修改配置文件/etc/fstab文件配置,注释 swap的挂在命令行,永久有效。

使用swapoff -a 命令仅临时有效,重启失效,需要手动修改配置文件。

(3)关闭防火墙

systemctl disable firewalld 禁止防火墙开机自启

systemctl stop firewalld 关闭防火墙服务

Systemctl status firewalld 查看防火墙服务

(4)修改主机名及/etc/hosts文件作为名称解析(所有节点都操作)

192.168.11.128 master01

192.168.11.129 master02

192.168.11.130 master03

192.168.11.138 node

(5)所有节点设置kube-proxy开启ipvs的前置条件

yum -y install ipvsadm ipset

cat > /etc/sysconfig/modules/ipvs.modules <<EOF

modprobe -- ip_vs

modprobe -- ip_vs_rr

modprobe -- ip_vs_wrr

modprobe -- ip_vs_sh

modprobe -- nf_conntrack_ipv4

EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

第二步:配置yum源

配置系统yum源 每台机器都做

将系统默认的yum源文件repo移动到新目录bak下,执行下面的wget命令下载新的配置文件:

wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo

配置k8s源 每台机器都做(此处是华为云的源,可能需要手动添加$basearch)

cat <<EOF > /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=https://repo.huaweicloud.com/kubernetes/yum/repos/kubernetes-el7-$basearch

enabled=1

gpgcheck=1

repo_gpgcheck=0

gpgkey=https://repo.huaweicloud.com/kubernetes/yum/doc/yum-key.gpg https://repo.huaweicloud.com/kubernetes/yum/doc/rpm-package-key.gpg

EOF

配置docker源 每台机器都做

wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo

sudo sed -i 's+download.docker.com+repo.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

执行命令生成yum缓存

yum clean all

yum makecache

第三步:配置系统内核参数每台机器都做

修改文件/etc/sysctl.conf

cat <<EOF>/etc/sysctl.conf

net.ipv4.ip_forward = 1

net.ipv4.conf.all.forwarding = 1

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

执行下面的命令使其生效:

modprobe br_netfilter;sudo sysctl -p /etc/sysctl.conf

第四步:同步时间 每台机器都做

yum install ntpdate -y

ntpdate time.windows.com

或ntpdate ntp1.aliyun.com

第五步:安装docker-ce 并设置开机自启每台机器都做

yum -y install docker-ce;systemctl enable docker.service --now

第六步:创建和编辑/etc/docker/daemon.json文件

  1. 配置国内镜像源或加速,这里例子是使用163加速,不过建议去阿里官方申请自己的镜像加速地址,免费的

  1. 修改docker Cgroup Driver为systemd

创建文件:

cat <<EOF >/etc/docker/daemon.json

{

"exec-opts": ["native.cgroupdriver=systemd"],

"registry-mirrors": ["https://hub-mirror.c.163.com"]

}

EOF

(4)使得/etc/docker/daemon.json文件配置生效。

systemctl daemon-reload;systemctl restart docker

通过命令docker info查看

第七步:安装k8s工具、部署k8s快捷键、并查看版本 每台机器都做

查看可用的kubeadm版本,这里不太建议最新版

yum list --showduplicates kubeadm

我选择的是这个版本

yum -y install kubeadm-1.19.16 kubectl-1.19.16 kubelet-1.19.16

部署k8s快捷键

kubectl completion bash >/etc/bash_completion.d/kubectl;kubeadm completion bash >/etc/bash_completion.d/kubeadm

第八步:安装nginx+keepalived

说明:master01、master02、master03 nginx的配置一样,keepalived的配置也一样,只是keepalived priority的优先级不同,此处将VIP设置为与三台主机网段一致,VIP为192.168.11.200/24

nginx为源码安装,编译时加上stream模块,默认安装位置为/usr/local/nginx、默认配置文件为/usr/local/nginx/conf/nginx.conf

查看三台master主节点的nginx配置,在nginx 配置文件中http 上面配置stream 四层代理这一段

查看三台master节点keepalived的配置,配置文件中只有state及priority有区别,state三台分别为 MASTER BACKUP BACKUP ;priority三台分别为 100 80 70

第九步:K8s中的master01主机初始化

  1. 查看初始化集群需要哪些镜像

kubeadm config images list

  1. 使用脚本拉取镜像,脚本内容如下(根据需要修改版本即可)

vim k8s.images.pull.sh

images=(

kube-apiserver:v1.19.16

kube-controller-manager:v1.19.16

kube-scheduler:v1.19.16

kube-proxy:v1.19.16

pause:3.2

coredns:1.7.0

etcd:3.4.13-0

)

for imageName in ${images[@]} ; do

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName

docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName

done

执行脚本

bash k8s.images.pull.sh

脚本执行后,使用命令查看,发现需要镜像已经全部拉取

初始化init配置(master01 节点执行)

[root@master01 ~]# kubeadm init --kubernetes-version=v1.19.16 --apiserver-advertise-address=192.168.11.128 --control-plane-endpoint=192.168.11.200:16443 --image-repository k8s.gcr.io --pod-network-cidr=10.244.0.0/16 --upload-certs --v=5

解析:

apiserver-advertise-address=192.168.11.128 这里的IP地址是master01的地址。

pod-network-cidr=10.244.0.0/16 这里的IP地址是pod节点之间的地址。

image-repository k8s.gcr.io 这个是镜像地址

--control-plane-endpoint=192.168.11.200:16443 控制面板的地址,这个是必须要的,此地址是keepalived的VIP地址,端口是nginx四层代理监听的端口

如何上述命令执行成功,会在最后显示如下,会有提示加入master节点的命令与加入node节点的命令以及必须的操作。

在master01上根据提示内容执行命令

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

接下来把master02、master03、node节点加入Kubernetes集群,主机加入成为master节点与node节点的指令是有区别的

执行下面命令,这个命令在上图中可以看到

[root@master02 ~]# kubeadm join 192.168.11.200:16443 --token qdbff7.pxt192g9owgz7g4g \

--discovery-token-ca-cert-hash sha256:094f007fe7600557629cae441db90f0fa97d90980badec2a4b673028a3bd9e94 \

--control-plane --certificate-key 97582818beee6cc47f4e1b7df40614bfddfc2152fffda7ceaf874e04cae3541d

[root@master02 ~]# mkdir -p $HOME/.kube

[root@master02 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

[root@master02 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

[root@master03 ~]# kubeadm join 192.168.11.200:16443 --token qdbff7.pxt192g9owgz7g4g \

--discovery-token-ca-cert-hash sha256:094f007fe7600557629cae441db90f0fa97d90980badec2a4b673028a3bd9e94 \

--control-plane --certificate-key 97582818beee6cc47f4e1b7df40614bfddfc2152fffda7ceaf874e04cae3541d

[root@master03 ~]# mkdir -p $HOME/.kube

[root@master03 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

[root@master03 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

[root@node ~]# kubeadm join 192.168.11.200:16443 --token qdbff7.pxt192g9owgz7g4g --discovery-token-ca-cert-hash sha256:094f007fe7600557629cae441db90f0fa97d90980badec2a4b673028a3bd9e94

使用flannel网络方案

获取下面这个文件并上传到本地(如果下载不了,可以复制内容并粘贴)

https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml

kubectl apply -f kube-flannel.yml

此时在任意一台节点上查看所有节点状态都已经是好的(到此基本集群已经部署完毕)

第十步、测试高可用性

因为设置的时候设置master01节点上的keepalived为master ,所以VIP192.168.11.200/24在master01上,现在查看master01的VIP,并把master01关机,master01关机以后需要等一会儿查看才能发现master 01 NotReady

在master01 NotReady的情况下,在剩下两台master02 master03任意一台均可用,实现master节点的高可用性。但是注意,必须半数以上master节点可用,3master节点至少2台master节点高可用

因为懒所以没有将nginx设置为开机自启,其实是需要设置开机自启的

有关k8s master节点高可用方案部署的更多相关文章

  1. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  2. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  3. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  4. ruby-on-rails - Ruby on Rails 可以部署在 Azure 网站上吗? - 2

    我可以在Azure网站上部署RubyonRails吗? 最佳答案 还没有。目前仅支持.NET和PHP。 关于ruby-on-rails-RubyonRails可以部署在Azure网站上吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/12964010/

  5. jenkins部署1--jenkins+gitee持续集成 - 2

    前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon

  6. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  7. Ruby,使用包含 TK GUI 的 ocra 部署一个 exe - 2

    Ocra无法处理需要“tk”的应用程序require'tk'puts'nope'用奥克拉http://github.com/larsch/ocra不起作用(如链接中的一个问题所述)问题:https://github.com/larsch/ocra/issues/29(Ocra是1.9的"new"rubyscript2exe,本质上它用于将rb脚本部署为可执行文件)唯一的问题似乎是缺少tcl的DLL文件我不认为这是一个问题据我所知,问题是缺少tk的DLL文件如果它们是已知的,则可以在执行ocra时将它们包括在内有没有办法知道tk工作所需的DLL依赖项? 最佳答

  8. Ruby 守护进程和 JRuby - 备选方案 - 2

    我有一个应用程序正在从Ruby迁移到JRuby(由于需要通过Java提供更好的Web服务安全支持)。我使用的gem之一是daemons创建后台作业。问题在于它使用fork+exec来创建后台进程,但这对JRuby来说是禁忌。那么-是否有用于创建后台作业的替代gem/wrapper?我目前的想法是只从shell脚本调用rake并让rake任务永远运行......提前致谢,克里斯。更新我们目前正在使用几个与Java线程相关的包装器,即https://github.com/jmettraux/rufus-scheduler和https://github.com/philostler/acts

  9. ruby-on-rails - self 在 Rails 模型中的值(value)是什么?为什么没有明显的实例方法可用? - 2

    我的rails3.1.6应用程序中有一个自定义访问器方法,它为一个属性分配一个值,即使该值不存在。my_attr属性是一个序列化的哈希,除非为空白,否则应与给定值合并指定了值,在这种情况下,它将当前值设置为空值。(添加了检查以确保值是它们应该的值,但为简洁起见被删除,因为它们不是我的问题的一部分。)我的setter定义为:defmy_attr=(new_val)cur_val=read_attribute(:my_attr)#storecurrentvalue#makesureweareworkingwithahash,andresetvalueifablankvalueisgiven

  10. ruby-on-rails - NameError(未初始化常量 Unzipper::Zip)但仅在 Heroku 部署(Rails)上 - 2

    我有一个类unzipper.rb,它使用Rubyzip解压文件。在我的本地环境中,我可以成功解压缩文件,而无需使用require'zip'明确包含依赖项但是在Heroku上,我得到一个NameError(uninitializedconstantUnzipper::Zip)我只能通过使用明确的require来解决问题:为什么这在H​​eroku环境中是必需的,但在本地主机上却不是?我的印象是Rails自动需要所有gem。app/services/unzipper.rbrequire'zip'#OnlyrequiredforHeroku.Workslocallywithout!class

随机推荐