554 lines
17 KiB
Markdown
554 lines
17 KiB
Markdown
# 本地部署K8s集群(一键部署)
|
||
|
||
[TOC]
|
||
|
||
## 准备 Linux 主机
|
||
|
||
### 系统要求
|
||
|
||
| **Ubuntu** *16.04,18.04,20.04* | CPU:2 核,内存:4 G,硬盘:40 G |
|
||
| ------------------------------------------------------------ | -------------------------------- |
|
||
| **Debian** *Buster,Stretch* | CPU:2 核,内存:4 G,硬盘:40 G |
|
||
| **CentOS** *7*.x | CPU:2 核,内存:4 G,硬盘:40 G |
|
||
| **Red Hat Enterprise Linux** *7* | CPU:2 核,内存:4 G,硬盘:40 G |
|
||
| **SUSE Linux Enterprise Server** *15* **/openSUSE Leap** *15.2* | CPU:2 核,内存:4 G,硬盘:40 G |
|
||
|
||
- CPU 必须为 x86_64,暂时不支持 Arm 架构的 CPU。
|
||
- 系统应该为纯净镜像不包含其他服务
|
||
|
||
### 节点要求
|
||
|
||
- 所有节点必须都能通过 `SSH` 访问。
|
||
- 所有节点时间同步。
|
||
- 所有节点都应使用 `sudo`/`curl`/`openssl`/`tar`。
|
||
|
||
### 容器要求(可以不安装容器)
|
||
|
||
| 支持的容器运行时 | 版本 |
|
||
| :---------------------------- | :------ |
|
||
| Docker | 19.3.8+ |
|
||
| containerd | 最新版 |
|
||
| CRI-O(试验版,未经充分测试) | 最新版 |
|
||
| iSula(试验版,未经充分测试) | 最新版 |
|
||
|
||
### 依赖项要求
|
||
|
||
| 依赖项 | Kubernetes 版本 ≥ 1.18 | Kubernetes 版本 < 1.18 |
|
||
| :---------- | :--------------------- | :--------------------- |
|
||
| `socat` | 必须 | 可选,但建议安装 |
|
||
| `conntrack` | 必须 | 可选,但建议安装 |
|
||
| `ebtables` | 可选,但建议安装 | 可选,但建议安装 |
|
||
| `ipset` | 可选,但建议安装 | 可选,但建议安装 |
|
||
|
||
### 网络和 DNS 要求
|
||
|
||
- 请确保 `/etc/resolv.conf` 中的 DNS 地址可用,否则,可能会导致集群中的 DNS 出现问题。
|
||
- 网络配置使用防火墙规则或安全组,请务必确保基础设施组件可以通过特定端口相互通信。建议您关闭防火墙。
|
||
|
||
### 演示机器准备
|
||
|
||
| 主机 IP | 主机名 | 角色 | 配置 |
|
||
| :-------------- | :----- | :------------------ | -------------------------------- |
|
||
| 192.168.188.138 | master | control plane, etcd | CPU:4 核,内存:8 G,硬盘:40 G |
|
||
| 192.168.188.143 | node1 | worker | CPU:4 核,内存:8 G,硬盘:40 G |
|
||
| 192.168.188.144 | node2 | worker | CPU:4 核,内存:8 G,硬盘:40 G |
|
||
|
||
## 初始化系统环境
|
||
|
||
所有服务器均需执行
|
||
|
||
### 更新yum源
|
||
|
||
```shell
|
||
yum -y update
|
||
```
|
||
|
||
### 配置主机名
|
||
|
||
```shell
|
||
#查看主机名称
|
||
hostname
|
||
#更改名称 hostnamectl --static set-hostname 服务器名称
|
||
hostnamectl --static set-hostname master
|
||
#查看主机名称核验
|
||
hostnamectl status
|
||
#可以重启一下服务器
|
||
#reboot
|
||
```
|
||
|
||
### 关闭防火墙
|
||
|
||
```shell
|
||
systemctl disable firewalld
|
||
systemctl stop firewalld
|
||
```
|
||
|
||
### 打开端口转发
|
||
|
||
```shell
|
||
firewall-cmd --add-masquerade --permanent # 端口转发
|
||
firewall-cmd --reload
|
||
firewall-cmd --list-all
|
||
firewall-cmd --list-all --zone=trusted
|
||
```
|
||
|
||
### 开放全部端口
|
||
|
||
```shell
|
||
firewall-cmd --zone=public --add-port=1-65535/udp --permanent
|
||
firewall-cmd --zone=public --add-port=1-65535/tcp --permanent
|
||
firewall-cmd --reload
|
||
```
|
||
|
||
### 禁用 SELinux
|
||
|
||
```shell
|
||
# 使用 sed 修改配置文件,实现彻底的禁用
|
||
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
|
||
|
||
# 使用命令,实现临时禁用,这一步其实不做也行,KubeKey 会自动配置
|
||
setenforce 0
|
||
```
|
||
|
||
### 关闭swap分区
|
||
|
||
```shell
|
||
swapoff -a
|
||
echo "vm.swappiness=0" >> /etc/sysctl.conf
|
||
sysctl -p /etc/sysctl.conf
|
||
```
|
||
|
||
### 配置epel源(国内服务器)
|
||
|
||
```
|
||
rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
|
||
```
|
||
|
||
### 配置服务器时区
|
||
|
||
```shell
|
||
#配置服务器时区为 Asia/Shanghai
|
||
timedatectl set-timezone Asia/Shanghai
|
||
#验证
|
||
timedatectl
|
||
```
|
||
|
||
### 配置时间同步
|
||
|
||
```shell
|
||
#安装 chrony 作为时间同步软件
|
||
yum install chrony -y
|
||
```
|
||
|
||
```shell
|
||
#修改配置文件 /etc/chrony.conf,修改 ntp 服务器配置。
|
||
vi /etc/chrony.conf
|
||
|
||
# 删除所有的 server 配置
|
||
# server 0.centos.pool.ntp.org iburst
|
||
# server 1.centos.pool.ntp.org iburst
|
||
# server 2.centos.pool.ntp.org iburst
|
||
# server 3.centos.pool.ntp.org iburst
|
||
|
||
# 增加国内的 ntp 服务器,或是指定其他常用的时间服务器
|
||
pool cn.pool.ntp.org iburst
|
||
```
|
||
|
||
```shell
|
||
#重启并设置 chrony 服务开机自启动。
|
||
systemctl enable chronyd --now
|
||
```
|
||
|
||
```shell
|
||
#验证 chrony 同步状态。
|
||
chronyc sourcestats -v
|
||
```
|
||
|
||
```shell
|
||
# 正常的输出结果如下
|
||
[root@master ~]# chronyc sourcestats -v
|
||
210 Number of sources = 4
|
||
.- Number of sample points in measurement set.
|
||
/ .- Number of residual runs with same sign.
|
||
| / .- Length of measurement set (time).
|
||
| | / .- Est. clock freq error (ppm).
|
||
| | | / .- Est. error in freq.
|
||
| | | | / .- Est. offset.
|
||
| | | | | | On the -.
|
||
| | | | | | samples. \
|
||
| | | | | | |
|
||
Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev
|
||
==============================================================================
|
||
tock.ntp.infomaniak.ch 41 22 297m -0.227 0.504 -12ms 4011us
|
||
makaki.miuku.net 26 10 312m -0.014 0.497 +27ms 4083us
|
||
electrode.felixc.at 22 15 241m -0.399 1.350 -49ms 6966us
|
||
ntp5.flashdance.cx 38 14 315m +0.363 0.600 +27ms 4865us
|
||
关闭系统防火墙
|
||
```
|
||
|
||
### 安装依赖组件
|
||
|
||
```shell
|
||
yum install -y ebtables socat ipset conntrack
|
||
```
|
||
|
||
### 配置基于 SSH 密钥的身份验证(可选)
|
||
|
||
仅需在`master` 主节点运行
|
||
|
||
```shell
|
||
#使用 ssh-keygen 命令生成一个新的 SSH 密钥对,一直按回车直到生密钥对
|
||
ssh-keygen -t ed25519
|
||
```
|
||
|
||
```shell
|
||
#将 SSH 公钥从 master 节点发送到其他节点。命令执行时输入 yes,以接受服务器的 SSH 指纹,然后在出现提示时输入 root 用户的密码。
|
||
ssh-copy-id root@192.168.188.143
|
||
ssh-copy-id root@192.168.188.144
|
||
```
|
||
|
||
```shell
|
||
#验证登录
|
||
ssh root@192.168.188.143
|
||
ssh root@192.168.188.144
|
||
```
|
||
|
||
```shell
|
||
#输出结果如下
|
||
[root@master ~]# ssh root@192.168.188.143
|
||
Last login: Tue Oct 24 00:29:36 2023 from 192.168.188.138
|
||
[root@node1 ~]#
|
||
```
|
||
|
||
### 升级 CentOS7 内核(可选)
|
||
|
||
仅需主`master` 主节点运行
|
||
|
||
CentOS 7.9 的默认内核版本为 **3.10.0-1160.102.1**,与其他操作系统内核版本动辄 5.x、6.x 相比
|
||
|
||
### 查看当前系统内核版本
|
||
|
||
```shell
|
||
uname -r
|
||
|
||
# 3.10.0-1160.102.1.el7.x86_64
|
||
```
|
||
|
||
### 查询当前系统与 Kernel 相关的软件包
|
||
|
||
```shell
|
||
#查询当前系统安装了哪些跟 Kernel 有关的软件包,升级内核的时候,一定要把已安装的相关 kernel 包一起升级。
|
||
rpm -qa | grep kernel
|
||
|
||
#kernel-3.10.0-1160.102.1.el7.x86_64
|
||
#kernel-tools-3.10.0-1160.102.1.el7.x86_64
|
||
#kernel-tools-libs-3.10.0-1160.102.1.el7.x86_64
|
||
```
|
||
|
||
### 增加 ELRepo 软件源
|
||
|
||
```shell
|
||
#导入 RPM GPG public key
|
||
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
|
||
|
||
#安装 ELRepo
|
||
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
|
||
```
|
||
|
||
### 查询可用的内核软件包
|
||
|
||
```shell
|
||
#启用新增加的 ELRepo 软件仓库,查询可用的内核软件包。
|
||
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
|
||
```
|
||
|
||
```shell
|
||
[root@master ~]# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
|
||
已加载插件:fastestmirror
|
||
Loading mirror speeds from cached hostfile
|
||
* elrepo-kernel: mirrors.tuna.tsinghua.edu.cn
|
||
可安装的软件包
|
||
kernel-lt-devel.x86_64 5.4.258-1.el7.elrepo elrepo-kernelkernel-lt-doc.noarch 5.4.258-1.el7.elrepo elrepo-kernelkernel-lt-headers.x86_64 5.4.258-1.el7.elrepo elrepo-kernelkernel-lt-tools-libs-devel.x86_64 5.4.258-1.el7.elrepo elrepo-kernelkernel-ml.x86_64 6.5.8-1.el7.elrepo elrepo-kernelkernel-ml-devel.x86_64 6.5.8-1.el7.elrepo elrepo-kernelkernel-ml-doc.noarch 6.5.8-1.el7.elrepo elrepo-kernelkernel-ml-headers.x86_64 6.5.8-1.el7.elrepo elrepo-kernelkernel-ml-tools.x86_64 6.5.8-1.el7.elrepo elrepo-kernelkernel-ml-tools-libs.x86_64 6.5.8-1.el7.elrepo elrepo-kernelkernel-ml-tools-libs-devel.x86_64 6.5.8-1.el7.elrepo elrepo-kernelperf.x86_64 5.4.258-1.el7.elrepo elrepo-kernelpython-perf.x86_64 5.4.258-1.el7.elrepo elrepo-kernel[root@master ~]#
|
||
#当前最新 lt 版内核为 5.4.258-1 a信用最新版本内核
|
||
```
|
||
|
||
### 安装新版本内核
|
||
|
||
```shell
|
||
#只安装内核,同时安装其他包会报错
|
||
yum --enablerepo=elrepo-kernel install kernel-lt
|
||
|
||
#安装成功会提示
|
||
#Complete!
|
||
```
|
||
|
||
|
||
|
||
### 配置新内核引导系统
|
||
|
||
```shell
|
||
#查看已经安装的 kernel 信息
|
||
grubby --info=ALL | grep ^kernel
|
||
|
||
#kernel=/boot/vmlinuz-5.4.258-1.el7.elrepo.x86_64
|
||
#kernel=/boot/vmlinuz-3.10.0-1160.102.1.el7.x86_64
|
||
#kernel=/boot/vmlinuz-3.10.0-1062.el7.x86_64
|
||
#kernel=/boot/vmlinuz-0-rescue-fc61eb831f5b4eda852bfd7c596c8c87
|
||
```
|
||
|
||
```shell
|
||
#查看当前系统默认内核
|
||
grubby --default-kernel
|
||
|
||
#/boot/vmlinuz-3.10.0-1160.102.1.el7.x86_64
|
||
```
|
||
|
||
```shell
|
||
#修改系统默认内核为新内核
|
||
grubby --set-default "/boot/vmlinuz-5.4.258-1.el7.elrepo.x86_64"
|
||
```
|
||
|
||
```shell
|
||
#查看系统默认内核
|
||
grubby --default-kernel
|
||
/boot/vmlinuz-5.4.258-1.el7.elrepo.x86_64
|
||
```
|
||
|
||
```shell
|
||
#重启
|
||
reboot
|
||
```
|
||
|
||
进入引导画面后选中最新的内核默认启动
|
||
|
||
![image-20231024093226585](https://lsky.hhdxw.top/imghub/2023/10/image-202310241698111147.png)
|
||
|
||
### 重启系统并查看系统内核
|
||
|
||
```shell
|
||
#查看内核版本信息
|
||
uname -rs
|
||
#Linux 5.4.258-1.el7.elrepo.x86_64
|
||
```
|
||
|
||
```shell
|
||
#查看已经安装的内核相关软件
|
||
rpm -qa | grep kernel
|
||
#kernel-lt-5.4.258-1.el7.elrepo.x86_64
|
||
#kernel-lt-tools-3.10.0-1160.102.1.el7.elrepo.x86_64
|
||
#kernel-3.10.0-1160.102.1.el7.x86_64
|
||
#kernel-3.10.0-1062.el7.x86_64
|
||
#kernel-lt-tools-libs-3.10.0-1160.102.1.el7.elrepo.x86_64
|
||
```
|
||
|
||
```shell
|
||
# 卸载旧版本的 kernel-tools 相关软件包
|
||
yum remove kernel-tools-3.10.0-1160.102.1.el7.x86_64 kernel-tools-libs-3.10.0-1160.102.1.el7.x86_64
|
||
|
||
# 安装新版本的 kernel-tools 相关软件包
|
||
yum --enablerepo=elrepo-kernel install kernel-lt-tools kernel-lt-tools-libs
|
||
```
|
||
|
||
## 下载 KubeKey
|
||
|
||
下面只需要 `master` 主节点运行即可
|
||
|
||
先执行以下命令以确保您从正确的区域下载 KubeKey。
|
||
|
||
```shell
|
||
export KKZONE=cn
|
||
```
|
||
|
||
执行以下命令下载 KubeKey:
|
||
|
||
```shell
|
||
curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.7 sh -
|
||
```
|
||
|
||
为 `kk` 添加可执行权限:
|
||
|
||
```shell
|
||
chmod +x kk
|
||
```
|
||
|
||
## 创建集群
|
||
|
||
### 查看 KubeKey 支持的 Kubernetes 版本列表
|
||
|
||
```shell
|
||
./kk version --show-supported-k8s
|
||
```
|
||
|
||
### 创建配置文件
|
||
|
||
命令如下:
|
||
|
||
```shell
|
||
./kk create config [--with-kubernetes version] [--with-kubesphere version] [(-f | --file) path]
|
||
```
|
||
|
||
- 安装 KubeSphere 3.3 的建议 Kubernetes 版本:v1.20.x、v1.21.x、* v1.22.x、* v1.23.x 和 * v1.24.x。带星号的版本可能出现边缘节点部分功能不可用的情况。因此,如需使用边缘节点,推荐安装 v1.21.x。如果不指定 Kubernetes 版本,KubeKey 将默认安装 Kubernetes v1.23.10。
|
||
- 如果您在此步骤的命令中不添加标志 `--with-kubesphere`,则不会部署 KubeSphere,只能使用配置文件中的 `addons` 字段安装,或者在您后续使用 `./kk create cluster` 命令时再次添加这个标志。
|
||
- 如果您添加标志 `--with-kubesphere` 时不指定 KubeSphere 版本,则会安装最新版本的 KubeSphere。
|
||
|
||
示例:(默认K8s版本1.23.10,KubeSphere3.3.2)
|
||
|
||
```shell
|
||
./kk create config --with-kubesphere 3.3.2
|
||
```
|
||
|
||
### 编辑配置文件
|
||
|
||
如果不改名称,那么将创建默认文件 `config-sample.yaml`。
|
||
|
||
```shell
|
||
vi config-sample.yaml
|
||
```
|
||
|
||
### 主机
|
||
|
||
请参照上方示例在 `hosts` 下列出您的所有机器并添加详细信息。
|
||
|
||
`name`:实例的主机名。
|
||
|
||
`address`:任务机和其他实例通过 SSH 相互连接所使用的 IP 地址。根据您的环境,可以是公有 IP 地址或私有 IP 地址。例如,一些云平台为每个实例提供一个公有 IP 地址,用于通过 SSH 访问。在这种情况下,您可以在该字段填入这个公有 IP 地址。
|
||
|
||
`internalAddress`:实例的私有 IP 地址。
|
||
|
||
### roleGroups
|
||
|
||
- `etcd`:etcd 节点名称
|
||
- `control-plane`:主节点名称
|
||
- `worker`:工作节点名称
|
||
|
||
### 提示
|
||
|
||
- 在安装 KubeSphere 之前,您可以使用 `hosts` 下提供的信息(例如 IP 地址和密码)通过 SSH 的方式测试任务机和其他实例之间的网络连接。
|
||
|
||
- 在安装前,请确保端口 `6443` 没有被其他服务占用,否则在安装时会产生冲突(`6443` 为 API 服务器的默认端口)。
|
||
|
||
### 示例:
|
||
|
||
```yml
|
||
|
||
apiVersion: kubekey.kubesphere.io/v1alpha2
|
||
kind: Cluster
|
||
metadata:
|
||
name: sample
|
||
spec:
|
||
hosts:
|
||
- {name: master, address: 192.168.188.138, internalAddress: 192.168.188.138, user: root, password: root}
|
||
#上面配置ssh密钥对以后可以使用秘钥直接访问,如没有配置,请使用下面注释内容通过远程访问
|
||
- {name: node1, address: 192.168.188.143, internalAddress: 192.168.188.143, privateKeyPath: "~/.ssh/id_ed25519"}
|
||
- {name: node2, address: 192.168.188.144, internalAddress: 192.168.188.144, privateKeyPath: "~/.ssh/id_ed25519"}
|
||
#- {name: node1, address: 192.168.188.143, internalAddress: 192.168.188.143, user: root, password: root}
|
||
#- {name: node2, address: 192.168.188.144, internalAddress: 192.168.188.144, user: root, password: root}
|
||
roleGroups:
|
||
etcd:
|
||
- master
|
||
control-plane:
|
||
- master
|
||
worker:
|
||
- node1
|
||
- node2
|
||
```
|
||
|
||
### 使用配置文件创建集群
|
||
|
||
```shell
|
||
./kk create cluster -f config-sample.yaml
|
||
```
|
||
|
||
如果使用其他名称,则需要将上面的 `config-sample.yaml` 更改为您自己的文件。
|
||
|
||
整个安装过程可能需要 10 到 20 分钟,具体取决于您的计算机和网络环境。
|
||
|
||
### 验证安装
|
||
|
||
安装完成后,您会看到如下内容:
|
||
|
||
```shell
|
||
#####################################################
|
||
### Welcome to KubeSphere! ###
|
||
#####################################################
|
||
|
||
Console: http://192.168.188.138:30880
|
||
Account: admin
|
||
Password: P@88w0rd
|
||
NOTES:
|
||
1. After you log into the console, please check the
|
||
monitoring status of service components in
|
||
"Cluster Management". If any service is not
|
||
ready, please wait patiently until all components
|
||
are up and running.
|
||
2. Please change the default password after login.
|
||
|
||
#####################################################
|
||
https://kubesphere.io 2023-10-24 00:37:49
|
||
#####################################################
|
||
```
|
||
|
||
## 安装插件
|
||
|
||
### devops
|
||
|
||
以 `admin` 用户登录控制台,点击左上角的**平台管理**,选择**集群管理**。
|
||
|
||
点击**定制资源定义**,在搜索栏中输入 `clusterconfiguration`,点击搜索结果查看其详细页面。
|
||
|
||
定制资源定义(CRD)允许用户在不新增 API 服务器的情况下创建一种新的资源类型,用户可以像使用其他 Kubernetes 原生对象一样使用这些定制资源。
|
||
|
||
在**自定义资源**中,点击 `ks-installer` 右侧的更多,选择**编辑 YAML**。
|
||
|
||
在该 YAML 文件中,搜索 `devops`,将 `enabled` 的 `false` 改为 `true`。完成后,点击右下角的**确定**,保存配置。
|
||
|
||
```
|
||
devops:
|
||
enabled: true # 将“false”更改为“true”。
|
||
```
|
||
|
||
添加`minio`版本,在spec下面添加下面四个地址
|
||
|
||
```shell
|
||
spec:
|
||
minio_repo: docker.io.minio/minio
|
||
minio_tag: RELEASE.2021-12-29T06-49-06Z
|
||
mc_repo: docker.io.minio/mc
|
||
mac_tag: RELEASE.2021-12-29T06-52-55Z
|
||
```
|
||
|
||
在 kubectl 中执行以下命令检查安装过程:
|
||
|
||
```
|
||
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f
|
||
```
|
||
|
||
## 卸载插件
|
||
|
||
### devops
|
||
|
||
卸载 DevOps:
|
||
|
||
```
|
||
helm uninstall -n kubesphere-devops-system devops
|
||
kubectl patch -n kubesphere-system cc ks-installer --type=json -p='[{"op": "remove", "path": "/status/devops"}]'
|
||
kubectl patch -n kubesphere-system cc ks-installer --type=json -p='[{"op": "replace", "path": "/spec/devops/enabled", "value": false}]'
|
||
```
|
||
|
||
删除 DevOps 资源:
|
||
|
||
```
|
||
# 删除所有 DevOps 相关资源
|
||
for devops_crd in $(kubectl get crd -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' | grep "devops.kubesphere.io"); do
|
||
for ns in $(kubectl get ns -ojsonpath='{.items..metadata.name}'); do
|
||
for devops_res in $(kubectl get $devops_crd -n $ns -oname); do
|
||
kubectl patch $devops_res -n $ns -p '{"metadata":{"finalizers":[]}}' --type=merge
|
||
done
|
||
done
|
||
done
|
||
# 删除所有 DevOps CRD
|
||
kubectl get crd -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' | grep "devops.kubesphere.io" | xargs -I crd_name kubectl delete crd crd_name
|
||
# 删除 DevOps 命名空间
|
||
kubectl delete namespace kubesphere-devops-system
|
||
```
|