CentOS系统搭建K8s集群

news/2024/12/24 1:31:36/文章来源:https://www.cnblogs.com/mingcore/p/18625377
前情概要

关于在虚拟机中centos系统搭建k8s集群,前前后后花了很多个白天黑夜才搞定,采用不同的搭建方式搭建集群次数至少10次以上,期间看了无数文章和视频,也踩过无数坑,很多视频、文章的安装教程都存在一些差别,有些时候可能因为k8s安装版本不同或者缺少某些必要的设置导致同一个命令返回的错误信息不一样,难点主要集中在安装flannel网络插件上以及集群节点状态为NotReady等问题,以flannel网络插件安装为例,其实有很多种安装办法,也都试过,但也遇到过各种各样的问题。还有就是一些配置,可能你在其它的教程中看到的会和本教程有不一致的情况,建议大家安装配置时按照本篇文章的操作步骤进行操作。

演示工具

VmWare17、MobaXterm

系统版本

CentOS7

集群节点
角色 IP地址
k8s-master 192.168.12.136
k8s-slave1 192.168.12.137
k8s-slave2 192.168.12.138
单词说明

master:代表master节点操作

slave:代表slave节点操作

master+slave:代表master、slave节点都要操作

安装并配置Docker(master+slave)
  1. 安装docker
#安装yum-utils包
yum install yum-utils#添加阿里云 yum 仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#更新yum缓存到本地
yum makecache fast#安装docker ce 社区版本
yum -y install docker-ce#检查docker是否安装成功
docker version#启动docker
systemctl start docker#设置docker开机自启
systemctl enable docker#查看docker运行状态
systemctl status docker

  1. 设置daemon.json
#创建文件夹
mkdir -p /etc/docker#创建并编辑文件
tee /etc/docker/daemon.json <<-'EOF'
{"exec-opts":["native.cgroupdriver=systemd"],"registry-mirrors": ["https://docker.m.daocloud.io", "https://noohub.ru", "https://huecker.io","https://dockerhub.timeweb.cloud","https://0c105db5188026850f80c001def654a0.mirror.swr.myhuaweicloud.com","https://5tqw56kt.mirror.aliyuncs.com","https://docker.1panel.live","http://mirrors.ustc.edu.cn/","http://mirror.azure.cn/","https://hub.rat.dev/","https://docker.ckyl.me/","https://docker.chenby.cn","https://docker.hpcloud.cloud","https://docker.m.daocloud.io"]
}
EOF#重载服务配置文件并重启docker
systemctl daemon-reload && systemctl restart docker

说明

  1. 设置exec-opts的目的是因为kubelet默认cgoup驱动为systemd,而docker默认驱动为cgroupfs,但k8s官网要求docker和kubelet服务中的cgroup驱动必须一致,因此添加了 "exec-opts":["native.cgroupdriver=systemd"]配置,若不配置,后续kubeadm初始化的时候会报以下问题

:::info
The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz“: dial tcp [::1]:10248: connect: connection refused

:::

  1. registry-mirros节点配置须注意,从2024年7月2日开始,阿里云镜像加速器配置功能做了调整,无法像以前一样直接复制镜像地址,复制的镜像地址都是无法访问的,上面命令中registry-mirrors对应数组的镜像节点地址是网上找了很久才找到可用的节点。

https://help.aliyun.com/zh/acr/product-overview/product-change-acr-mirror-accelerator-function-adjustment-announcement

设置独立的域名(master+slave)
  1. master节点执行以下命令
hostnamectl set-hostname k8s-master
  1. slave1节点执行以下命令
hostnamectl set-hostname k8s-slave1
  1. slave2节点执行以下命令
hostnamectl set-hostname k8s-slave2

设置完之后通过以下命令可以查看hostname

hostnamectl | grep "Static hostname"
添加主机名与IP对应的关系(master+slave)

集群机器分别执行以下命令,该命令用于修改hosts文件,添加添加主机名与IP对应的关系。

cat >> /etc/hosts << EOF
192.168.12.136 k8s-master
192.168.12.137 k8s-slave1
192.168.12.138 k8s-slave2
EOF
#可执行此命令用来检查配置是否写入文件中
cat /etc/hosts
同步时间(master+slave)

同步时间,设置中国时区(这一步必须做,否则后面安装flannel可能会有证书错误)

#安装ntpdate插件
yum install ntpdate -y
#同步时间
ntpdate cn.pool.ntp.org

输入date命令检查时间是否已同步

date
关闭并禁用防火墙(master+slave)

不禁用防火墙可能会导致后续执行kubeadm初始化命令报异常,但在实际工作场景中一般不会禁用防火墙,可以在生产环境中选择释放相应端口号即可。

#关闭防火墙
systemctl stop firewalld
#禁用防火墙
systemctl disable firewalld

关闭并禁用selinux(master+slave)
#临时关闭,将SELinux设置为permissive模式 0代表permissive模式;1代表enforcing模式;
setenforce 0#加上此行则代表永久关闭(需要重启机器)
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

关闭swap(master+slave)

