搭建k8s高可用集群—20230225

news2024/9/28 13:04:58

文章目录

    • 多master(高可用)介绍
    • 高可用集群使用技术介绍
    • 搭建高可用k8s集群步骤
      • 1. 准备环境-系统初始化
      • 2. 在所有master节点上部署keepalived
        • 3.1 安装相关包
        • 3.2 配置master节点
        • 3.3 部署haproxy
          • 错误解决
      • 3. 所有节点安装Docker/kubeadm/kubelet
      • 4. 部署Kubernetes Master
        • 4.1 创建kubreadm配置文件
        • *初始化节点*
        • 4.2 在master1节点执行
      • 5. 安装集群网络
      • 6. master2、master3节点加入集群
        • 6.1 复制密钥及相关文件
        • 6.2 master2和master3加入到集群
      • 7. 加入Kubernetes Node
        • 报错解决
      • 8. 测试kubernetes集群

多master(高可用)介绍

在这里插入图片描述
假设现在有3个node节点和2个master节点,node1到底是连到master1还是连到master2,需要有人来分配,这个中间人就是load balancer,load balancer起到两个作用,一是负载。二是检查master状态,如果master1异常,就会使node连到master2上,如果master1正常,则正常提供服务。由于节点之间互相访问是通过IP连接,这里也是一样的,只不过是通过VIP(虚拟ip)连接。

高可用集群使用技术介绍

keepalived:检查master状态,是否正常运行;配置虚拟IP。
haproxy:负载均衡服务器,起到负载作用。
master具体组件:apiserver, controller-manager, scheduler。
在这里插入图片描述

搭建高可用k8s集群步骤

前提条件:
①固定四台主机IP,参考文章固定虚拟机IP
②可连外网

主机IP
master1192.168.2.200
master2192.168.2.201
master3192.168.2.204
node1192.168.2.202
虚拟IP192.168.2.203

我们以3台master,1台node为例,首先准备好4台服务器,分别在四台服务器上做操作。

1. 准备环境-系统初始化

# 关闭防火墙
systemctl stop fierwalld  #临时关闭
systemctl disable fierwalld  #永久关闭

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

# 关闭swap分区
swapoff -a  #临时
sed -ri 's/.*swap.*/#&/' /etc/fstab  #永久

# 根据规划设置主机名
hostnamectl set-hostname <hostname>

# 在master中添加hosts,每一个master都要执行
cat >> /etc/hosts << EOF
192.168.2.203 k8s-vip
192.168.2.200 master1
192.168.2.201 master2
192.168.2.202 node1
EOF

# 将桥接的 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   # 生效

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

2. 在所有master节点上部署keepalived

3.1 安装相关包

# 安装相关工具
yum install -y conntrack-tools libseccomp libtool-ltdl
# 安装keepalived
yum install -y keepalived

3.2 配置master节点

  1. master1节点配置:
cat > /etc/keepalived/keepalived.conf <<EOF 
! Configuration File for keepalived

global_defs {
   router_id k8s
}

vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 3
    weight -2
    fall 10
    rise 2
}

vrrp_instance VI_1 {
    state MASTER 
    interface ens33     # ens33 为网卡名称
    virtual_router_id 51
    priority 250
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass ceb1b3ec013d66163d6ab
    }
    virtual_ipaddress {
        192.168.2.203    # 虚拟ip
    }
    track_script {
        check_haproxy
    }

}
EOF
  1. master2、master3节点配置
cat > /etc/keepalived/keepalived.conf <<EOF 
! Configuration File for keepalived

global_defs {
   router_id k8s
}

vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 3
    weight -2
    fall 10
    rise 2
}

vrrp_instance VI_1 {
    state BACKUP 
    interface ens33    # ens33 为网卡名称
    virtual_router_id 51
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass ceb1b3ec013d66163d6ab
    }
    virtual_ipaddress {
        192.168.2.203    # 虚拟ip
    }
    track_script {
        check_haproxy
    }

}
EOF
  1. 启动和检查
    三台master节点都执行
