系列1:基于Centos-8.6部署Kubernetes (1.24-1.30)

每日禅语

“木末芙蓉花,山中发红萼,涧户寂无人,纷纷开自落。​”这是王维的一首诗,名叫《辛夷坞》​。这首诗写的是在辛夷坞这个幽深的山谷里,辛夷花自开自落,平淡得很,既没有生的喜悦,也没有死的悲哀。无情有性,辛夷花得之于自然,又回归自然。它不需要赞美,也不需要人们对它的凋谢洒同情之泪,它把自己生命的美丽发挥到了极致。在佛家眼中,众生平等,没有高低贵贱,每个个体都自在自足,自性自然圆满。​《占察善恶业报经》有云:​“如来法身自性不空,有真实体,具足无量清净功业,从无始世来自然圆满,非修非作,乃至一切众生身中亦皆具足,不变不异,无增无减。​”一个人如果能体察到自身不增不减的天赋,就能在世间拥有精彩和圆满。我们常常会有这样的感觉,远处的风景都被笼罩在薄雾或尘埃之下,越是走近就越是朦胧;心里的念头被围困在重峦叠嶂之中,越是急于走出迷阵就越是辨不清方向。这是因为我们过多地执着于思维,而忽视了自性。

写作初衷

网络上关于k8s的部署文档纷繁复杂,而且k8s的入门难度也比docker要高,我学习k8s的时候为了部署一套完整的k8s集群环境,寻找网上各种各样的文档信息,终究不得其中奥秘,所以光是部署这一步导致很多人退而缺步,最终而放弃学习,所以写了这篇文章让更多的k8s学习爱好者一起学习,让大家可以更好的部署集群环境。

注:未标明具体节点的操作需要在所有节点上都执行。 

部署模式:两主一从

市面上大部分的部署教程都是一个主节点,两个从节点这种方式,很少有人写这种高可用的部署方法,笔者开始的部署模式也是一主两从,但是真正在使用的时候会发现主节点不是太稳定,经常会导致集群宕机。所以本文是采用两主一从的方式部署

服务器节点名称k8s节点角色
192.168.11.85k8s-mastercontrol-plane
192.168.11.86k8s-master1control-plane
192.168.11.87k8s-nodeworker

1.部署机器初始化操作

1.1 关闭selinux

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

1.2配置主机名称

  • 控制节点(主节点)其他的控制节点也如下命令添加
# hostnamectl set-hostname k8s-master
  • 子节点设置服务器名称也是一样操作
# hostnamectl set-hostname k8s-node
# hostnamectl set-hostname k8s-node1
# hostnamectl set-hostname k8s-node2

1.3关闭交换分区swap

vim /etc/fstab   //注释swap挂载,给swap这行开头加一下注释。# /dev/mapper/centos-swap swap  swap  defaults  0  0
# 重启服务器让其生效
reboot now

1.4修改机器内核参数

