k8s进阶之路:本地集群环境搭建

news2025/4/8 17:45:54

概述

文章将带领大家搭建一个 master 节点,两个 node 节点的 k8s 集群,容器基于 docker,k8s 版本 v1.32。

一、系统安装

安装之前请大家使用虚拟机将 ubuntu24.04 系统安装完毕,我是基于 mac m1 的系统进行安装的,所以下载的时候 arm64 的系统镜像,另外还需要注意,机器的内存和磁盘需要有一定的限制,最低 2 核 CPU,内存最低 4G,配置不够 k8s 主节点初始化的时候会报错,无法初始化成功的。

上面准备好之后,我们先初始化系统,为安装 k8s 做准备。

配置好之后我们就启动虚拟机开始安装 Ubuntu24.04系统了!启动之后再这个页面直接回车就可以;启动之后再这个页面直接回车就可以。

直接就进去了选择语言的步骤,选择英语直接回车就可以了;接下来就是选择键盘的设置,直接 Done 上回车,进入下一步;接着我们选择最小安装模式,后选择 Done 上回车,进入下一步。

接下来是配置网络、配置代理服务、配置源和配置guied 布局,直接 Done 回车,下一步,这里我们不配置。接着是分区配置,这里我们也不动,直接 Done 下一步,接着会弹窗选择 continue就可以了。

接下来就是配置服务器名称和用户名密码了,这里需要注意下 servers name这个位置,这里的值是后面会用到,还是和上面一样 Done 下一步就可以。

接着会让选择 Ubuntu Pro,选择 Skip for now,选择 Continue 就可以了。

接着会提示安装 OpenSSH,选择安装,选择 Done 下一步。

接着会让和我们选择安装那些软件,这里也不选择,直接 Done下一步。

这里就会开始正式安装系统了,等待一会儿安装成功,成功之后会出现 Reboot Now 的选择,选择重新启动(第一次重启需要一点时间,耐心等待就可以)。

重启的时候会出现下面这个步骤,我们直接回车就可以了。

到此系统就安装成功了。

二、系统初始化

首先需要修改 ubuntu24.04 的源,先备份下系统默认源,然后更新下系统。

# 备份下
sudo mv /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
# 修改国内源
sudo tee /etc/apt/sources.list.d/ubuntu.sources <<EOF
Types: deb
URIs: http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/
Suites: noble noble-updates noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: http://mirrors.ustc.edu.cn/ubuntu-ports/
Suites: noble noble-updates noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: http://mirrors.aliyun.com/ubuntu-ports/
Suites: noble noble-updates noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF
# 更新系统
sudo apt update && sudo apt upgrade
# 接着安装一些必要的软件
sudo apt install vim telnet curl net-tools inetutils-ping

接着配置网络,设置静态 IP 地址

# 清空文件内容
sudo truncate -s 0 /etc/netplan/50-cloud-init.yaml
# 配置网络
sudo tee /etc/netplan/50-cloud-init.yaml <<EOF
network:
  renderer: networkd
  ethernets:
    enp0s5:
      dhcp4: no
      addresses:
        - 10.211.55.7/24
      routes:
        - to: default
          via: 10.211.55.1
      nameservers:
        addresses: [114.114.114.114,8.8.8.8]        
  version: 2
EOF
# 配置生效
sudo netplan apply

禁用交换内存

# 临时关闭
sudo swapoff -a 
# 永久关闭
sudo systemctl mask swap.img.swap

加载内核模块,并设置 IP 转发的内核参数

# 加载内核模块
sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
# 配置IP转发
sudo tee /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
# 配置生效
sudo sysctl -p /etc/sysctl.d/k8s.conf

安装网络优化工具

# 安装ipset和ipvsadm
sudo apt install ipset ipvsadm
# 配置 ipvsadm 模块加载,在 modules-load.d 中添加配置文件
sudo tee /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
# 创建加载模块脚本文件
sudo tee /root/ipvs.sh <<EOF
#!/bin/sh
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
# 执行脚本,让其生效
sudo bash /root/ipvs.sh
# 查看是否生效
sudo lsmod | grep ip_vs

时间同步

# 安装 ntpdate 和 cron 两个软件
sudo apt install -y ntpdate cron
# 设置时区
sudo timedatectl set-timezone Asia/Shanghai
# 使用 ntpdate 进行时间同步
sudo ntpdate time1.aliyun.com
# 通过计划任务实现时间同步
echo "0 0 * * * ntpdate time1.aliyun.com" | sudo tee -a $(crontab -l | grep -q 'ntpdate time1.aliyun.com' || crontab -l) | sudo crontab -

最后添加主机 hosts 文件,提前配置下另外两台的 host