# 启动keepalived
systemctl start keepalived.service
# 设置开机启动
systemctl enable keepalived.service
# 查看启动状态
systemctl status keepalived.service

启动后查看master的网卡信息。由于虚拟IP配到了master1上,执行后,master1节点上会多出一个IP,即为虚拟IP;master2和master3上没有,挂上master1后才会出现。

ip a s ens33

在这里插入图片描述

3.3 部署haproxy

  1. 在3个master节点安装 haproxy
# 安装haproxy
yum install -y haproxy
  1. 配置
    3台master节点的配置均相同,配置中声明了后端代理的3个master节点服务器,指定了haproxy运行的端口为16443等,因此16443端口为集群的入口
cat > /etc/haproxy/haproxy.cfg << EOF
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2
    
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    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
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
#---------------------------------------------------------------------
# kubernetes apiserver frontend which proxys to the backends
#--------------------------------------------------------------------- 
frontend kubernetes-apiserver
    mode                 tcp
    bind                 *:16443      #默认监听端口16443
    option               tcplog
    default_backend      kubernetes-apiserver    
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend kubernetes-apiserver
    mode        tcp
    balance     roundrobin
    server      master01.k8s.io   192.168.2.200:16443 check    # 修改IP
    server      master02.k8s.io   192.168.2.201:16443 check    # 修改IP
    server      master03.k8s.io   192.168.2.204:16443 check    # 修改IP
#---------------------------------------------------------------------
# collection haproxy statistics message
#---------------------------------------------------------------------
listen stats
    bind                 *:1080
    stats auth           admin:awesomePassword
    stats refresh        5s
    stats realm          HAProxy\ Statistics
    stats uri            /admin?stats
EOF
  1. 启动和检查
    两台master都启动
# 启动 haproxy
systemctl start haproxy
# 设置开启自启
systemctl enable haproxy
# 查看启动状态
systemctl status haproxy

启动后,检查端口,查看对应的端口是否包含 16443

netstat -tunlp | grep haproxy

在这里插入图片描述

错误解决

报错:
在这里插入图片描述
针对这个问题出现的原因,就是Linux缺少对应的包,使用命令安装即可: yum install -y net-tools。再次执行netstat命令即可。

3. 所有节点安装Docker/kubeadm/kubelet

所有节点安装Docker/kubeadm/kubelet ,Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。

  • 安装之前确保没有其他dockers版本,如果有,需要删除干净后再安装,卸载方式可以参考这篇文章卸载docker。
  1. 安装Docker,所有master+node都要安装
# 下载镜像
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 
# 安装docker
yum -y install docker-ce-18.06.1.ce-3.el7 
# 开机自启动并且启动docker
systemctl enable docker && systemctl start docker 
# 查看docker状态
systemctl status docker
# 查看docker版本
docker --version
# 设置仓库地址
cat > /etc/docker/daemon.json << EOF 
{
 "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] 
}
EOF
# 重启docker
systemctl restart docker
  1. 添加阿里云yum源,所有节点(master+node)
cat >/etc/yum.repos.d/docker.repo<<EOF
[docker-ce-edge]
name=Docker CE Edge - \$basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/\$basearch/edge
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF
# 重启docker
systemctl restart docker
  1. 添加kubernetes软件源
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
  1. 安装kubeadm,kubectl,kubelet
    由于版本更新频繁,这里指定版本号部署:
# 安装kubelet、kubeadm、kubectl,同时指定版本
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 设置开机启动
systemctl enable kubelet

4. 部署Kubernetes Master

4.1 创建kubreadm配置文件

在具有vip的master上进行初始化操作,这里为master1

# 创建文件夹
mkdir /usr/local/kubernetes/manifests -p
# 到manifests目录
cd /usr/local/kubernetes/manifests/
# 新建yaml文件
vim kubeadm-config.yaml

下面内容修改IP 后复制进去

apiServer:
  certSANs:
    - master1
    - master2
    - master3
    - k8s-vip    #虚拟IP的名字,需和/etc/hosts里一致
    - 192.168.2.203    # 虚拟IP
    - 192.168.2.200    # master1
    - 192.168.2.201    # master2
    - 192.168.2.204    # master3
    - 127.0.0.1
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta1
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "k8s-vip:16443"    #虚拟IP:16443
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.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.1.0.0/16
scheduler: {}

