当前位置: 首页 > news >正文

k8s集群部署:安装 kubeadm

1、确保已经将 SELinux 设置为permissive模式:

这些说明适用于 Kubernetes 1.31。

# Set SELinux in permissive mode (effectively disabling it)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

2、下载并安装相关软件包

sudo yum install -y yum-utils// 在可联网环境将相关包下载到本地,后续可以在无网络环境进行安装,如果无法找到对应包,
// 请转到10章节,配置官方镜像库
sudo yumdownloader kubelet-1.31.0 kubeadm-1.31.0 kubectl-1.31.0 --disableexcludes=kubernetes// 下载依赖项
yumdownloader kubernetes-cni cri-tools --disableexcludes=kubernetes// 安装依赖项
sudo yum localinstall -y kubernetes-cni-1.5.0-150500.2.1.aarch64.rpm cri-tools-1.31.1-150500.1.1.aarch64.rpm// 安装 kubelet、kubeadm、kubectl
sudo yum localinstall -y kubelet-1.31.0-150500.1.1.aarch64.rpm kubeadm-1.31.0-150500.1.1.aarch64.rpm kubectl-1.31.0-150500.1.1.aarch64.rpm// 启动
sudo systemctl enable kubelet && sudo systemctl start kubelet// 验证
kubelet --version 
kubeadm version 
kubectl version --client

3、使用 Kubeadm 初始化 Kubernetes

接下来,你可以使用 kubeadm 来初始化 Kubernetes 集群。记得替换命令中的参数以适应你的环境:

sudo kubeadm config print init-defaults > kubeadm-init.yaml

修改kubeadm配置文件:该文件需要修改的地方:将advertiseAddress: 1.2.3.4修改为当前服务器IP地址,比如使用10.211.55.3作为master,就修改advertiseAddress: 10.211.55.3。将imageRepository: k8s.gcr.io修改为imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers将networking: podSubnet:分配Pod分配的子网网断,定义Pod的IP地址范围。

apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-token  # 为 Kubeadm 引导节点设置默认组token: abcdef.0123456789abcdef  # 设定的引导 token,用于节点加入集群ttl: 24h0m0s  # token 的有效期为 24 小时usages:- signing  # 用于签名- authentication  # 用于身份验证
kind: InitConfiguration  # 初始化配置的种类
localAPIEndpoint:advertiseAddress: 10.211.55.51  # 本地API的广告地址,通常是 master 节点的IP地址bindPort: 6443  # 本地API的绑定端口,默认为 6443
nodeRegistration:criSocket: unix:///var/run/cri-dockerd.sock  # 指定使用 cri-dockerd 作为容器运行时imagePullPolicy: IfNotPresent  # 镜像拉取策略,若本地无镜像则拉取imagePullSerial: true  # 指定镜像拉取是否串行name: kmaster  # 设置节点的主机名taints: null  # 清除节点上的污点,允许任何 Pod 调度到此节点上
timeouts:controlPlaneComponentHealthCheck: 4m0s  # 控制面组件健康检查的超时时间discovery: 5m0s  # 发现节点的超时时间etcdAPICall: 2m0s  # etcd API 调用超时kubeletHealthCheck: 4m0s  # kubelet 健康检查超时时间kubernetesAPICall: 1m0s  # Kubernetes API 调用超时tlsBootstrap: 5m0s  # TLS 引导超时时间upgradeManifests: 5m0s  # 升级清单处理超时时间
---
apiServer: {}  # Kube API Server 的相关配置
apiVersion: kubeadm.k8s.io/v1beta4
caCertificateValidityPeriod: 87600h0m0s  # CA 证书的有效期(大约10年)
certificateValidityPeriod: 8760h0m0s  # 其他证书的有效期(大约1年)
certificatesDir: /etc/kubernetes/pki  # 证书存储目录
clusterName: kubernetes  # 集群名称
controllerManager: {}  # 控制器管理器相关配置
dns: {}  # DNS 配置
encryptionAlgorithm: RSA-2048  # 证书加密算法,使用 RSA 2048位
etcd:local:dataDir: /var/lib/etcd  # etcd 数据存储路径
imageRepository: registry.k8s.io  # Kubernetes 镜像仓库地址
kind: ClusterConfiguration  # 集群配置的种类
kubernetesVersion: 1.31.0  # Kubernetes 版本
networking:dnsDomain: cluster.local  # 集群的 DNS 域名serviceSubnet: 10.96.0.0/12  # Service 子网范围podSubnet: 10.244.0.0/16  # Pod 网络范围(新增的配置)
proxy: {}  # 代理相关配置
scheduler: {}  # 调度器相关配置

