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

概述

文章将带领大家搭建一个 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.gpgTypes: 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.gpgTypes: 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: networkdethernets:enp0s5:dhcp4: noaddresses:- 10.211.55.7/24routes:- to: defaultvia: 10.211.55.1nameservers: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.yamlapiVersion: operator.tigera.io/v1
kind: Installation
metadata:name: default
spec:# Configures Calico networking.calicoNetwork:ipPools:- name: default-ipv4-ippoolblockSize: 26# 这里需要和上面初始化 k8s的配置参数 --pod-network-cidr=10.20.0.0/16cidr: 10.20.0.0/16encapsulation: VXLANCrossSubnetnatOutgoing: EnablednodeSelector: 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.mzph.cn/pingmian/75554.shtml

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

相关文章

深度学习数据集划分比例多少合适

在机器学习和深度学习中&#xff0c;测试集的划分比例需要根据数据量、任务类型和领域需求灵活调整。 1. 常规划分比例 通用场景 训练集 : 验证集 : 测试集 60% : 20% : 20% 适用于大多数中等规模数据集&#xff08;如数万到数十万样本&#xff09;&#xff0c;平衡了训练数…

【TS学习】(15)分布式条件特性

在 TypeScript 中&#xff0c;分布式条件类型&#xff08;Distributive Conditional Types&#xff09; 是一种特殊的行为&#xff0c;发生在条件类型作用于裸类型参数&#xff08;Naked Type Parameter&#xff09; 时。这种特性使得条件类型可以“分布”到联合类型的每个成员…

NSSCTF [HGAME 2023 week1]simple_shellcode

3488.[HGAME 2023 week1]simple_shellcode 手写read函数shellcode和orw [HGAME 2023 week1]simple_shellcode (1) motalymotaly-VMware-Virtual-Platform:~/桌面$ file vuln vuln: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpret…

PostgreSQL的扩展(extensions)-常用的扩展-pg_dirtyread

PostgreSQL的扩展&#xff08;extensions&#xff09;-常用的扩展-pg_dirtyread pg_dirtyread 是 PostgreSQL 的一个特殊扩展&#xff0c;它允许读取已被删除但尚未被 VACUUM 清理的数据行&#xff0c;是数据恢复的重要工具。 原理&#xff1a; pg_dirtyread 通过直接访问表的…

linux3 mkdir rmdir rm cp touch ls -d /*/

Linux 系统的初始目录结构遵循 FHS&#xff08;Filesystem Hierarchy Standard&#xff0c;文件系统层次标准&#xff09;&#xff0c;定义了每个目录的核心功能和存储内容。以下是 Linux 系统初始安装后的主要目录及其作用&#xff1a; 1. 核心系统目录 目录用途典型内容示例…

Bazel中的Symbol, Rule, Macro, Target, Provider, Aspect 等概念

学习Bazel &#xff0c;就要学习Bazel 的规则定义&#xff0c; 弄清各个概念是重要的一个步骤。 在 Bazel 规则定义中&#xff0c;Symbol、Rule 和 Macro 是常见的概念。除此之外&#xff0c;Bazel 还有 Target、Provider、Aspect Repository、Package、 Workspace、 Configura…

深入探究 Hive 中的 MAP 类型:特点、创建与应用

摘要 在大数据处理领域,Hive 作为一个基于 Hadoop 的数据仓库基础设施,提供了方便的数据存储和分析功能。Hive 中的 MAP 类型是一种强大的数据类型,它允许用户以键值对的形式存储和操作数据。本文将深入探讨 Hive 中 MAP 类型的特点,详细介绍如何创建含有 MAP 类型字段的表…

基于Java的区域化智慧养老系统(源码+lw+部署文档+讲解),源码可白嫖!

摘 要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;区域化智慧养老系统当然不能排除在外。区域化智慧养老系统是在实际应用和软件工程的开发原理之上&#xff0c;运用Java语言、JSP技术以及…

关于JVM和OS中的指令重排以及JIT优化

关于JVM和OS中的指令重排以及JIT优化 前言&#xff1a; 这东西应该很重要才对&#xff0c;可是大多数博客都是以讹传讹&#xff0c;全是错误&#xff0c;尤其是JVM会对字节码进行重排都出来了&#xff0c;明明自己测一测就出来的东西&#xff0c;写出来误人子弟… 研究了两天&…

VS2022远程调试Linux程序

一、 1、VS2022安装参考 VS Studio2022安装教程&#xff08;保姆级教程&#xff09;_visual studio 2022-CSDN博客 注意&#xff1a;勾选的时候&#xff0c;要勾选下方的选项&#xff0c;才能调试Linux环境下运行的程序&#xff01; 2、VS2022远程调试Linux程序测试 原文参…

WPF设计学习记录滴滴滴4

<Button x:Name"btn"Content"退出"Width" 100"Height"25"Click"btn_Click" IsDefault"True"/> <Button x:Name"btn" <!-- 控件标识&#xff1a;定义按钮的实例名称为"btn&…

JVM 有哪些垃圾回收器

垃圾收集算法 标记-复制算法(Copying): 将可用内存按容量划分为两个区域,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面, 然后再把已使用过的内存空间一次清理掉。 标记-清除算法(Mark-Sweep): 算法分为“标记” 和“清除”两个…

React DndKit 实现类似slack 类别、频道拖动调整位置功能

一周调试终于实现了类 slack 类别、频道拖动调整位置功能。 历经四个版本迭代。 实现了类似slack 类别、频道拖动调整功能 从vue->react &#xff1b;更喜欢React的生态及编程风格&#xff0c;新项目用React来重构了。 1.zustand全局状态 2.DndKit 拖动 功能视频&…

新浪财经股票每天10点自动爬取

老规矩还是先分好三步&#xff0c;获取数据&#xff0c;解析数据&#xff0c;存储数据 因为股票是实时的&#xff0c;所以要加个cookie值&#xff0c;最好分线程或者爬取数据时等待爬取&#xff0c;不然会封ip 废话不多数&#xff0c;直接上代码 import matplotlib import r…

使用Android 原生LocationManager获取经纬度

一、常用方案 1、使用LocationManager GPS和网络定位 缺点&#xff1a;个别设备,室内或者地下停车场获取不到gps定位,故需要和网络定位相结合使用 2、使用Google Play服务 这种方案需要Android手机中有安装谷歌服务,然后导入谷歌的第三方库&#xff1a; 例如&#xff1a;i…

验证码实现

验证码案例 学了Spring MVC &#xff0c;配置 相关章节&#xff0c; 现可以尝试写一个前后端交互的验证码 文章目录 验证码案例前言一、验证码是什么&#xff1f;二、需求1.引入依赖2.导入前端页面3.约定前后段交互接口 三、代码解析Controllermodelapplication.xml 四丶结果五…

查询当前用户的购物车和清空购物车

业务需求&#xff1a; 在小程序用户端购物车页面能查到当前用户的所有菜品或者套餐 代码实现 controller层 GetMapping("/list")public Result<List<ShoppingCart>> list(){List<ShoppingCart> list shoppingCartService.shopShoppingCart();r…

(多看) CExercise_05_1函数_1.2计算base的exponent次幂

题目&#xff1a; 键盘录入两个整数&#xff1a;底(base)和幂指数(exponent)&#xff0c;计算base的exponent次幂&#xff0c;并打印输出对应的结果。&#xff08;注意底和幂指数都可能是负数&#xff09; 提示&#xff1a;求幂运算时&#xff0c;基础的思路就是先无脑把指数转…

【nacos安装指南】

Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos GitHub的Release下载…