Ubuntu20.04 搭建Kubernetes 1.28版本集群
笔记哥 /
05-12 /
26点赞 /
0评论 /
101阅读
# 环境依赖
以下操作,无特殊说明,**所有节点都需要执行**
- **安装 ssh 服务**
>
> 1. 安装 `openssh-server`
>
>
>
>
> ```shell
> sudo apt-get install openssh-server
> ```
>
> 1. 修改配置文件
>
>
>
>
> ```shell
> vim /etc/ssh/sshd_config
> ```
>
>
> 找到配置项
>
>
>
> ```text
> LoginGraceTime 120
> PermitRootLogin prohibit-password
> StrictModes yes
> ```
>
>
> 把 `prohibit-password` 改为 `yes`,如下:
>
>
>
> ```shell
> LoginGraceTime 120
> PermitRootLogin yes
> StrictModes yes
> ```
>
- 设置节点,`ssh` 到其他节点免密
```bash
ssh-keygen -t rsa
```
这将生成一个 `RSA` 密钥对。默认情况下,这些文件会存储在`~/.ssh/`目录下,分别是`id_rsa`(私钥)和`id_rsa.pub`(公钥)。按提示操作,或者直接按回车键接受默认设置。如果已经存在密钥对,可以跳过此步。
**复制公钥到远程主机**:使用 `ssh-copy-id` 命令来将你的公钥添加到远程主机的`~/.ssh/authorized_keys`文件中。
```bash
ssh-copy-id user@remote_host
```
- **设置主机名,保证每个节点名称都不相同**
```shell
hostnamectl set-hostname xxx
```
- **同步节点时间**
>
> 1. 安装 ntpdate
>
>
>
>
> ```shell
> sudo apt-get -y install ntpdate
> ```
>
> 1. 配置 crontab,添加定时任务
>
>
>
>
> ```shell
> crontab -e
>
> 0 */1 * * * ntpdate time1.aliyun.com
> ```
>
## 关闭防火墙
```bash
systemctl stop firewalld && systemctl disable firewalld
or
ufw disable
```
## iptables 配置
为了让 `Kubernetes` 能够检查、转发网络流量,需要修改 `iptables` 的配置,并启用 `br_netfilter`模块。
```bash
cat <
>
> 为什么要关闭 swap 交换分区?
>
> Swap 交换分区,如果机器内存不够,会使用 swap 分区,但是 swap 分区的性能较低,k8s 设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm 初始化的时候会检测 swap 是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装k8s 的时候可以指定 --ignore-preflight-errors=Swap 来解决。
>
# 集群规划
每台上都安装 `docker-ce`、`docker-ce-cli`、`cri-docker`,使用 `cri-docker` 作为容器运行时,和 `kubelet` 交互。
所有节点都安装 `kubelet`、`kubeadm`、`kubectl` 软件包,都启动 `kubelet.service` 服务。
## 配置 `docker` 和 `k8s` 的 `APT`源
[k8s APT源新版配置方法](https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.41a11b11qLEVmy)
(比如需要安装 1.29 版本,则需要将如下配置中的 v1.28 替换成 v1.29)
```bash
apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/Release.key |
gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/ /" |
tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
```
旧版 kubernetes 源只更新到 1.28 部分版本,不过 docker 源部分可以用
```bash
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
sudo add-apt-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"
apt update
```
在 Ubuntu 系统中,可以通过以下两个位置查看源列表:
`/etc/apt/sources.list` 文件:这是主要的源列表文件。你可以使用文本编辑器(如 `vi` 或 `nano`)以管理员权限打开该文件,查看其中列出的软件源。
`/etc/apt/sources.list.d/` 目录:该目录包含额外的源列表文件。这些文件通常以 `.list` 扩展名结尾,并包含单独的软件源配置。
```bash
apt-cache madison kubelet # 命令来列出可用的 kubelet 软件包版本。检查是否存在版本号为 '1.28.2-00' 的软件包。
/etc/apt/sources.list # apt软件系统源
```
## 安装docker
```bash
apt install docker-ce docker-ce-cli
```
使用 `apt` 可以查看安装的 `docker` 两个软件。
```bash
apt list --installed | grep -i -E 'docker'
```
## 启动 `docker` 相关服务
`ubuntu`上的 `dub` 安装后,如果有服务,会被自动设置为开机自启动,且装完就会拉起,这里给出验证。
```bash
systemctl list-unit-files | grep -E 'docker'
```
两个服务都应是 `running` 状态
```bash
systemctl status docker.service
systemctl status docker.socket
```
配置 `docker` 容器引擎使用 `systemd` 作为 `CGroup` 的驱动
`vim /etc/docker/daemon.json`
```bash
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
```
```csharp
sudo systemctl enable docker # 配置Docker为开机自启动
sudo systemctl daemon-reload # 重新加载服务的配置文件
sudo systemctl restart docker # 重启Docker
```
## 配置cri-docker
https://github.com/Mirantis/cri-dockerd/releases
选择好适合自己的 `docker` 版本,进行安装
```bash
sudo apt-get install ./cri-dockerd-.deb
or
dpkg -i cri-dockerd-.deb
```
验证 `cri-dockerd` 是否已安装并正在运行:
```bash
systemctl status cri-docker
```
### 修改 cri-docker 配置文件
```csharp
vim /usr/lib/systemd/system/cri-docker-service
```
修改第11行,增加 `--network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9`
```bash
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
```
然后重载配置,设置开机自启,检查组件状态
```bash
systemctl daemon-reload && systemctl enable cri-docker.socket && systemctl status cri-docker.socket cri-docker docker
```
# 安装Kubernetes
安装 `Kubernetes` ,以下需要在所有节点上进行。
列出可用的 kubelet 软件包版本。检查是否存在版本号为 `1.28.2-00` 的软件包。
```bash
apt-cache madison kubelet
```
执行安装
```bash
apt install kubelet kubeadm kubectl
# 如果需要指定安装1.28.2这个版本,则可以这样:
apt install kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00
```
配置 `kubelet`为开机自启动
```csharp
systemctl enable kubelet.service
```
## 版本锁定
锁定这三个软件的版本,避免意外升级导致版本错误。
```bash
sudo apt-mark hold kubeadm kubelet kubectl
```
## 下载 Kubernetes 组件镜像
可以通过下面的命令看到 `kubeadm` 默认配置的 `kubernetes` 镜像,是外网的镜像
```lua
kubeadm config images list
```
这里使用阿里的 `kubernetes` 镜像源,下载镜像
```bash
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.2 --cri-socket unix:///var/run/cri-dockerd.sock
```
配置 `kubelet` 指定运行时
```bash
vim /etc/sysconfig/kubelet
```
提示:如果没有 `sysconfig` 目录,请先创建,然后再创建 `kubelet` 文件;这一步就是告诉`kubelet cri-dockerd` 的接口在哪里;该配置不是必须的,我们也可以在初始化集群时在 `kubeadm` 命令上使用 `--cri-socket unix:///run/cri-dockerd.sock`选项来告诉 `kubelet cri-dockerd` 的`socket` 文件路径。
## `kubeadm` 初始化
```bash
kubeadm init \
--apiserver-advertise-address=<自己本机的公网IP> \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock
```
配置环境变量
```bash
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
```
# 使用 Calico 网络插件
`master` 节点初始化后,可以使用 `kubectl get node` 来检查 `kubernetes` 集群节点状态,当前 `master` 节点的状态为 `NotReady`,这是由于缺少网络插件,集群的内部网络还没有正常运作。
```bash
kubectl create -f https://calico-v3-25.netlify.app/archive/v3.25/manifests/calico.yaml
```
`Calico` 使用的镜像较大,如果安装超时,可以考虑在每个节点上预先使用 `docker pull` 拉取镜像。
# 其他节点加入集群
主节点在初始化结束后,已经创建了临时 `token`,但该临时 `token` 只有24小时有效期。
也可以重新在节点创建永久有效的 `token`
```bash
kubeadm token create --print-join-command
```
`worker` 节点加入
```bash
kubeadm join :6443 --token oyl72q.dth6p8kwi7fopsd6 \--discovery-token-ca-cert-hash sha256:b31bb54c63a550d287c89ddd0094e27ca680a6c3386a8630a75445de3c4d6e43 \
--cri-socket=unix:///var/run/cri-dockerd.sock
```
# Nvidia 驱动安装
下载驱动:https://developer.nvidia.com/cuda-downloads
根据选项,选择好自己的系统配置
执行 CUDA Toolkit Installer,给出的安装命令
最后再执行 Driver Install,给出的命令,驱动安装成功
# helm安装
使用脚本进行安装
```bash
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
```
# Nvidia vGPU 安装
**添加 chart 仓库**
```bash
helm repo add hami-charts https://project-hami.github.io/HAMi/
```
**根据 Kubernetes 版本,指定 imageTag**
```bash
helm install hami hami-charts/hami --set scheduler.kubeScheduler.imageTag=v1.16.8 -n kube-system
```
**验证安装**
```bash
kubectl get pods -n kube-system
```
**给节点打标签**
通过添加标签 "gpu=on" 来为调度 HAMi 标记 GPU 节点
**vGPU 设备配置**
编辑 ConfigMap,更改后,重启相关的 HAMi 组件以应用更新的配置。
```bash
kubectl edit configmap hami-scheduler-device -n
```
**ConfigMap 中的配置**
- `nvidia.deviceMemoryScaling:` 浮点类型,默认值:1。NVIDIA 设备内存缩放比例,可以大于 1(启用虚拟设备内存,实验性功能)。对于具有 *M* 内存的 NVIDIA GPU,如果我们将 `nvidia.deviceMemoryScaling` 参数设置为 *S*,则通过此 GPU 分割的 vGPU 在 Kubernetes 中将总共获得 `S * M` 内存。
- `nvidia.deviceSplitCount:` 整数类型,默认值:10。分配给单个 GPU 设备的最大任务数。
- `nvidia.migstrategy:` 字符串类型,"none" 表示忽略 MIG 功能,"mixed" 表示通过独立资源分配 MIG 设备。默认值为 "none"。
- `nvidia.disablecorelimit:` 字符串类型,"true" 表示禁用核心限制,"false" 表示启用核心限制,默认值:false。
- `nvidia.defaultMem:` 整数类型,默认值:0。当前任务的默认设备内存,以 MB 为单位。'0' 表示使用 100% 设备内存。
- `nvidia.defaultCores:` 整数类型,默认值:0。为当前任务保留的 GPU 核心百分比。如果分配为 0,则可能适合任何具有足够设备内存的 GPU。如果分配为 100,则将独占使用整个 GPU 卡。
- `nvidia.defaultGPUNum:` 整数类型,默认值:1,如果配置值为 0,则配置值将不生效并被过滤。当用户未在 pod 资源中设置 nvidia.com/gpu 这个键时,webhook 应检查 nvidia.com/gpumem、resource-mem-percentage、nvidia.com/gpucores 这三个键,任意一个键有值,webhook 应将 nvidia.com/gpu 键和此默认值添加到资源限制映射中。
- `nvidia.resourceCountName:` 字符串类型,vgpu 数量资源名称,默认值:"nvidia.com/gpu"。
- `nvidia.resourceMemoryName:` 字符串类型,vgpu 内存大小资源名称,默认值:"nvidia.com/gpumem"。
- `nvidia.resourceMemoryPercentageName:` 字符串类型,vgpu 内存比例资源名称,默认值:"nvidia.com/gpumem-percentage"。
- `nvidia.resourceCoreName:` 字符串类型,vgpu 核心资源名称,默认值:"nvidia.com/cores"。
- `nvidia.resourcePriorityName:` 字符串类型,vgpu 任务优先级名称,默认值:"nvidia.com/priority"。
本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/3284
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利