有临时关闭和永久关闭两种选项,这里选择永久关闭。

#临时关闭
swapoff -a#永久关闭
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

网桥设置(master+slave)

将桥接的IPv4流量传递到iptables的链

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

使指令立即生效

sysctl --system
安装k8s(master+slave)
  1. 设置阿里云镜像
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=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF#执行以下命令可以查看配置是否写入文件中
cat /etc/yum.repos.d/kubernetes.repo

  1. 安装k8s相关依赖包
#安装kubeadm、kubelet、kubectl
yum install -y kubectl-1.23.17 kubeadm-1.23.17 kubelet-1.23.17#启动kubelet
systemctl start kubelet#开机自启动kubelet
systemctl enable kubelet#查看kubelet运行日志(可以暂时不执行此命令)
journalctl -xefu kubelet
kubeadm初始化(master)
  1. 执行下面命令进行kubeadm初始化

注意:apiserver-advertise-address后面的IP地址要换成你的master节点的IP地址

kubeadm init \
--apiserver-advertise-address=192.168.12.136 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.17 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16参数解析
--apiserver-advertise-address : 指定apiserver的监听地址(内网地址/私有地址)
--image-repository : 镜像仓库地址
--kuberneters-version : 指定kuberneters版本,要与安装的版本保持一致
--service-cidr :外网能访问的IP地址
--pod-network-cidr : Pod网络IP地址,与后面部署的CNI网络组件yaml中保持一致

  1. 配置环境变量

普通用户:

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

root用户:

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile

这里演示用的是root账户,因此执行root账户对应的命令。

注意:若不配置环境变量,执行命令时会报错,例如执行kubectl get node命令查看节点状态信息时会报以下错误

若配置了环境变量,执行kubectl get node命令会显示以下信息。

kubeadm加入到主节点(slave)
  1. 在每台slave机器中执行kubeadm join命令,该命令是mater节点初始化k8s时生成的。
kubeadm join 192.168.12.136:6443 --token af0b96.dc2rnj2tjb5fpec5 \--discovery-token-ca-cert-hash sha256:07351ab27b9df10f38d0f6ba588976679faf9ba1398192bf57340dd2f50eca70

注意:

  1. 这里的token值是临时token,有效期是24个小时,过期后将失效,需要在master节点执行以下命令重新创建token。
kubeadm token create --print-join-command
  1. 配置环境
echo "export KUBECONFIG=/etc/kubernetes/kubelet.conf" >> /etc/profile
source /etc/profile

  1. 查看集群节点状态信息
kubectl get node

状态都为NotReady,因为还未安装网络插件。

安装flannel网络(master)

flannel用于k8s节点之间容器网络通信的一个组件,可以为不同node节点分配不同的子网,实现容器间的跨机通信,从而实现整个kubents层级通信。

注意:网络插件并非只有flannel一种,还有很多,这里只以flannel作为演示。

  1. 输入如下命令

因为文件下载地址在国外,访问会很慢,因此需要做下配置,首先打开https://www.ipaddress.com/,在搜索框中查询raw.githubusercontent.com的真实IP。

#进入到hosts文件中
vi /etc/hosts#在hosts文件中添加如下配置并保存退出
185.199.108.133 raw.githubusercontent.com

  1. 下载网络插件到本地目录
cd /opt
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

虽然前面配置了域名,但也可能出现访问不了的情况,如下图所示,尝试多试几次。

文件完整内容如下所示,若因网络问题无法下载kube-flannel.yml文件到本地,则可以在本地创建文件,并复制粘贴以下内容到文件中。