# modprobe br_netfilter# echo "modprobe br_netfilter" >> /etc/profile# cat > /etc/sysctl.d/k8s.conf <<EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1EOF
# sysctl -p /etc/sysctl.d/k8s.conf
# vim /etc/rc.sysinit    //重启后模块失效,下面是开机自动加载模块的脚本,在/etc/新建rc.sysinit 文件#!/bin/bash
for file in /etc/sysconfig/modules/*.modules; do
[ -x $file ] && $file
done# vim /etc/sysconfig/modules/br_netfilter.modules    //在/etc/sysconfig/modules/目录下新建文件
modprobe br_netfilter# chmod 755 /etc/sysconfig/modules/br_netfilter.modules    //增加权限

1.5关闭防火墙

# systemctl stop firewalld; systemctl disable firewalld

1.6配置yum源

备份基础repo源# mkdir /root/repo.bak# cd /etc/yum.repos.d/# mv * /root/repo.bak/
# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
# yum makecache
# yum -y install yum-utils# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

1.7安装基础软件包

# yum -y install yum-utils openssh-clients device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet ipvsadm

2安装containerd

2.1安装containerd

# yum install containerd.io-1.6.6 -y

2.2配置containerd配置

# mkdir -p /etc/containerd# containerd config default > /etc/containerd/config.toml    //生成containerd配置文件# vim /etc/containerd/config.toml    //修改配置文件把SystemdCgroup = false修改成SystemdCgroup = true把sandbox_image = "k8s.gcr.io/pause:3.6"修改成sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"

2.3配置 containerd 开机启动,并启动 containerd

# systemctl enable containerd  --now

2.3修改/etc/crictl.yaml文件

# cat > /etc/crictl.yaml <<EOFruntime-endpoint: unix:///run/containerd/containerd.sockimage-endpoint: unix:///run/containerd/containerd.socktimeout: 10debug: falseEOF# systemctl restart containerd

2.4配置containerd镜像加速器

# vim /etc/containerd/config.toml文件将config_path = ""修改成如下目录:config_path = "/etc/containerd/certs.d"# mkdir /etc/containerd/certs.d/docker.io/ -p# vim /etc/containerd/certs.d/docker.io/hosts.toml[host."https://vh3bm52y.mirror.aliyuncs.com",host."https://registry.docker-cn.com"]capabilities = ["pull"]# systemctl restart containerd

3安装docker服务

3.1安装docker

备注:docker也要安装,docker跟containerd不冲突,安装docker是为了能基于dockerfile构建镜像# yum install docker-ce -y# systemctl enable docker --now

3.2配置docker镜像加速器

# vim /etc/docker/daemon.json    //配置docker镜像加速器{"registry-mirrors":["https://vh3bm52y.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]}# systemctl daemon-reload# systemctl restart docker

4.安装k8s组件

4.1配置安装k8s组件需要的阿里云的repo源(不同版本的k8s需要配置不同的repo源)

1.25版本


cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

查看不同版本的镜像源地址:安装 kubeadm | Kubernetes

  • 1.30版本

# 此操作会覆盖 /etc/yum.repos.d/kubernetes.repo 中现存的所有配置
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
  • 1.29版本
# 此操作会覆盖 /etc/yum.repos.d/kubernetes.repo 中现存的所有配置
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
  • 其他版本的类似

4.2安装k8s初始化工具

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet

4.3设置容器运行时的endpoint

# crictl config runtime-endpoint /run/containerd/containerd.sock

4.4使用kubeadm初始化k8s集群(控制节点执行)

# vim kubeadm.yamlapiVersion: kubeadm.k8s.io/v1beta3...kind: InitConfigurationlocalAPIEndpoint:advertiseAddress: 172.17.11.85#控制节点的ipbindPort: 6443nodeRegistration:criSocket: unix:///run/containerd/containerd.sock   #指定containerd容器运行时的endpointimagePullPolicy: IfNotPresentname:  k8s-master #控制节点主机名taints: null---apiVersion: kubeadm.k8s.io/v1beta3certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrollerManager: {}dns: {}etcd:local:dataDir: /var/lib/etcdimageRepository: registry.aliyuncs.com/google_containers    #指定从阿里云仓库拉取镜像kind: ClusterConfigurationkubernetesVersion: 1.30.0   #k8s版本networking:dnsDomain: cluster.localpodSubnet: 10.244.0.0/16    #指定pod网段serviceSubnet: 10.96.0.0/12 #指定Service网段scheduler: {}#在文件最后,插入以下内容,(复制时,要带着---)---apiVersion: kubeproxy.config.k8s.io/v1alpha1kind: KubeProxyConfigurationmode: ipvs---apiVersion: kubelet.config.k8s.io/v1beta1kind: KubeletConfigurationcgroupDriver: systemd

4.4 修改/etc/sysconfig/kubelet

# vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"

4.5 基于kubeadm.yaml文件初始化k8s (控制节点执行)

kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification

4.6配置kubectl的配置文件(配置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl命令可以使用此证书对k8s集群进行管理)(控制节点执行)

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes

5.安装kubernetes网络组件-Calico(控制节点执行)

上传calico.yaml到master1上,使用yaml文件安装calico 网络插件(这里需要等几分钟才能ready)。kubectl apply -f calico.yaml注:在线下载配置文件地址是:https://docs.projectcalico.org/manifests/calico.yaml

6.控制节点部署成功以后,添加node节点

注:未标明具体节点的操作需要在node节点上都执行。 执行完成以后在进行下面步骤的操作

6.1上述的所有操作都已经操作成功,除控制节点的操作

在看k8s-master上查看加入节点的命令:[root@k8s-master ~]# kubeadm token create --print-join-commandkubeadm join 192.168.11.85:6443 --token ol7rnk.473w56z16o24u3qs --discovery-token-ca-cert-hash sha256:98d33a741dd35172891d54ea625beb552acf6e75e66edf47e64f0f78365351c6把k8s-node加入k8s集群:[root@k8s-node ~]# kubeadm join 192.168.11.85:6443 --token ol7rnk.473w56z16o24u3qs --discovery-token-ca-cert-hash sha256:98d33a741dd35172891d54ea625beb552acf6e75e66edf47e64f0f78365351c6

6.2可以把node的ROLES变成work,按照如下方法

[root@k8s-master ~]# kubectl label node k8s-node node-role.kubernetes.io/worker=worker

6.3查看节点情况

kubectl get nodes    //在master上查看集群节点状况

7.添加master1控制节点

 注:未标明具体节点的操作需要在看s-master1节点上都执行。 执行完成以后在进行下面步骤的操作

7.1在当前唯一的master节点上运行如下命令,获取key

1 # kubeadm init phase upload-certs --upload-certs
2 I1109 14:34:00.836965    5988 version.go:255] remote version is much newer: v1.25.3; falling back to: stable-1.22
3 [upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
4 [upload-certs] Using certificate key:
5 ecf2abbfdf3a7bc45ddb2de75152ec12889971098d69939b98e4451b53aa3033

 7.2在当前唯一的master节点上运行如下命令,获取token

在看k8s-master上查看加入节点的命令:[root@k8s-master ~]# kubeadm token create --print-join-commandkubeadm join 192.168.11.85:6443 --token ol7rnk.473w56z16o24u3qs --discovery-token-ca-cert-hash sha256:98d33a741dd35172891d54ea625beb552acf6e75e66edf47e64f0f78365351c6

7.3将获取的key和token进行拼接

kubeadm join 192.168.11.85:6443 --token xxxxxxxxx --discovery-token-ca-cert-hash xxxxxxx --control-plane --certificate-key xxxxxxx

注意事项:

  1. 不要使用 --experimental-control-plane,会报错
  2. 要加上--control-plane --certificate-key ,不然就会添加为node节点而不是master
  3. join的时候节点上不要部署,如果部署了kubeadm reset后再join

7.4将7.3步骤拼接好的join命令,在master1节点执行,执行成功以后显示如下信息

This node has joined the cluster and a new control plane instance was created:* Certificate signing request was sent to apiserver and approval was received.
* The Kubelet was informed of the new secure connection details.
* Control plane (master) label and taint were applied to the new node.
* The Kubernetes control plane instances scaled up.
* A new etcd member was added to the local/stacked etcd cluster.To start administering your cluster from this node, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configRun 'kubectl get nodes' to see this node join the cluster.

7.5报错处理

7.5.1 第一次加入集群的时候会有以下报错:

[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
error execution phase preflight:
One or more conditions for hosting a new control plane instance is not satisfied.unable to add a new control plane instance a cluster that doesn't have a stable controlPlaneEndpoint addressPlease ensure that:
* The cluster has a stable controlPlaneEndpoint address.
* The certificates that must be shared among control plane instances are provided.To see the stack trace of this error execute with --v=5 or higher

7.5.2解决办法

查看kubeadm-config.yaml
kubectl -n kube-system get cm kubeadm-config -oyaml
发现没有controlPlaneEndpoint
添加controlPlaneEndpoint
kubectl -n kube-system edit cm kubeadm-config
大概在这么个位置:
kind: ClusterConfiguration
kubernetesVersion: v1.25.3
controlPlaneEndpoint: 192.168.11.86 #当前需要添加为master节点的ip地址
然后再在准备添加为master的节点(k8s-master1)上执行kubeadm join的命令

7.6添加成功以后可以看见2个master节点和1个worker节点

 后记

k8s的部署确实很复杂,有可能不同的系统版本,依赖版本都可能导致问题的出现,笔者这里是根据当前操作系统部署,如果你在安装过程中可能遇到一些奇奇怪怪的问题,欢迎下方留言,我们一起探讨。文中可能也有一些漏洞,欢迎指出问题,万分感谢。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP8266 Ubuntu 安装

文章参考&#xff1a;https://blog.csdn.net/AUST_129/article/details/119406722文章浏览阅读1.8k次&#xff0c;点赞4次&#xff0c;收藏19次。参考&#xff1a;https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/linux-setup.htmlhttp://aicloud…

软件压力测试和负载测试有什么联系与区别?

在当今数字化时代&#xff0c;软件质量的重要性愈发凸显。在各种软件测试中&#xff0c;压力测试和负载测试都属于性能测试中的一种测试方法&#xff0c;那么这两者分别是什么?又有什么联系和区别呢? 一、压力测试和负载测试的定义   压力测试通常是指在特定的环境中&…

C# 异常处理 详解

总目录 前言 一、异常 1、定义 异常是在程序执行期间出现的问题。 C# 中的异常是对程序运行时出现的特殊情况的一种响应&#xff0c;比如尝试除以零。 异常&#xff1a;程序员必须控制和解决的问题。程序可以正常的运行&#xff0c;但是在运行的过程中出现了问题&#xff0c;…

类OCSP靶场-Kioptrix系列-Kioptrix Level 2

一、前情提要 二、实战打靶 1. 信息收集 1.1. 主机发现 1.2. 端口扫描 1.3.目录遍历 2.漏洞发现 2.1. 登录框测试 2.2. 发现命令执行 2.3 构造命令执行利用payload 3.提权 3.1. 搜索提权exp 3.2. 查看exp信息 3.3. Privilege Escalation的exp利用 exp_9542 一、前…

μC/OS-Ⅱ源码学习(6)---事件标志组

快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) μC/OS-Ⅱ源码学习(3)---事件模型 μC/OS-Ⅱ源码学习(4)---信号量 μC/OS-Ⅱ源码学习(5)---消息队列 本文进一步解析事件模型中&#xff0c;事件标志…

学习maven(maven 项目模块化,继承,聚合)

前言 本篇博客的核心&#xff1a;理解maven 项目模块化&#xff0c;继承&#xff0c;聚合 的含义 maven 项目模块化 含义 maven项目模块化&#xff1a;使用maven 构建项目&#xff0c;管理项目的方式&#xff0c;我们可以将maven项目根据内在的关系拆分成很多个小项目【模块】…

电工电子技术实验:电压比较器及其应用电路

实验目的 1&#xff0e;了解电压比较器与运算放大器的性能区别&#xff1b; 2&#xff0e;掌握电压比较器的结构及特点&#xff1b; 3&#xff0e;掌握电压比较器电压传输特性的测试方法&#xff1b; 4&#xff0e;学习比较器在电路设计中的应用 实验原理 电压比较器是一…

3D相框案例讲解(详细)

前言 通过现阶段的学习&#xff0c;我们已经掌握了HTML&#xff0c;CSS和JS部分的相关知识点&#xff0c;现在让我们通过一篇案例&#xff0c;来巩固我们近期所学的知识点。 详细视频讲解戳这里 任务一 了解目标案例样式 1.1了解案例 3D相框 1.2 分析案例 首先我们看到一个…

C/C++代码性能优化技巧的书籍及资料

使用C/C开发的场景&#xff0c;大多对代码的执行的速度&#xff0c;实时性有较高的要求&#xff0c;像嵌入式系统的开发&#xff0c;资源还受限。在算力存储空间有限的MCU上写出简洁又高效的代码实际是一种艺术。软件工程师在代码设计上的这种差距&#xff0c;会反映在产品的性…

JAVA:建造者模式(Builder Pattern)的技术指南

1、简述 建造者模式(Builder Pattern)是一种创建型设计模式,它通过将对象的构造过程与表示分离,使得相同的构造过程可以创建不同的表示。建造者模式尤其适用于创建复杂对象的场景。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 本文将详细介绍建…

软件集成测试内容和作用简析

在现代软件开发过程中&#xff0c;软件集成测试作为关键的一环&#xff0c;日益受到重视。特别是随着信息技术的快速发展&#xff0c;各类软件系统日益庞大复杂&#xff0c;如何确保系统不同模块的顺畅合作&#xff0c;成为了每个项目成功的重要基础。集成测试是指在软件开发过…

Windows 环境实战开源项目GFPGAN 教程

GFPGAN GFPGAN&#xff08;Generative Facial Prior-GAN&#xff09;是由腾讯ARC&#xff08;Applied Research Center&#xff09;开发的一种实用的真实世界人脸修复算法。它专门设计用于人脸图像的生成和优化&#xff0c;尤其在低质量人脸图像的超分辨率恢复方面表现出色。以…

ctfshow xss

1.web316 看的wp 先在服务器上写一个php文件 <?php$cookie $_GET[cookie];$time date(Y-m-d h:i:s, time());$log fopen("cookie.txt", "a");fwrite($log,$time.: . $cookie . "\n");fclose($log); ?> 获取cookie的值&#xff…

25. 深浅拷贝

一、什么是浅拷贝 只对对象的最顶层进行的拷贝称为 浅拷贝。我们可以用 copy 模块中的 copy() 方法实现浅拷贝。 import copya [11, 22, 33] b [44, 55, 66] c [a, b] d copy.copy(c)print(f"c: {c}") print(f"d: {d}") print(f"c d: {c d}&q…

MySQL追梦旅途之性能优化

1、索引优化 索引可以显著加速查询操作&#xff0c;但过多或不适当的索引也会带来负面影响&#xff08;如增加写入开销&#xff09;。因此&#xff0c;选择合适的索引至关重要。 创建索引&#xff1a; 为经常用于WHERE子句、JOIN条件和ORDER BY排序的列创建索引。 CREATE I…

Liveweb视频汇聚平台支持WebRTC协议赋能H.265视频流畅传输

随着科技的飞速发展和网络技术的不断革新&#xff0c;视频监控已经广泛应用于社会各个领域&#xff0c;成为现代安全管理的重要组成部分。在视频监控领域&#xff0c;视频编码技术的选择尤为重要&#xff0c;它不仅关系到视频的质量&#xff0c;还直接影响到视频的传输效率和兼…

【超详细实战攻略】Jmeter逻辑控制器中if控制器、模块控制器、测试片段的使用方法

【超详细实战攻略】Jmeter逻辑控制器中if控制器、模块控制器、测试片段的使用方法 1 搭建测试对象1.1 禅道下载1.2 禅道安装1.3 运行禅道1.4 接口查看1.5 接口选择 2 Jmeter前置操作2.1 创建Jmeter线程组2.2 创建信息头管理器和请求默认值2.3 添加获取token接口2.4 添加监听器 …

我在广州学 Mysql 系列之 数据类型和运算符详解

ℹ️大家好&#xff0c;我是&#x1f606;练小杰&#xff0c;今天主要学习 Mysql的数据类型以及运算符操作~~ 上周五学习了“Mysql 系列之 数据“表”的基本操作”~ 想要了解更多&#x1f236;️MYSQL 数据库的命令行总结&#xff01;&#xff01;&#xff01; “我是你的敌人,…

如何高效获取Twitter数据:Apify平台上的推特数据采集解决方案

引言 在数据分析和市场研究领域&#xff0c;Twitter&#xff08;现在的X&#xff09;数据一直是重要的信息来源。但是&#xff0c;自从Twitter更改API定价策略后&#xff0c;获取数据的成本大幅提升。本文将介绍一个经济实惠的替代方案。 为什么需要Twitter数据&#xff1f; …

大模型学习笔记------SAM模型详解与思考

大模型学习笔记------SAM模型详解与思考 1、SAM框架概述2、Segment Anything Task3、Segment Anything Model SAM模型是Meta 提出的分割一切模型&#xff08;Segment Anything Model&#xff0c;SAM&#xff09;突破了分割界限&#xff0c;极大地促进了计算机视觉基础模型的发展…