Note/环境/K8s/本地部署K8s集群(一键部署).md

559 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 本地部署K8s集群(一键部署)
[TOC]
## 准备 Linux 主机
### 系统要求
| **Ubuntu** *16.0418.0420.04* | CPU2 核内存4 G硬盘40 G |
| ------------------------------------------------------------ | -------------------------------- |
| **Debian** *BusterStretch* | CPU2 核内存4 G硬盘40 G |
| **CentOS** *7*.x | CPU2 核内存4 G硬盘40 G |
| **Red Hat Enterprise Linux** *7* | CPU2 核内存4 G硬盘40 G |
| **SUSE Linux Enterprise Server** *15* **/openSUSE Leap** *15.2* | CPU2 核内存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 | CPU4 内存8 G硬盘40 G |
| 192.168.188.143 | node1 | worker | CPU4 内存8 G硬盘40 G |
| 192.168.188.144 | node2 | worker | CPU4 内存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
ntpdate time.windows.com
```
```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.x6.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.268-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.xv1.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.10KubeSphere3.3.2
```shell
./kk create config --with-kubesphere 3.3.2
```
### 编辑配置文件
如果不改名称那么将创建默认文件 `config-sample.yaml`
```shell
vim 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
```