# 先去掉127.0.0.1 k8s-master这行
sudo sed -i '/^127\.0\.1\.1[[:space:]]\+k8s-master$/d' /etc/hosts
# 在/etc/hosts文件末尾追加
sudo tee -a /etc/hosts << EOF
10.211.55.7 k8s-master
10.211.55.8 k8s-node1
10.211.55.9 k8s-node2
EOF

三、安装 docker 和 cri-dockerd

docker 可以通过安装包直接解压安装:https://download.docker.com/linux/static/stable/aarch64/,安装步骤如下:

# 下载安装包
wget https://download.docker.com/linux/static/stable/aarch64/docker-28.0.4.tgz
# 解压安装
tar -zxvf docker-28.0.4.tgz
sudo chown root:root docker/*
sudo cp docker/* /usr/bin

# 配置 service 文件
sudo tee /usr/lib/systemd/system/docker.service <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
EOF

# 添加配置文件
sudo mkdir /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ],
  "exec-opts": [
    "native.cgroupdriver=systemd"
  ],
  "insecure-registries": ["10.211.55.10:8082"],
  "max-concurrent-downloads": 10,
  "live-restore": true,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "storage-driver": "overlay2"
}
EOF

# 重载配置,启动 docker
sudo systemctl daemon-reload
sudo systemctl enable docker
sudo systemctl start docker
# 创建用户组
sudo groupadd docker
sudo chgrp docker /var/run/docker.sock
sudo gpasswd -a long docker
sudo systemctl restart docker

上面执行完成之后,需要退出当前终端,重新进入,docker 命令才会生效;接着安装 cri-docker,地址:https://github.com/Mirantis/cri-dockerd/releases,下载之后解压安装,步骤如下:

# 下载安装包
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.17/cri-dockerd-0.3.17.arm64.tgz

# 解压安装
tar -zxvf cri-dockerd-0.3.17.arm64.tgz
sudo chown root:root cri-dockerd/cri-dockerd
sudo cp cri-dockerd/cri-dockerd /usr/bin

# 添加配置文件
sudo tee /lib/systemd/system/cri-docker.service <<EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket

[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://  --pod-infra-container-image registry.aliyuncs.com/google_containers/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target
EOF

# 添加socket文件
sudo tee /lib/systemd/system/cri-docker.socket <<EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service

[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target
EOF

# 启动
sudo systemctl daemon-reload
sudo systemctl enable cri-docker.service
sudo systemctl enable --now cri-docker.socket
sudo systemctl start cri-docker

四、安装 k8s 软件

接下来我们需要安装k8s的三件套: kubeadmkubeletkubectl。首先安装一些基础软件:

# 安装基础软件
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# 下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 接下来需要添加 kubernetes 的 apt 仓库
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 更新 apt 包索引,安装kubelet、kubeadm 和 kubectl,并锁定其版本
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本

配置kubelet

sudo mkdir /etc/sysconfig
# 文件内容
sudo tee /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd --container-runtime=remote --container-runtime-endpoint=/var/run/cri-dockerd.sock"
EOF
# 开机自启
sudo systemctl enable kubelet

五、配置 k8s 集群

上面我们已经把需要准备的工作都做完了,将主机关闭,创建快照,克隆三台主机,然后进行简单的修改就可以初始化我们的 k8s 集群了。

这样克隆三台之后,启动克隆的主机,进入系统之后修改网络配置:

  • k8s-master:10.211.55.7
  • k8s-node1:10.211.55.8
  • k8s-node2:10.211.55.9

修改完之后执行:sudo netplan apply,让配置生效。接着修改克隆后主机的名称:

# 在10.211.55.8的主机上执行
sudo hostnamectl set-hostname k8s-node1

# 在10.211.55.9的主机上执行
sudo hostnamectl set-hostname k8s-node2

这样我们就可以开始初始化,k8s-master 节点了。

# 查看需要的镜像列表
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
# 提前拉去镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
# 初始化主节点
sudo kubeadm init \
    --image-repository=registry.aliyuncs.com/google_containers \
    --kubernetes-version=v1.32.3 \
    --pod-network-cidr=10.20.0.0/16 \
    --service-cidr=10.50.0.0/12 \
    --cri-socket=/var/run/cri-dockerd.sock

等待执行成功,出现下面的输出,显示说明主节点已经初始化成功,按照提示执行下面的命令就可以了。

如果在这个过程遇到初始化失败,可以执行kubeadm reset 重置

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,可以看到已经初始化好的主节点。

接着我们按照提示初始化工作节点。

sudo kubeadm join 10.211.55.7:6443 --token 356ws4.sq5ic626obrlxczw \
        --discovery-token-ca-cert-hash sha256:3f872b98a5ef9bbbaaf779e2985637ae3a8a062ef1979c10a6d15cf03064685f

在两台 node 节点上,执行成功之后,我们的集群就初始化成功。

此时再次执行 kubectl get nodes,就可以看到我们加入 node 节点了。

六、安装网络插件

从上面看到我们的三个节点的状态是:NotReady 状态(未就绪),此时我们还需要安装网络插件:calico,让集群就绪。

文档地址:https://docs.tigera.io/calico/3.27/getting-started/kubernetes/quickstart

这里我们使用 v3.29.3 的版本。先按照官方步骤安装tigera-operator.yaml:

# 下载配置文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.3/manifests/tigera-operator.yaml
kubectl create -f tigera-operator.yaml

接着安装 calico 的自定义资源配置,但是这里需要按照我们 k8s 的安装情况修改下配置:

wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.3/manifests/custom-resources.yaml

# 修改custom-resoures.yaml
vim custom-resoures.yaml

apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  # Configures Calico networking.
  calicoNetwork:
    ipPools:
    - name: default-ipv4-ippool
      blockSize: 26
      # 这里需要和上面初始化 k8s的配置参数 --pod-network-cidr=10.20.0.0/16
      cidr: 10.20.0.0/16
      encapsulation: VXLANCrossSubnet
      natOutgoing: Enabled
      nodeSelector: all()

---

# This section configures the Calico API server.
# For more information, see: https://docs.tigera.io/calico/latest/reference/installation/api#operator.tigera.io/v1.APIServer
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
  name: default
spec: {}

保存之后,执行:kubectl create -f custom-resoures.yaml

等待镜像下载完成。

watch kubectl get pods -n calico-system

出现如下就说明安装成功了。

此时在看集群状态就会变成就绪状态:

但是如果在执行 kubectl create -f custom-resoures.yaml大概率会出现镜像拉取失败的问题,此时就需要科学上网。

# 查看状态
kubectl get pods -n calico-system
# 查看某一个pod的执行日志
kubectl logs calico-node-8vdtl -n calico-system
# 查看pod的详情
kubectl describe pod calico-node-8vdtl -n calico-system

出现下面这种情况就是拉取镜像失败了,这是就需要下载指定版本的 calico 镜像了。

我们需要的是 v3.29.3 的版本


接下来就可以开始 k8s 的学习了!

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

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

相关文章

C++ STL 详解 ——list 的深度解析与实践指南

在 C 的标准模板库&#xff08;STL&#xff09;中&#xff0c;list作为一种重要的序列式容器&#xff0c;以其独特的双向链表结构和丰富的操作功能&#xff0c;在许多编程场景下发挥着关键作用。深入理解list的特性与使用方法&#xff0c;能帮助开发者编写出更高效、灵活的代码…

按键切换LCD显示后,显示总在第二阶段,而不在第一阶段的问题

这是一个密码锁的程序&#xff0c;当在输入密码后&#xff0c;原本是要重置密码&#xff0c;但是程序总是在输入密码正确后总是跳转置设置第二个密码&#xff0c;而第一个密码总是跳过。 不断修改后&#xff0c; 解决方法 将if语句换成switch语句&#xff0c;这样就可以分离程序…

护网蓝初面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

C++11: 智能指针

C11: 智能指针 &#xff08;一&#xff09;智能指针原理1.RAll2.智能指针 (二)C11 智能指针1. auto_ptr2. unique_ptr3. shared_ptr4. weak_ptr &#xff08;三&#xff09;shared_ptr中存在的问题std::shared_ptr的循环引用 &#xff08;四&#xff09;删除器&#xff08;五&a…

从零实现本地大模型RAG部署

1. RAG概念 RAG&#xff08;Retrieval-Augmented Generation&#xff09;即检索增强生成&#xff0c;是一种结合信息检索与大型语言模型&#xff08;大模型&#xff09;的技术。从外部知识库&#xff08;如文档、数据库或网页&#xff09;中实时检索相关信息&#xff0c;并将其…

【Linux系统篇】:探索文件系统原理--硬件磁盘、文件系统与链接的“三体宇宙”

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;Linux篇–CSDN博客 文章目录 一.认识硬件--磁盘物理存储结构1.存储介质类型2.物理存储单元3…

Tracing the thoughts of a large language model 简单理解

Tracing the thoughts of a large language model 这篇论文通过电路追踪方法(Circuit Tracing)揭示了大型语言模型Claude 3.5 Haiku的内部机制,其核心原理可归纳为以下几个方面: 1. 方法论核心:归因图与替换模型 替换模型(Replacement Model) 使用跨层转码器(CLT)将原…

OpenCV边缘检测技术详解:原理、实现与应用

概述 边缘检测是计算机视觉和图像处理中最基本也是最重要的技术之一&#xff0c;它通过检测图像中亮度或颜色急剧变化的区域来识别物体的边界。边缘通常对应着场景中物体的物理边界、表面方向的变化或深度不连续处。 分类 OpenCV提供了多种边缘检测算法&#xff0c;下面我们介…

BN 层做预测的时候, 方差均值怎么算

✅ 一、Batch Normalization&#xff08;BN&#xff09;回顾 BN 层在训练和推理阶段的行为是不一样的&#xff0c;核心区别就在于&#xff1a; 训练时用 mini-batch 里的均值方差&#xff0c;预测时用全局的“滑动平均”均值方差。 &#x1f9ea; 二、训练阶段&#xff08;Trai…

JS 其他事件类型

页面加载 事件 window.addEvent() window.addEventListener(load,function(){const btn document.querySelector(button)btn.addEventListener(click,function(){alert(按钮)})})也可以给其他标签加该事件 HTML加载事件 找html标签 也可以给页面直接赋值

AI Agent设计模式五:Orchestrator

概念 &#xff1a;中央任务调度中枢 ✅ 优点&#xff1a;全局资源协调&#xff0c;确保任务执行顺序❌ 缺点&#xff1a;单点故障风险&#xff0c;可能成为性能瓶颈 import operator import osfrom langchain.schema import SystemMessage, HumanMessage from langchain_opena…

MySQL基础 [三] - 数据类型

目录 数据类型分类 ​编辑 数值类型 tinyint bit 浮点类型 float decimal 字符串类型 char varchar varchar和char的比较和选择 日期和时间类型 enum和set enum类型 set类型 enum和set的类型查找 数据类型分类 数值类型 tinyint TINYINT[(M)] [UNSIGNED]是 …

不用训练,集成多个大模型产生更优秀的输出

论文标题 Collab: Controlled Decoding using Mixture of Agents for LLM Alignment 论文地址 https://arxiv.org/pdf/2503.21720 作者背景 JP摩根&#xff0c;马里兰大学帕克分校&#xff0c;普林斯顿大学 动机 大模型对齐&#xff08;alignment&#xff09;的主要目的…

随笔1 认识编译命令

1.认识编译命令 1.1 解释gcc编译命令: gcc test1.cpp -o test1 pkg-config --cflags --libs opencv 命令解析&#xff1a; gcc&#xff1a;GNU C/C 编译器&#xff0c;用于编译C/C代码。 test1.cpp&#xff1a;源代码文件。 -o test1&#xff1a;指定输出的可执行文件名为t…

Hyperlane 框架路由功能详解:静态与动态路由全掌握

Hyperlane 框架路由功能详解&#xff1a;静态与动态路由全掌握 Hyperlane 框架提供了强大而灵活的路由功能&#xff0c;支持静态路由和动态路由两种模式&#xff0c;让开发者能够轻松构建各种复杂的 Web 应用。本文将详细介绍这两种路由的使用方法。 静态路由&#xff1a;简单…

铰链损失函数 Hinge Loss和Keras 实现

一、说明 在为了了解 Keras 深度学习框架的来龙去脉&#xff0c;本文介绍铰链损失函数&#xff0c;然后使用 Keras 实现它们以进行练习并了解它们的行为方式。在这篇博客中&#xff0c;您将首先找到两个损失函数的简要介绍&#xff0c;以确保您在我们继续实现它们之前直观地理解…

瑞数信息发布《BOTS自动化威胁报告》,揭示AI时代网络安全新挑战

近日&#xff0c;瑞数信息正式发布《BOTS自动化威胁报告》&#xff0c;力求通过全景式观察和安全威胁的深度分析&#xff0c;为企业在AI时代下抵御自动化攻击提供安全防护策略&#xff0c;从而降低网络安全事件带来的影响&#xff0c;进一步增强业务韧性和可持续性。 威胁一&am…

FLV格式:流媒体视频的经典选择

FLV格式&#xff1a;流媒体视频的经典选择 FLV&#xff08;Flash Video&#xff09;格式曾经是流媒体视频的主力军&#xff0c;在互联网视频的早期时代广泛应用于视频网站和多媒体平台。凭借其高效的压缩和较小的文件体积&#xff0c;FLV成为了许多视频内容创作者和平台的首选…

需求分析-用例图绘制、流程图绘制

第一&#xff0c;引论 需求分析是开发的第一步&#xff0c;也是我个人认为最重要的一步。 技术难题的克服&#xff0c;甚至在我心里&#xff0c;还要排在需求分析后面。 如果需求分析做好了&#xff0c;数据库就更容易建立&#xff0c;数据库建好了&#xff0c;业务逻辑写起…

Windows安装 PHP 8 和mysql9,win下使用phpcustom安装php8.4.5和mysql9

百度搜索官网并下载phpcustom&#xff0c;然后启动环境&#xff0c;点击网站管理 里面就有php8最新版&#xff0c;可以点mysql设置切mysql9最新版&#xff0c;如果你用最新版无法使用&#xff0c;说明你的php程序不支持最新版的mysql MySQL 9.0 引入了一些新的 SQL 模式和语法变…