搭建高可用k8s

news2024/12/23 17:01:35

高可用只针对于api-server,需要用到nginx + keepalived,nginx提供4层负载,keepalived提供vip(虚拟IP)

系统采用openEuler 22.03 LTS

1. 前期准备

因为机器内存只有16G,所有我采用3master + 1node

1.1 修改主机配置(所有节点操作)

  1. 修改主机名

  2. 关闭防火墙,selinux

  3. 关闭swap

  4. 配置时间同步

主机过多,我只写master01的操作

# 修改主机名
[root@localhost ~]# hostnamectl set-hostname master01
[root@localhost ~]# bash
# 关闭防火墙,selinux
[root@master01 ~]# systemctl disable --now firewalld
[root@master01 ~]# setenforce 0
[root@master01 ~]# sed -i s"/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
# 关闭swap
[root@master01 ~]# swapoff -a
# 配置时间同步
[root@master01 ~]# yum install chrony -y
[root@master01 ~]# chronyc sources

1.2 开启ipvs(所有节点)

[root@master01 ~]# cat > /etc/sysconfig/modules/ipvs.modules << END
> #!/bin/bash
> ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
> for kernel_module in ${ipvs_modules};do
>   /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
>   if [ 0 -eq 0]; then
>   /sbin/modprobe ${kernel_module}
>   fi
> done
> END
[root@master01 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules 
[root@master01 ~]# bash /etc/sysconfig/modules/ipvs.modules

1.3 配置k8s yum源(所有节点)

# 直接到华为镜像站搜索kubernetes
[root@master01 ~]#  cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.huaweicloud.com/kubernetes/yum/repos/kubernetes-el7-$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://mirrors.huaweicloud.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.huaweicloud.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

使用欧拉的话需要将$basearch 改为自己的架构 x86_64

2. 安装docker(所有节点)

由于欧拉目前最高支持k8s的版本是1.23 ,所以需要安装docker

2.1 安装

[root@master01 ~]# yum install docker -y

2.2 修改docker配置

[root@master01 ~]# vim /etc/docker/daemon.json
{
        "exec-opts":["native.cgroupdriver=systemd"]
}

2.3 重启docker

[root@master01 ~]# systemctl daemon-reload
[root@master01 ~]# systemctl restart docker

3. 配置高可用(所有master节点)

3.1 安装软件包

[root@master01 ~]#  yum install nginx nginx-all-modules keepalived -y

3.2 配置nginx负载

在nginx的配置文件内加入一下内容

[root@master01 ~]# vim /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
 
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
 
events {
    worker_connections 1024;
}
# 添加这一段,要写在http段之外,因为我们用的是四层负载,并不是七层负载
stream {
   upstream k8s-apiserver {
     server 192.168.200.163:6443;
     server 192.168.200.164:6443;
     server 192.168.200.165:6443;
   }
   server {
     listen 16443;
     proxy_pass k8s-apiserver;
   }
}
# 到这里结束
 
# 检测语法
[root@master01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
 
# 重启
[root@master01 ~]# systemctl restart nginx

3.3 配置keepalived

# 备份原有配置
[root@master01 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# 修改配置
[root@master01 ~]# vim /etc/keepalived/keepalived.conf 
global_defs {
    router_id master1
}
 
vrrp_instance Nginx {
    state MASTER           # 只有master01写MASTER,其他master写BACKUP
    interface ens33        # 写上网卡
    virtual_router_id 51
    priority 200           # 其他节点的值要低于这个,另外2个节点的值也不要一样
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123
    }
    virtual_ipaddress {
        192.168.200.200     # 写VIP
    }
}
# 重启
[root@master01 ~]# systemctl restart keepalived.service

将原本的配置项都删除,写入这些内容

注意:只有master01的 state 是MASTER,其他2个节点应该写为BACKUP。且priority要低于master01

3.4 验证keepalived

# 查看master01的ens33
[root@master01 ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:8d:ce:8a brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.200.163/24 brd 192.168.200.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.200/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::ce91:fe4e:625d:6e32/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

现在他有自己的iP和VIP

# 停掉keepalived
[root@master01 ~]# systemctl stop keepalived.service 
[root@master01 ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:8d:ce:8a brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.200.163/24 brd 192.168.200.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::ce91:fe4e:625d:6e32/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

停掉之后vip不存在了,切换到master02 来看看

[root@master02 ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:2d:b0:8a brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.200.164/24 brd 192.168.200.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.200/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::f409:2f97:f02e:a8d4/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

现在vip跑到master02了,将master01的keepalived启动,vip会回来,因为master01的

优先级高于他

[root@master01 ~]# systemctl restart keepalived.service 
[root@master01 ~]# systemctl enable --now nginx keepalived.service 
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service.

4. 部署k8s

欧拉目前只支持1.23版本,所以目前的容器运行时是docker,没有写执行节点那么就是master01

4.1 安装软件包(所有master节点)

[root@master01 ~]# yum install kubeadm kubelet kubectl -y
[root@master01 ~]# systemctl enable kubelet

4.3 生成部署文件

[root@master01 ~]# kubeadm config print init-defaults > init.yaml

4.3.1 修改部署文件
[root@master01 ~]# vim init.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.200.163       # 这个地方需要修改为自己的IP地址  
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  name: master01 # 这个地方改成你的主机名或者IP,作用是集群部署出来之后在集群内显示的名称,这里写什么到时候就是什么
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
  certSANs:  # 添加这一整段,目的是让这些地址所在的主机都能够使用证书
  - master01
  - master02
  - master03
  - 127.0.0.1
  - localhost
  - kubernetes
  - kubernetes.default
  - kubernetes.default.svc
  - kubernetes.default.svc.cluster.local
  - 192.168.200.163  # 这里3个是master的IP地址
  - 192.168.200.164
  - 192.168.200.165
  - 192.168.200.200  # VIP也需要写上
controlPlaneEndpoint: 192.168.200.200:16443  # 添加这一行,IP为VIP
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: swr.cn-east-3.myhuaweicloud.com/hcie_openeuler   # 镜像仓库要改为国内的
kind: ClusterConfiguration
kubernetesVersion: 1.23.1   # 改为kubeadm版本一样的
networking:
  dnsDomain: cluster.local
  podSunbet: 10.244.0.0/12  # 添加这一行
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---   # 添加这一整段
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs

4.4 提前拉取镜像

# 这是在部署之前提前先把镜像拉取下来
[root@master01 ~]# kubeadm config images pull --config ./init.yaml

4.5 开始部署

[root@master01 ~]# kubeadm init --upload-certs --config ./init.yaml 
# 如果安装失败了可以执行kubeadm reset -f 重置环境再来init,如果直接init会报错

执行成功之后会输出一些信息

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
 
You can now join any number of the control-plane node running the following command on each as root:
# 加入新的master节点使用这个命令
  kubeadm join 192.168.200.200:16443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:de0e41b3bc59d2879af43da29f3f25cc1b133efda1f202d4c4ce5f865cad71d3 \
	--control-plane --certificate-key 8be5d0b8d4914a930d58c4171e748210cbdd118befa0635ffcc1031b7840386e
 
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
 
Then you can join any number of worker nodes by running the following on each as root:
# 加入node节点就使用这个命令
kubeadm join 192.168.200.200:16443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:de0e41b3bc59d2879af43da29f3f25cc1b133efda1f202d4c4ce5f865cad71d3 

4.6 其他master节点加入集群

生成的token只有24小时有效,如果token过期了还需要有节点加入集群的话可以执行

[root@master01 ~]# kubeadm token create --print-join-commandkubeadm join 192.168.200.200:16443 --token gb00dz.tevdizf7mxqx1egj --discovery-token-ca-cert-hash sha256:de0e41b3bc59d2879af43da29f3f25cc1b133efda1f202d4c4ce5f865cad71d3 这个命令可以直接让node节点加入

如果需要加入master节点,那么需要加上 --control-plane --certificate-key 8be5d0b8d4914a930d58c4171e748210cbdd118befa0635ffcc1031b7840386e

[root@master02 ~]# kubeadm join 192.168.200.200:16443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:de0e41b3bc59d2879af43da29f3f25cc1b133efda1f202d4c4ce5f865cad71d3 \
	--control-plane --certificate-key 8be5d0b8d4914a930d58c4171e748210cbdd118befa0635ffcc1031b7840386e
[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.200.200:16443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:de0e41b3bc59d2879af43da29f3f25cc1b133efda1f202d4c4ce5f865cad71d3 \
	--control-plane --certificate-key 8be5d0b8d4914a930d58c4171e748210cbdd118befa0635ffcc1031b7840386e
[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	

可以使用 --node-name 指定加入集群后的名字

4.7 node节点加入集群

[root@node ~]# kubeadm join 192.168.200.200:16443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:de0e41b3bc59d2879af43da29f3f25cc1b133efda1f202d4c4ce5f865cad71d3

4.8 查看集群节点

[root@master01 ~]# kubectl get nodes
NAME       STATUS     ROLES                  AGE   VERSION
master01   NotReady   control-plane,master   45m   v1.23.1
master02   NotReady   control-plane,master   27m   v1.23.1
master03   NotReady   control-plane,master   27m   v1.23.1
node       NotReady   <none>                 10s   v1.23.1

5. 安装网络插件 calico

没安装网络插件之前状态是NotReady,装完之后就是Ready

calico官方安装文档

在官方文档里面可以找到最新的版本

[root@master01 ~]# wget https://docs.projectcalico.org/archive/v3.23/manifests/calico.yaml
[root@master01 ~]# kubectl apply -f calico.yaml

稍等一会之后,查看集群节点状态

[root@master01 ~]# kubectl get nodes
NAME       STATUS   ROLES                  AGE     VERSION
master01   Ready    control-plane,master   5h38m   v1.23.1
master02   Ready    control-plane,master   5h21m   v1.23.1
master03   Ready    control-plane,master   5h21m   v1.23.1
node       Ready    <none>                 4h53m   v1.23.1

如果登了很久还没有ready的话可以使用

[root@master01 ~]# kubectl get pods -A

看看那些pod没有起来,找到原因并解决之后就可以了

6. 验证集群是否可用

[root@master01 ~]# kubectl run web01 --image nginx:1.24
pod/web01 created
[root@master01 ~]# kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
web01   1/1     Running   0          27s

能够正常启动pod

文章转载自:FuShudi

原文链接:https://www.cnblogs.com/fsdstudy/p/18233538

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

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

相关文章

fpga入门 串口定时1秒发送1字节

一、 程序说明 FPGA通过串口定时发送数据&#xff0c;每秒发送1字节&#xff0c;数据不断自增 参考小梅哥教程 二、 uart_tx.v timescale 1ns / 1psmodule uart_tx(input wire sclk,input wire rst_n,output reg uart_tx);parameter …

栈与队列的相互实现

文章目录 前言一、用队列实现栈二、用栈实现队列总结 梦想不是别人给你的目标&#xff0c;靠自己的意志去实现的才是梦想… ——《食梦者》 前言 嗨喽喽&#xff01;大家好哇。欢迎小伙伴们来到我的博客&#xff01;&#xff01; 在前面已经分享了栈与队列两种数据结构的特点…

进程和计划任务以及步骤

进程 进程和程序有关&#xff0c;把该文件放到内存里&#xff0c;进程是动态的&#xff0c;不同时刻的状态不一样 内存&#xff1a;放置正在运行的程序和所需数据的位置 程序启动 ——》将相关文件和数据放到内存里 ——》进程&#xff08;processes&#xff09; 进程相关命令 …

easyexcel动态表头导出

动态表头导出excel 红框固定&#xff0c;绿框动态 引入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>工具类 import com.alibaba.excel.util…

0.2 模拟电视简介

0.2 模拟电视简介 模拟电视指从图像信号的产生、传输、处理到接收机的复原&#xff0c;整个过程几乎都是在模拟体制下完成的电视系统或电视设备。模拟电视使用模拟信号传输图像和音频&#xff0c;模拟信号的幅度、相位和频率分别表示图像的亮度、颜色和声音。模拟电视的优点&a…

jmeter -n -t 使用非GUI模式运行脚本说明

命令模式下执行jmx文件 jmeter -n -t fatie.jmx -l results\t4.jtl -e -o results\h1 表示以命令行模式运行当前目录下的脚本fatie.jmx,将结果存入当前目录下的results\t1.jtl,并且生成html格式的报告&#xff0c;写入文件夹results\h1。 说明&#xff1a;生成结果的文件夹r…

在离线单机或内网环境中快速安装Visual Studio 2022并还原用户设定

20240606 By wdhuag 目录 前言 参考&#xff1a; 在外网环境下载离线安装包 1、在已安装好VS的电脑上用Visual Studio Installer导出配置.vsconfig 2、下载在线安装包VisualStudioSetup_Enterprise_2022.exe到D:\VisualStudio\ 3、使用cmd定位到VisualStudioSetup_Enter…

MySQL深分页,limit 100000,10 优化

文章目录 一、limit深分页为什么会变慢二、优化方案2.1 通过子查询优化&#xff08;覆盖索引&#xff09;回顾B树结构覆盖索引把条件转移到主键索引树 2.2 INNER JOIN 延迟关联2.3 标签记录法&#xff08;要求id是有序的&#xff09;2.4 使用between...and... 我们日常做分页需…

docker 命令 ps,inspect,top,logs详解

docker常用命令教程-4 docker ps docker ps 命令用于列出当前正在运行的容器。默认情况下&#xff0c;它只显示正在运行的容器&#xff0c;但你可以使用 -a 或 --all 选项来显示所有容器&#xff08;包括已停止的容器&#xff09;。 常用的选项和示例&#xff1a; -a 或 --…

手机自动化测试:4.通过appium inspector 获取相关app的信息,以某团为例,点击,搜索,获取数据等。

0.使用inspector时&#xff0c;一定要把不相关的如weditor啥的退出去&#xff0c;否则&#xff0c;净是事。 1.从0开始的数据获取 第一个位置&#xff0c;有时0.0.0.0&#xff0c;不可以的话&#xff0c;你就用这个。 第二个位置&#xff0c;抄上。 直接点击第三个启动。不要…

手持终端RFID电子标签读写器超高频手持机

RFID手持机具备RFID读写功能&#xff0c;可以对RFID标签进行识读&#xff0c;是有特定功能的PDA(便携式移动终端)。 作为现代化信息管理工具的重要组成部分&#xff0c;其强大的功能和便捷的操作性正在越来越多的领域得到应用。从物流仓储到零售管理&#xff0c;从生产制造到医…

浅谈申请小程序地理位置权限的正确打开方式

小程序地理位置接口有什么功能&#xff1f; 这篇内容会教大家如何快速申请“获取当前的地理位置&#xff08;onLocationChange&#xff09;”接口&#xff0c;以便帮助大家顺利开通接口。以下内容是本人经历了多次的申请经历得出来的经验&#xff0c;来之不易&#xff0c;望大家…

Cy5.5-甘氨鹅去氧胆酸荧光染料标记物:一种生物成像工具

在现代生物研究和医学诊断领域&#xff0c;荧光染料标记物扮演着举足轻重的角色。它们能够实现对生物体内特定分子或细胞的非侵入性、实时追踪&#xff0c;从而为我们揭示生命过程的奥秘提供工具。 Cy5.5-甘氨鹅去氧胆酸荧光染料标记物的结构与特性 Cy5.5-甘氨鹅去氧胆酸荧光染…

Google Inventor一款适合儿童的趣味APP编程开发平台

Google Inventor 其实是指 App Inventor&#xff0c;这是由 Google 开发并由麻省理工学院&#xff08;MIT&#xff09;继续维护和发展的一个应用程序开发平台。 App Inventor 的主要特点和用途如下&#xff1a; 什么是 App Inventor&#xff1f; App Inventor 是一个基于 W…

Python文本处理利器:jieba库全解析

文章目录 Python文本处理利器&#xff1a;jieba库全解析第一部分&#xff1a;背景和功能介绍第二部分&#xff1a;库的概述第三部分&#xff1a;安装方法第四部分&#xff1a;常用库函数介绍1. 精确模式分词2. 全模式分词3. 搜索引擎模式分词4. 添加自定义词典5. 关键词提取 第…

渗透测试报告生成工具

目录 1.前言 1.1 渗透测试报告是什么? 1.2 渗透测试报告的编写需要考虑以下几点&#xff1a; 1.3 一份优秀的渗透测试报告应该具备以下特点&#xff1a; 1.4 在编写渗透测试报告之前&#xff0c;需要进行一些准备工作&#xff1a; 1.5 渗透测试报告一般包括以下部分&…

【成品设计】基于STM32和LoRa的大棚监测控制系统

《基于STM32和LoRa的大棚监测控制系统》 整体功能&#xff1a; LoRa智能远程控制系统是基于STM32F103C8T6最小系统板如图1的基础上使用STM32CubeMX工具搭建工程&#xff0c;基于HAL库进行编程设计&#xff0c;采用主 - 从模式来进行设计模拟与实现&#xff0c;主机、从机上都…

各平台对象存储

一、阿里云对象存储 官方文档&#xff1a;https://help.aliyun.com/zh/oss/getting-started/getting-started-with-oss?spma2c4g.11186623.0.0.299a646c6nWWcW 1.引入maven 官网&#xff1a;https://help.aliyun.com/zh/oss/developer-reference/java-installation?spma2c…

跨越文化鸿沟:海外短剧推广平台多语言支持技术的深度探讨

在海外短剧推广的过程中&#xff0c;多语言支持技术不仅是跨越语言障碍的桥梁&#xff0c;更是连接不同文化背景的纽带。本文将深入探讨多语言支持技术的重要性&#xff0c;以及其在实现过程中的技术细节和策略。 一、多语言支持技术的文化价值 多语言支持技术不仅能让观众跨…

材料科学领域科技查新点提炼方法!---附案例

材料科学是研究材料的组织结构、性质、生产流程、使用效能及它们之间的相互关系的科学&#xff0c;集物理学、化学、冶金学等于一体。随着科技的发展&#xff0c;纳米技术和生物技术也广泛应用到该领域中。从材质上可以分为金属材料、无机非金属材料、有机高分子材料和复合材料…