初始化节点

如果上面的yaml文件已经执行过一次,再次执行就会报错,这时,就需要将集群初始化。
步骤:

# 1. 还原由 kubeadm init 或 kubeadm join 所做的更改
kubeadm reset -f
# 2. 删除相关文件
rm -rf /etc/kubernetes/*
rm -rf /var/lib/etcd/*

然后再次执行yaml文件

4.2 在master1节点执行

kubeadm init --config kubeadm-config.yaml

执行完成后,就会在拉取镜像【需要等待…】
按照提示配置环境变量,使用kubectl工具

# 执行下方命令
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 nodes
# 查看pod
kubectl get pods -n kube-system

在这里插入图片描述
在这里插入图片描述
由于没有安装网络插件,所以会有pending状态,无妨,继续往下执行就好了。

按照提示保存以下内容,一会要使用

kubeadm join k8s-vip:16443 --token ivcq40.a1bb605g6df4xhdw \
    --discovery-token-ca-cert-hash sha256:b65dcb57a2934439562ae138f552942600296edc04cdefb7da93031cf23c9a08 \
    --control-plane

–control-plane : 只有在添加master节点的时候才有

# 查看集群健康状态
kubectl get cs
# 查看pod
kubectl get pods -n kube-system

5. 安装集群网络

从官方地址获取到flannel的yaml,在master1上执行

# 创建文件夹
mkdir flannel
cd flannel
# 下载yaml文件
wget -c https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

安装flannel网络

kubectl apply -f kube-flannel.yml 

检查,都已经running,且master已经ready

kubectl get pods -n kube-system

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

6. master2、master3节点加入集群

6.1 复制密钥及相关文件

从master1复制密钥及相关文件到master2

## master1中执行,修改IP,分别改为master2/3的IP执行2遍
# ssh root@192.168.2.201 mkdir -p /etc/kubernetes/pki/etcd   # 修改IP;master2\master3的IP,用master1连接master2\master3;输入密码

# scp /etc/kubernetes/admin.conf root@192.168.2.201:/etc/kubernetes
   
# scp /etc/kubernetes/pki/{ca.*,sa.*,front-proxy-ca.*} root@192.168.2.201:/etc/kubernetes/pki
   
# scp /etc/kubernetes/pki/etcd/ca.* root@192.168.2.201:/etc/kubernetes/pki/etcd

6.2 master2和master3加入到集群

在master2、master3上执行在master1上init后输出的join命令,需要带上参数–control-plane表示把master控制节点加入集群。

# master2上执行
kubeadm join k8s-vip:16443 --token ivcq40.a1bb605g6df4xhdw \
    --discovery-token-ca-cert-hash sha256:b65dcb57a2934439562ae138f552942600296edc04cdefb7da93031cf23c9a08 \
    --control-plane

按照提示执行输出的3行命令
在这里插入图片描述
检查状态

kubectl get nodes

kubectl get pods --all-namespaces

在这里插入图片描述

7. 加入Kubernetes Node

向集群添加新节点,执行在kubeadm init输出的kubeadm join命令,不加参数–control-plane

# 在node1上执行
kubeadm join k8s-vip:16443 --token ivcq40.a1bb605g6df4xhdw \
    --discovery-token-ca-cert-hash sha256:b65dcb57a2934439562ae138f552942600296edc04cdefb7da93031cf23c9a08

报错解决

执行命令后,报错no such host,如下:
在这里插入图片描述
这时候,需要将node1节点里的hosts表里的内容保持与master节点一致,再次执行就可以了。
在这里插入图片描述

在这里插入图片描述


集群网络重新安装,因为添加了新的node节点

# 在master1节点上执行
 kubectl apply -f flannel/kube-flannel.yml

检查状态

kubectl get nodes
kubectl get pods --all-namespaces

8. 测试kubernetes集群

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

# 创建nginx deployment
kubectl create deployment nginx --image=nginx
# 暴露端口
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
# 查看状态
kubectl get pod,svc

然后通过任何一个master或node节点或者虚拟IP,都能够访问nginx页面
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/371292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对redis之键值型数据库的理解

键值数据库&#xff0c;首先就要考虑里面可以存什么样的数据&#xff0c;对数据可以做什么样的操作&#xff0c;也就是数据模型和操作接口。它们看似简单&#xff0c;实际上却是我们理解 Redis 经常被用于缓存、秒杀、分布式锁等场景的重要基础。理解了数据模型&#xff0c;你就…

2022年网络安全竞赛——数字取证调查attack.pcapng

攻击日志分析:需求环境可私信博主获取 任务环境说明: 服务器场景:PYsystem0031服务器场景操作系统:未知服务器场景FTP用户名:anonymous 密码:空从靶机服务器的FTP上下载attack.pcapng数据包文件,通过分析数据包attack.pcapng,找出黑客的IP地址,并将黑客的IP地址作为FL…

SPI协议介绍

SPI协议介绍 文章目录SPI协议介绍一、 SPI硬件知识1.1 硬件连线1.2 SPI控制器内部结构二、 SPI协议2.1 传输示例2.2 SPI模式致谢一、 SPI硬件知识 1.1 硬件连线 引脚含义如下&#xff1a; 引脚含义DO(MOSI)Master Output, Slave Input&#xff0c;SPI主控用来发出数据&#x…

逆向之Windows PE结构

写在前面 对于Windows PE文件结构&#xff0c;个人认为还是非常有必要掌握和了解的&#xff0c;不管是在做逆向分析、免杀、病毒分析&#xff0c;脱壳加壳都是有着非常重要的技能。但是PE文件的学习又是一个非常枯燥过程&#xff0c;希望本文可以帮你有一个了解。 PE文件结构…

buu [NCTF2019]babyRSA 1

题目描述&#xff1a; 题目分析&#xff1a; 首先明确两个公式&#xff1a; e*d 1 mod (p-1)(q-1) ed1 e*d - 1 k(p-1)(q-1)想要解出此题&#xff0c;我们必须知道n,而要知道n,我们要知道p和q的值通过 e*d 的计算&#xff0c;我们知道其长度为2066位&#xff0c;而生成p的…

《分布式技术原理与算法解析》学习笔记Day22

哈希与一致性哈希 在分布式系统中&#xff0c;哈希和一致性哈希是数据索引或者数据分布的常见实现方式。 数据分布设计原则 在分布式数据存储系统中&#xff0c;做存储方案选型时&#xff0c;一般会考虑以下因素&#xff1a; 数据均匀数据稳定节点异构性隔离故障域性能稳定…

Delphi Http Https 最好的解决方法(三) LoadLibrary扩展

开发环境: Delphi XE 10.1 Berlin 前提文章: Delphi Http Https 最好的解决方法(二) 目录 1. 项目描述 2. 问题描述 3. 解决方案 3.1 主程序在导入dll方法单元处理(不推荐) 3.2 在dll的工程文件处加入(不推荐) 3.3 在dll的工程文件获取dll(HelpTool.dll)的当前路径(推荐方…

gitlab 安装到项目上传一篇解决

文章目录1.安装1.1创建挂载目录1.2启动1.3 配置gitlab查看docker admin 账户初始密码注册普通用户2.1进入注册2.2创建后通过登录admin审批3.2 步骤13.2 步骤23.3步骤33.4 项目添加成员4 使用成员用户,上传到新建的项目中4.1 复制项目地址4.2使用 git here 克隆项目4.3进入下载目…

读懂分布式事务

一、概述 1.1 什么是分布式事务 事务我们都很熟悉&#xff0c;事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元&#xff0c;组成这组操作的各个单元&#xff0c;要么全部成功&#xff0c;要么全部失败。 事务有四大特性&#xff1a; Atomic&#xf…

rabbitmq安装和thinkphp6简单操作思路

1、安装rabbitmq 2、crontab定时检测rabbtimq状态 2、使用thinphp6.0框架rabbitmq示例,supervisor守护消费者 3、RabbitMQ有四种交换机类型 rabbitmq组成部分如下&#xff1a; Broker&#xff1a;消息队列服务进程&#xff0c;此进程包括两个部分&#xff1a;Exchange和Que…

代码随想录算法训练营day42 |动态规划之背包问题 11.分割等和子集 1049. 最后一块石头的重量 II 494. 目标和

day4211.分割等和子集1.dp数组的含义2.确定递推公式3.dp数组初始化4.确定遍历顺序5.打印dp数组1049. 最后一块石头的重量 II1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组494. 目标和1.确定dp数组以及下标的含义2.确定递推公式3.…

Bootstrap系列之Flex布局

文章目录Bootstrap中的Flexd-flex与d-inline-flex也存在响应式变化flex水平布局flex垂直布局flex水平与垂直也存在响应式变化内容排列&#xff08;justify-content响应式变化也存在于这里sm&#xff0c;md&#xff0c;lg&#xff0c;xl&#xff09;子元素对齐方式Align items&a…

Oracle-00-卸载篇

这里给出企业级的Oracle 10g的卸教程,新安装的19c并没有正经去做卸载的操作,为了后面教程的进度,这里就先借用下10g,如果有需要会重新更新19c的卸载教程 windows服务中将Oracle所有服务全部停掉 选中Oracle - OraDb10g_home2->Oracle Installation Products->Univers…

文化:你所在的团队,有多少人敢讲真话?

你好&#xff0c;我是叶芊。 今天我们要讨论的话题是文化&#xff0c;说“文化”这个词你可能会觉得很虚&#xff0c;那我们换个词——“做事风格”&#xff0c;这就和你们团队平时的协作习惯密切相关了。 做事风格&#xff0c;往小了讲&#xff0c;会影响团队成员对开会的认知…

CV——day78 读论文:通过静态背景构建扩展低通道路边雷达的探测距离(目标是规避风险)

Extending the Detection Range for Low-Channel Roadside LiDAR by Static Background Construction 通过静态背景构建扩展低通道路边雷达的探测距离I. INTRODUCTIONII. RELATED WORKA. LiDAR-Based 3-D Vehicle and Road User DetectionB. LiDAR Data Background FilteringC.…

数据结构与算法之打家劫舍(一)动态规划思想

动态规划里面一部题目打家劫舍是一类经典的算法题目之一&#xff0c;他有各种各样的变式&#xff0c;这一篇文章和大家分享一下打家劫舍最基础的一道题目&#xff0c;掌握这一道题目&#xff0c;为下一道题目打下基础。我们直接进入正题。一.题目大家如果刚接触这样的题目&…

Linux小黑板(9):共享内存

"My poor lost soul"上章花了不少的篇幅讲了讲基于管道((匿名、命名))技术实现的进程间通信。进程为什么需要通信&#xff1f;目的是为了完成进程间的"协同",提高处理数据的能力、优化业务逻辑的实现等等&#xff0c;在linux中我们已经谈过了一个通信的大类…

数据库的基本查询

注意&#xff1a;LIMIT的两个参数&#xff0c;第一个是起始位置&#xff0c;第二个是一次查询到多少页。注意&#xff1a;什么类型的数字都是可以排序的。日期的降序是从现在到以前&#xff0c;MySQL ENUM值如何排序&#xff1f;在MYSQL中&#xff0c;我们知道每个ENUM值都与一…

安装MySQL数据库

安装MySQL数据库 获取软件&#xff1a;https://dev.mysql.com/downloads/mysql/ 下载完成后进行解压操作 若安装目录里没有my.ini配置文件&#xff0c;则需要新建一个my.ini的配置文件。 编辑my.ini配置文件&#xff0c;将配置文件中的内容修改成下面内容 [client] # 设置…

基于企业微信应用消息的每日早安推送

基于企业微信应用消息的每日早安推送 第一步&#xff1a;注册企业微信 企业微信注册地址&#xff1a;https://work.weixin.qq.com/wework_admin/register_wx 按照正常流程填写信息即可&#xff0c;个人也可以注册企业微信&#xff0c;不需要公司 注册完成后&#xff0c;登录…