---
kind: Namespace
apiVersion: v1
metadata:name: kube-flannellabels:k8s-app: flannelpod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: flannelname: flannel
rules:
- apiGroups:- ""resources:- podsverbs:- get
- apiGroups:- ""resources:- nodesverbs:- get- list- watch
- apiGroups:- ""resources:- nodes/statusverbs:- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: flannelname: flannel
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannel
subjects:
- kind: ServiceAccountname: flannelnamespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-app: flannelname: flannelnamespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:name: kube-flannel-cfgnamespace: kube-flannellabels:tier: nodek8s-app: flannelapp: flannel
data:cni-conf.json: |{"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]}net-conf.json: |{"Network": "10.244.0.0/16","EnableNFTables": false,"Backend": {"Type": "vxlan"}}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-dsnamespace: kube-flannellabels:tier: nodeapp: flannelk8s-app: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linuxhostNetwork: truepriorityClassName: system-node-criticaltolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cni-pluginimage: docker.io/flannel/flannel-cni-plugin:v1.6.0-flannel1command:- cpargs:- -f- /flannel- /opt/cni/bin/flannelvolumeMounts:- name: cni-pluginmountPath: /opt/cni/bin- name: install-cniimage: docker.io/flannel/flannel:v0.26.2command:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: docker.io/flannel/flannel:v0.26.2command:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN", "NET_RAW"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: EVENT_QUEUE_DEPTHvalue: "5000"volumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/- name: xtables-lockmountPath: /run/xtables.lockvolumes:- name: runhostPath:path: /run/flannel- name: cni-pluginhostPath:path: /opt/cni/bin- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg- name: xtables-lockhostPath:path: /run/xtables.locktype: FileOrCreate
  1. 上传
kubectl apply -f kube-flannel.yml

  1. 查看k8s集群节点信息,

注意:集群节点的状态必须都为Ready才算成功,如果存在某节点状态还是显示NotReady则多等几分钟重试。

kubectl get nodes

  1. 查看所有命名空间运行的Pod详细信息
kubectl get pod -A -o wide

若存在某些Pod的STATUS不为Running状态,则通过以下命令查找对应Pod的报错信息,其中NAME和NAMESPACE对应图中的列表项。

kubectl describe po NAME  -n NAMESPACE

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

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

相关文章

中台建设为什么需要领域驱动设计

一、数字化转型 数字化转型是企业能力全面体系化,系统化,数据化提升的过程,这种提升包括了技术能力,业务能力,组织架构合理性等多方面的提升。而随着多年来海量高频业务的发展,技术也在推动着持续进步,并且越来越多的技术方案趋向成熟,类似于阿里巴巴,腾讯,美团等,…

某小程序sign关键字逆向分析

声明 本文章所有内容仅用于学习交流,严禁用于其他目的。文中不提供完整代码,抓包内容、敏感网址及数据接口等均已脱敏处理。严禁将相关内容用于商业用途和非法用途,否则由此产生的一切后果与作者无关。未经许可,禁止转载本文,禁止修改后二次传播。擅自使用本文讲解的技术导…

乌鸡国

1-队伍进入副本以后,走到下图分岔点离队,每人负责一条线路,寻找树妖。2-寻找仙人,可以按照1的策略继续反方向走回去找仙人。3-寻找完仙人以后,会要求帮助国王清理荆棘木,五个号散开清理完即可。 4-进入皇宫,击杀拘灵妖怪、缚仙妖怪、囚神妖怪,需要在12回合内击杀三个妖…

梦幻神器-起-泪痕碗之念-2星

1-该任务需要5个随机指定三级药、7个2级家具,其中2级家具可以提前准备,三级药为NPC随机指定,无法提前准备。 2-前面跟着流程跑,第一场战斗是"清风",需要先击杀小怪,主怪清风在第四回合以后会说"我们放水吧",说了以后才可以击杀主怪清风。3-击杀清风…

STM32F103 SPI配置(SSD1306)

有关SPI通信协议我们在《通信协议-SPI》已经进行了详细的介绍,因此这一节不再重复介绍。 一、软件/硬件SPI 想要控制STM32产生SPI方式的通讯,可以采用软件模拟或硬件SPI这两种方式。 1.1 软件模拟 所谓软件模拟,即直接使用CPU内核按照SPI协议的要求控制GPIO输出高低电平。 1…

梦幻神器-起-莫愁铃之恩-1星

1-该任务需要提前准备5个三级药,金创药、佛光舍利子除外。 2-第一场战斗是击败地府守卫弟子,1星难度不大,注意"诡蝠之刑"的反伤即可,中了"诡蝠之刑"的单位可以适当防御。3-击杀地府守卫弟子以后跟着流程走,接下来需要给三个水晶注入灵气,需要先注入中…

我家一次用电超负荷时20A保险丝断了,但16A的空气开关却没有跳闸.

回答一: 转载自:https://zhidao.baidu.com/question/1970736314255432140.html这说明两者的保护时限不同。无论是保险丝还是空气开关,并不电流达到就立即跳,而且有一定的时间延时来积累热量,热量到了才会动作。 16A的空气开关没跳说明电流虽然超过20A,但时间很快,保险丝…

Easysearch Java SDK 2.0.x 使用指南(二)

在 上一篇文章 中,我们介绍了 Easysearch Java SDK 2.0.x 的基本使用和批量操作。本文将深入探讨索引管理相关的功能,包括索引的创建、删除、开关、刷新、滚动等操作,以及新版 SDK 提供的同步和异步两种调用方式。 SDK 的对象构建有两种方式 1. 传统的 Builder 方式 最基础的…

《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结

《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结@目录二、高级篇(大厂进阶)2.DockerFile解析2.1 是什么2.2 DockerFile构建过程解析2.3 DockerFile常用保留字指令2.4案例2.4.1自定义镜像mycento…

按钮修改状态

首先创造函数void updateBaoxiaoSchedule( int id, String schedule, String schedulereason); 及其实现。 SQL语句: @Update("update submit set state=#{state},statereason=#{statereason} where id=#{id} ") void updateSubmit1( @Param("id") int id…

泰山派设备控制(RGB)

泰山派设备系统控制(RGB) 1、进入设备系统 cd /sys/class2、进入RGB灯子系统 cd /sys/class/leds/罗列可操作的设备,可以看到三个设备,“rgb-led-b”,“rgb-led-g”,“rgb-led-r”,分别对应RGB的蓝,绿,红。3、我们对其单一色灯进行操作 cd rgb-led-b4、ls罗列出可操作的…