执行初始化kubeadm配置文件

sudo kubeadm init --config kubeadm-init.yaml
// 如果初始化卡住4分钟处,则
sudo vi /usr/lib/systemd/system/kubelet.service
// 修改以下内容
ExecStart=/usr/local/bin/kubelet --container-runtime-endpoint=unix:///run/cri-dockerd.sock
// 并确保文件里的内容是否如下
sudo vim /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --hostname-override=node --pod-infra-container-image=registry.k8s.io/pause:3.10"

3.1 如果报错:

[kubelet] Creating a ConfigMap "kubelet-config" in namespace kube-system with the configuration for the kubelets in the cluster error execution phase upload-config/kubelet: Error writing Crisocket information for the control-plane node: nodes "kmaster" not found To see the stack trace of this error execute with --v=5 or high// 则进行以下操作
sudo kubeadm reset -f --cri-socket /var/run/cri-dockerd.sock
sudo systemctl stop kubelet 
sudo rm -rf /etc/cni/net.d 
sudo rm -rf /var/lib/kubelet/* 
sudo rm -rf /var/lib/etcd 
sudo systemctl start kubelet 
sudo kubeadm init --config kubeadm-init.yaml

3.2 如果报错:

[kubernetes@Kubernetes02 ~]$ sudo kubeadm join 10.211.55.43:6443 --token lbik51.q7ti5ekg4un7x8a1 --discovery-token-ca-cert-hash sha256:85bc771d5cc7b8406673dfc6e4e0cef00bd6d5de199454fd9c2314e4ae262e9a [preflight] Running pre-flight checks [WARNING Swap]: swap is supported for cgroup v2 only. The kubelet must be properly configured to use swap. Please refer to https://kubernetes.io/docs/concepts/architecture/nodes/#swap-memory, or disable swap on the node [WARNING FileExisting-crictl]: crictl not found in system path [WARNING FileExisting-socat]: socat not found in system path error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR FileExisting-conntrack]: conntrack not found in system path [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

则,安装 conntrack-tools 和socat

sudo yum install -y epel-release
sudo yumdownloader --resolve conntrack-tools
sudo yum localinstall conntrack-tools-*.rpm
sudo yumdownloader --resolve socat
sudo yum localinstall socat-*.rpm

并安装crictl:
1、首先,解压 crictl 的压缩包。你可以使用 tar 命令:

tar -xvf crictl-v1.31.1-linux-arm64.tar

这会解压出包含 crictl 可执行文件的目录。
2、移动 crictl 到系统路径
解压后,通常会得到一个 crictl 可执行文件。将其移动到系统的 PATH 目录中,例如 /usr/local/bin:

sudo mv crictl /usr/local/bin/

3、检查安装
确认 crictl 已正确安装并在 PATH 中。你可以使用 which 命令来检查:

which crictl

应该会显示 /usr/local/bin/crictl 的路径。
4、设置权限
确保 crictl 可执行文件有执行权限:

sudo chmod +x /usr/local/bin/crictl

5、验证安装
验证 crictl 是否能正常工作:

crictl --version

这应该会输出 crictl 的版本信息。

3.3 如果init的过程中报错,再次init的时候出现如下情况:

[init] Using Kubernetes version: v1.31.0
[preflight] Running pre-flight checks[WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly
error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists[ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists[ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists[ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists[ERROR Port-10250]: Port 10250 is in use
[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

则进行以下操作:

sudo kubeadm reset
sudo rm -rf /etc/kubernetes
sudo rm -rf /var/lib/etcd

4、从节点加入主节点

主节点init后,会出现以下信息

Your Kubernetes control-plane has initialized successfully!To start using your cluster, 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/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 10.211.55.56:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:3a45611fc0a8bca7940837c5868e05fd1923b3c561776d1b111b65212993a8d0 

使用以下命令加入集群

sudo kubeadm join 10.211.55.56:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:3a45611fc0a8bca7940837c5868e05fd1923b3c561776d1b111b65212993a8d0 \--cri-socket unix:///var/run/cri-dockerd.sock

5、配置 kubectl

初始化完成后,按照输出的提示配置 kubectl:

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

6、部署网络插件

安装 Flannel 网络插件(或者其他你选择的网络插件):

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

或安装Calico网络插件
查看calico和Kubernetes versions对应关系https://docs.tigera.io/calico/3.26/getting-started/kubernetes/requirements
获取配置:

wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/calico.yaml

编辑calico.yaml,增加- name: IP_AUTODETECTION_METHOD,修改CALICO_IPV4POOL_IPIP的VALUE为"Never"
配置Calico网络段,将- name: CALICO_IPV4POOL_CIDR配置 value: “10.211.55.0/24”

# Cluster type to identify the deployment type
- name: CLUSTER_TYPEvalue: "k8s,bgp"  # 指定集群类型为 Kubernetes 并启用 BGP(边界网关协议)# IP automatic detection
- name: IP_AUTODETECTION_METHODvalue: "interface=en.*"  # 自动检测网络接口,使用匹配 en.* 的网卡,如 en0、en1# Auto-detect the BGP IP address.
- name: IPvalue: "autodetect"  # 自动检测 BGP IP 地址# Enable IPIP
- name: CALICO_IPV4POOL_IPIPvalue: "Never"  # 禁用 IPIP 隧道模式(只启用 BGP)# Configure Calico subnet
# The default IPv4 pool to create on startup if none exists. Pod IPs will be
# chosen from this range. Changing this value after installation will have
# no effect. This should fall within `--cluster-cidr`.
- name: CALICO_IPV4POOL_CIDRvalue: "10.211.55.0/24"  # 配置 Calico 的 IPv4 地址池,Pod 的 IP 将从该范围内分配

修改完后应用calico.yaml配置

7、补充

yum仓库镜像设置

# 国内镜像配置(国内建议配置)
sudo tee /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64
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#配置完成后,你可以使用以下命令来清理YUM缓存并生成新的缓存:
sudo yum clean all 
sudo yum makecache# 官网镜像配置
sudo tee /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

专栏目录:
1、k8s集群部署:环境准备
2、k8s集群部署:容器运行时
3、k8s集群部署:安装 kubeadm

本文参考:http://www.weifos.com/Home/TechStack/1807017272963891200

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 助力新能源汽车产业发展,2025第五届广州国际新能源汽车产业智能制造技术展览会将于11月在广州召开
  • 告别页面卡顿:Web Worker 助你解决前端性能瓶颈
  • linux进程间通信——进程间通信概念、最基本通信——管道文件
  • 基于微信小程序点餐、外卖系统的设计与实现 (源码+lw+参考文档+核心代码讲解等)
  • MacOS wine中文乱码问题
  • 负载均衡调度器--LVS
  • qt怎么格式化字符串?
  • 音视频入门基础:WAV专题(11)——FFmpeg源码中计算WAV音频文件每个packet的pts_time、dts_time的实现
  • 【开发工具】Maven Dependency Helper:IntelliJ IDEA的贴心助手,助力梳理依赖关系
  • Numba最近邻插值(CPU+ GPU + Z轴切块 + XYZ轴切块 + 多线程)
  • 论文解读:《LAMM: Label Alignment for Multi-Modal Prompt Learning》
  • 使用FFmpeg实现简单的拉流、推流、视频解码Demo
  • CoreDownload - WordPress文章下载增强插件v1.0.6
  • C++代码片段
  • 【Redis】redis5种数据类型(哈希)
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【技术性】Search知识
  • 230. Kth Smallest Element in a BST
  • Akka系列(七):Actor持久化之Akka persistence
  • Apache Spark Streaming 使用实例
  • C# 免费离线人脸识别 2.0 Demo
  • codis proxy处理流程
  • egg(89)--egg之redis的发布和订阅
  • emacs初体验
  • JavaScript设计模式与开发实践系列之策略模式
  • js算法-归并排序(merge_sort)
  • Leetcode 27 Remove Element
  • Linux Process Manage
  • linux学习笔记
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Quartz初级教程
  • Shadow DOM 内部构造及如何构建独立组件
  • spring security oauth2 password授权模式
  • 创建一种深思熟虑的文化
  • 基于 Babel 的 npm 包最小化设置
  • 面试遇到的一些题
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 我从编程教室毕业
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 硬币翻转问题,区间操作
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 【干货分享】dos命令大全
  • 整理一些计算机基础知识!
  • #控制台大学课堂点名问题_课堂随机点名
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (学习总结16)C++模版2
  • (一)RocketMQ初步认识
  • (一)UDP基本编程步骤
  • (译) 函数式 JS #1:简介
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)