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

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

HDFS—集群扩容及缩容

白名单:表示在白名单的主机IP地址可以,用来存储数据。 配置白名单步骤如下: 1)在NameNode节点的/opt/module/hadoop-3.1.4/etc/hadoop目录下分别创建whitelist 和blacklist文件 (1)创建白名单 [lytfly@hadoop102 hadoop]$ vim whitelist 在whitelist中添加如下主机名称,假如集群正常工作的节

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

什么是Kubernetes PodSecurityPolicy?

@TOC 💖The Begin💖点点关注,收藏不迷路💖 1、什么是PodSecurityPolicy? PodSecurityPolicy(PSP)是Kubernetes中的一个安全特性,用于在Pod创建前进行安全策略检查,限制Pod的资源使用、运行权限等,提升集群安全性。 2、为什么需要它? 默认情况下,Kubernetes允许用户自由创建Pod,可能带来安全风险。

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle