一、环境信息介绍
主机名
IP
root密码
规格
磁盘
操作系统
备注
ksp-deploy
172.25.253.106
cloud@123
4c8g
400g
Ubuntu 20.04.3 LTS-aarch64
联网,生成artifact等文件
node01
172.25.253.93
cloud@123
8c16g
400g
Ubuntu 20.04.3 LTS-aarch64
控制节点
node02
172.25.253.94
cloud@123
8c16g
400g
Ubuntu 20.04.3 LTS-aarch64
控制节点
node03
172.25.253.95
cloud@123
8c16g
400g
Ubuntu 20.04.3 LTS-aarch64
控制节点
node04
172.25.253.113
cloud@123
8c16g
400g
Ubuntu 20.04.3 LTS-aarch64
工作节点
node05
172.25.253.114
cloud@123
8c16g
400g
Ubuntu 20.04.3 LTS-aarch64
工作节点
环境涉及软件版本信息:
K8S节点操作系统:Ubuntu 20.04.3 LTS -aarch64
KubeSphere:v3.4.1
K8S:v1.23.17
Docker:24.0.6
KubeKey: v3.0.13
cni-plugins: v1.2.0
crictl: v1.24.0
etcd: v3.4.13
helm: v3.9.0
kubeadm、kubectl、kubelet: v1.23.17
KubeKey 使用
/var/lib/docker
作为默认路径来存储所有 Docker
相关文件(包括镜像)。建议添加附加存储卷(本文中未添加),分别给
/var/lib/docker
和 /mnt/registry
挂载至少
100G 。
本文假设联网的服务器ksp-deploy上相关基础操作如安装、配置docker等已经完成,未进行介绍说明。
二、离线安装介绍
KubeKey 从 v2.1.0 版开始新增了清单 (manifest) 和制品 (artifact)
的概念,为用户离线部署 KubeSphere 和 K8s
集群提供了一种简单便捷的解决方案。
manifest 是一个描述当前 Kubernetes 集群信息和定义 artifact
制品中需要包含哪些内容的文本文件。
使用 KubeKey,用户只需使用清单 manifest
文件来定义将要离线部署的集群环境需要的内容,再通过该 manifest 来导出制品
artifact 文件即可完成准备工作。离线部署时只需要 KubeKey 和 artifact
就可快速、简单的在环境中部署镜像仓库 Harbor 和 KubeSphere 以及 K8s
集群。
KubeKey 生成 manifest 文件有两种方式:
第一种方式的好处是可以根据 1:1
的运行集群构建离线集群,依赖于已有集群,灵活度不够,并不是所有人都具备这种条件。
但本文中涉及的是arm64构架服务器上搭建k8s1.23.17+ksp3.4.1环境,上述方法在amd64构架服务器上能成功,在此处不能成功(至少笔者自己未成功。其中笔者遇到失败之处就是不论是否使用harbor做镜像仓库,安装过程中都会尝试去下载harbor安装文件,但harbor官方并未提供arm64的安装文件,所以反复下载、反复失败)。所以笔者选择了逐步手动下载相关安装二进制文件、镜像与其他工具文件等,最后完成arm64构架服务器上k8s1.23.17+ksp3.4.1环境的安装部署。其中最关键的在于提前下载准备好离线安装k8s1.23.17+ksp3.4.1环境中用到Kubernetes二进制文件、Kubernetes与Kubesphere用到的镜像 ,其他的大致都是围绕此二者展开进行准备。
三、服务器的前置操作
建议所有服务器都要执行。
3.1 设置各服务器时区
1 timedatectl set-timezone Asia/Shanghai
3.2 设置各服务器主机名
1 2 hostnamectl set-hostname xxx# 然后退出终端并重新创建一个终端会话
3.3 设置主机与ip的映射信息
1 2 3 4 5 6 7 8 cat >> /etc/hosts <<EOF 172.25.253.106 ksp-deploy 172.25.253.93 node01 172.25.253.94 node02 172.25.253.95 node03 172.25.253.113 node04 172.25.253.114 node05 EOF
3.4 设置时间同步
最好以离线k8s环境的某个节点做时间同步的源服务器。本文为了简化操作,未执行。生产环境中建议执行。
四、离线部署资源制作
制作离线部署资源需要找一台能联通互联网的节点(本文中是ksp-deploy),本文为了资源的制作和离线部署验证,单独增加了一个能联网的
ksp-deploy 节点。
在该节点下载 KubeKey (下文简称 KK)v3.0.13 。具体 KK
版本号可以在 KubeKey
发行页面 查看。
4.1 下载 KubeKey
1 2 3 4 5 6 root@ksp-deploy:~# mkdir /root/kubekey root@ksp-deploy:~# cd /root/kubekey# 选择中文区下载(访问 GitHub 受限时使用) root@ksp-deploy:~/kubekey# export KKZONE=cn# 执行下载命令,获取指定版本的 kk(受限于网络可能会失败,可能需要执行多次) root@ksp-deploy:~/kubekey# curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.13 sh -
image-20241228172413417
1 2 3 4 root@ksp-deploy:~/kubekey# chown root:root kk# 查看kubekey3.0.13版本 root@ksp-deploy:~/kubekey# ./kk version kk version: &version.Info{Major:"3", Minor:"0", GitVersion:"v3.0.13-dirty", GitCommit:"ac75d3ef3c22e6a9d999dcea201234d6651b3e72", GitTreeState:"dirty", BuildDate:"2023-11-07T08:43:42Z", GoVersion:"go1.19.2", Compiler:"gc", Platform:"linux/arm64"}
4.2 准备安装镜像
在 Linux 上安装 KubeSphere 和 Kubernetes
时,需要准备所有必需镜像文件,并事先下载 Kubernetes 二进制文件。
1 2 # 执行下面的命令获取官方 releases v3.4.1 对应的 images-list root@ksp-deploy:~/kubekey# wget https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/images-list.txt
但上述文件不能直接使用(从官网上下载下来的这个文件应该只是x86平台上验证过的。这个文件中有些镜像并没有对应arm64版本镜像;此外,非全量安装时不是所有镜像都是需要的)。
经过修改后image-list.txt文件如下(已经经过验证)。
1 root@ksp-deploy:~/kubekey# cat images-list.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 # kubesphere/pause:3.6 kubesphere/kube-apiserver:v1.23.17 kubesphere/kube-controller-manager:v1.23.17 kubesphere/kube-scheduler:v1.23.17 kubesphere/kube-proxy:v1.23.17 coredns/coredns:1.8.6 kubesphere/k8s-dns-node-cache:1.15.12 calico/kube-controllers:v3.26.1 calico/cni:v3.26.1 calico/node:v3.26.1 calico/pod2daemon-flexvol:v3.26.1 openebs/provisioner-localpv:3.3.0 openebs/linux-utils:3.3.0# kubesphere/ks-installer:v3.4.1 kubesphere/ks-apiserver:v3.4.1 kubesphere/ks-console:v3.4.1 kubesphere/ks-controller-manager:v3.4.1 kubesphere/kubectl:v1.20.0 kubesphere/kubectl:v1.22.0 kubesphere/kubefed:v0.8.1 kubesphere/tower:v0.2.1 minio/minio:RELEASE.2024-08-17T01-24-54Z minio/mc:RELEASE.2024-08-17T11-33-50Z csiplugin/snapshot-controller:v4.0.0 kubesphere/nginx-ingress-controller:v1.3.1 mirrorgooglecontainers/defaultbackend-arm64:1.4 kubesphere/metrics-server:v0.4.2 redis:5.0.14-alpine haproxy:2.0.25-alpine haproxy:2.3 alpine:3.14 osixia/openldap:1.3.0 kubesphere/netshoot:v1.0# kubeedge/cloudcore:v1.13.0 kubesphere/iptables-manager:v1.13.0 kubesphere/edgeservice:v0.3.0# openpolicyagent/gatekeeper:v3.5.2# kubesphere/openpitrix-jobs:v3.3.2# kubesphere/devops-apiserver:ks-v3.4.1 kubesphere/devops-controller:ks-v3.4.1 kubesphere/devops-tools:ks-v3.4.1 kubesphere/ks-jenkins:v3.4.0-2.319.3-1 jenkins/inbound-agent:4.10-2 kubesphere/s2ioperator:v3.2.1 kubesphere/java-11-centos7:v3.2.0 kubesphere/java-8-centos7:v3.2.0 quay.io/argoproj/argocd:v2.3.3 quay.io/argoproj/argocd-applicationset:v0.4.1 ghcr.io/dexidp/dex:v2.30.2 redis:6.2.6-alpine# jimmidyson/configmap-reload:v0.7.1 prom/prometheus:v2.39.1 kubesphere/prometheus-config-reloader:v0.55.1 kubesphere/prometheus-operator:v0.55.1 kubesphere/kube-rbac-proxy:v0.11.0 kubesphere/kube-state-metrics:v2.6.0 prom/node-exporter:v1.3.1 prom/alertmanager:v0.23.0 thanosio/thanos:v0.31.0 grafana/grafana:8.3.3 kubesphere/kube-rbac-proxy:v0.11.0 kubesphere/notification-manager-operator:v2.3.0 kubesphere/notification-manager:v2.3.0 kubesphere/notification-tenant-sidecar:v3.2.0# kubesphere/opensearch-curator:v0.0.5 kubesphere/fluent-bit:v1.9.4 kubesphere/log-sidecar-injector:v1.2.0 elastic/filebeat:6.7.0 kubesphere/kube-events-operator:v0.6.0 kubesphere/kube-events-ruler:v0.6.0 kubesphere/kube-auditing-operator:v0.2.0 kubesphere/kube-auditing-webhook:v0.2.0# jaegertracing/jaeger-operator:1.29 jaegertracing/jaeger-agent:1.29 jaegertracing/jaeger-collector:1.29 jaegertracing/jaeger-query:1.29 jaegertracing/jaeger-es-index-cleaner:1.29 kubesphere/kiali-operator:v1.50.1# busybox:1.31.1
4.3 下载 Kubernetes 二进制文件
1 2 3 4 5 6 7 8 9 10 11 12 # 下载 offline-installation-tool.sh root@ksp-deploy:~/kubekey# curl -L -O https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/offline-installation-tool.sh# 给文件增加可执行权限 root@ksp-deploy:~/kubekey# chmod +x offline-installation-tool.sh# 执查看如何使用脚本 root@ksp-deploy:~/kubekey# ./offline-installation-tool.sh -h# 下载 Kubernetes 二进制文件 root@ksp-deploy:~/kubekey# export KKZONE=cn root@ksp-deploy:~/kubekey# export HELM_VERSION=v3.9.0 && export CNI_VERSION=v1.2.0 && export CRICTL_VERSION=v1.24.0 && export ETCD_VERSION=v3.4.13 && export DOCKER_VERSION=24.0.6; root@ksp-deploy:~/kubekey# ./offline-installation-tool.sh -b -v v1.23.17# 运行脚本后,会在当前目录下自动创建一个文件夹 kubekey。请注意,后面创建集群时,该文件夹和 kk 必须放在同一个目录
image-20241230195525723
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # 还需要下载一个calicoctl-linux-arm64 文件 root@ksp-deploy:~/kubekey# curl -L -o kubekey/v1.23.17/arm64/calicoctl-linux-arm64 https://github.com/projectcalico/calico/releases/download/v3.26.1/calicoctl-linux-arm64 -O # 查看创建的文件夹及下载的文件 root@ksp-deploy:~/kubekey# ls -alh kubekey/v1.23.17/arm64/ total 419M drwxr-xr-x 2 root root 4.0K Dec 30 20:12 . drwxr-xr-x 3 root root 4.0K Dec 29 17:05 .. -rw-r--r-- 1 root root 59M Dec 30 19:30 calicoctl-linux-arm64 -rw-r--r-- 1 root root 37M Dec 30 19:53 cni-plugins-linux-arm64-v1.2.0.tgz -rw-r--r-- 1 root root 13M Dec 30 19:53 crictl-v1.24.0-linux-arm64.tar.gz -rw-r--r-- 1 root root 61M Oct 26 2023 docker-24.0.6.tgz -rw-r--r-- 1 root root 16M Dec 30 19:53 etcd-v3.4.13-linux-arm64.tar.gz -rw-r--r-- 1 root root 44M Dec 30 19:52 helm -rw-r--r-- 1 root root 41M Dec 30 19:51 kubeadm -rw-r--r-- 1 root root 42M Dec 30 19:52 kubectl -rw-r--r-- 1 root root 110M Dec 30 19:52 kubelet# 笔者在下载时docker虽然显示成功但其实下载下来的 kubekey/v1.23.17/arm64/docker-24.0.6.tgz 文件只有2.3K,并不可用 # 于是手动重新下载 root@ksp-deploy:~/kubekey# wget https://download.docker.com/linux/static/stable/aarch64/docker-24.0.6.tgz -O kubekey/v1.23.17/arm64/docker-24.0.6.tgz root@ksp-deploy:~/kubekey# ls -alh kubekey/v1.23.17/arm64/docker-24.0.6.tgz -rw-r--r-- 1 root root 61M Oct 26 2023 kubekey/v1.23.17/arm64/docker-24.0.6.tgz
4.4 拉取部署过程中的镜像
1 2 root@ksp-deploy:~/kubekey# ./offline-installation-tool.sh -s -l images-list.txt -d ./kubesphere-images# 总共大概有4G左右
image-20241229171432036
4.5 准备registry:2镜像
1 2 root@ksp-deploy:~/kubekey# docker pull registry:2 root@ksp-deploy:~/kubekey# docker save -o registry-2.tar.gz registry:2
4.6 打包压缩部署镜像文件
1 2 3 4 # 将 整个kubesphere-images/ 目录打包压缩成一个文件 root@ksp-deploy:~/kubekey# tar -zcf kubesphere-images.tar.gz kubesphere-images/ root@ksp-deploy:~/kubekey# ls -alh kubesphere-images.tar.gz -rw-r--r-- 1 root root 4.0G Dec 29 17:26 kubesphere-images.tar.gz
4.7
准备与打包压缩依赖组件离线安装包
1 2 3 4 5 6 7 8 9 10 11 12 13 # 方法1:如下方法只下载部署k8s与kubesphere时需要用到的依赖组件 的离线安装文件 root@ksp-deploy:~/kubekey# mkdir dependent-components root@ksp-deploy:~/kubekey# cd dependent-components# 查看依赖: root@ksp-deploy:~/kubekey/dependent-components# apt-cache depends socat conntrack ebtables ipset ipvsadm# 下载 deb 依赖包 root@ksp-deploy:~/kubekey/dependent-components# apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends depends socat conntrack ebtables ipset ipvsadm | grep -v i386 | grep "^\w")# 打包压缩 root@ksp-deploy:~/kubekey# tar -zcf dependent-components.tar.gz dependent-components/ root@ksp-deploy:~/kubekey# ls -alh dependent-components.tar.gz -rw-r--r-- 1 root root 6.8M Dec 30 13:03 dependent-components.tar.gz# 方法2:真正在离线部署此类环境应该会准备一个操作系统的常用组件离线安装本地源,此处不展开阐述
4.8 打包压缩其他文件
1 2 3 4 # 把 KubeKey文件夹、kubekey-v3.0.13-linux-arm64.tar.gz、offline-installation-tool.sh等5个文件(夹)也制作成压缩包,便于拷贝到离线节点。 root@ksp-deploy:~/kubekey# tar -zcf deploy-files.tar.gz kubekey kubekey-v3.0.13-linux-arm64.tar.gz offline-installation-tool.sh registry-2.tar.gz images-list.txt root@ksp-deploy:~/kubekey# ls -alh deploy-files.tar.gz -rw-r--r-- 1 root root 250M Dec 30 20:15 deploy-files.tar.gz
至此,我们已经准备了如下离线部署资源包:
部署镜像文件:kubesphere-images.tar.gz(4.0G)
部署工具文件:deploy-files.tar.gz(250M)
依赖组件离线安装包:dependent-components.tar.gz(6.8M)
五、部署 KSP 和 K8S
的前置准备操作
5.1
上传离线部署资源包到部署节点
将以下离线部署资源包(kubesphere-images.tar.gz、dependent-components.tar.gz与deploy-files.tar.gz
),上传至离线环境部署节点 (此处是 node01
节点,所有节点信息参考文档最开始处的描述) 的 /opt/deploy-k8s-ksp
目录(可根据实际情况修改)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # 创离线资源存放的数据目录 root@node01:/# mkdir /opt/deploy-k8s-ksp# 上传kubesphere-images.tar.gz与deploy-files.tar.gz 文件到node01:/opt/deploy-k8s-ksp 目录下 # 执行以下命令,解压相关文件: root@node01:/opt/deploy-k8s-ksp# tar -zxf kubesphere-images.tar.gz root@node01:/opt/deploy-k8s-ksp# tar -zxf deploy-files.tar.gz# 至此获得如下文件(夹) root@node01:/opt/deploy-k8s-ksp# ls -alh total 4.3G drwxr-xr-x 7 root root 4.0K Dec 30 20:17 . drwxr-xr-x 5 root root 4.0K Dec 30 19:32 .. -rw-r--r-- 1 root root 6.8M Dec 30 13:04 dependent-components.tar.gz -rw-r--r-- 1 root root 250M Dec 30 20:17 deploy-files.tar.gz -rw-r--r-- 1 root root 2.7K Dec 30 19:34 images-list.txt drwxr-xr-x 16 root root 4.0K Dec 29 17:05 kubekey -rw-r--r-- 1 root root 32M Dec 28 17:23 kubekey-v3.0.13-linux-arm64.tar.gz drwxr-xr-x 2 root root 4.0K Dec 29 17:10 kubesphere-images -rw-r--r-- 1 root root 4.0G Dec 29 17:35 kubesphere-images.tar.gz -rwxr-xr-x 1 root root 8.6K Dec 6 22:52 offline-installation-tool.sh -rw------- 1 root root 25M Dec 29 17:29 registry-2.tar.gz
5.2 安装docker容器服务
k8s集群的每个节点都要安装与配置。将node01节点上的
/opt/deploy-k8s-ksp/kubekey/v1.23.17/arm64/docker-24.0.6.tgz
复制到k8s集群的其他所有节点上,然后按照如下方式解压与部署docker服务。
1 2 3 4 # 按照如下方式解压与部署docker服务 root@node01:/opt/deploy-k8s-ksp# tar -zxf kubekey/v1.23.17/arm64/docker-24.0.6.tgz root@node01:/opt/deploy-k8s-ksp# chown root:root -R docker/ root@node01:/opt/deploy-k8s-ksp# mv docker/* /usr/bin/ && rmdir docker
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 # 使用systemd管理docker服务 root@node01:/opt/deploy-k8s-ksp# cat > /etc/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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 # 配置docker守护进程配置文件:/etc/docker/daemon.json root@node01:/opt/deploy-k8s-ksp# mkdir -p /etc/docker root@node01:/opt/deploy-k8s-ksp# cat > /etc/docker/daemon.json <<EOF { "insecure-registries": [ "dockerhub.kubekey.local" ], "log-opts": { "max-file": "5", "max-size": "50m" }, "exec-opts": ["native.cgroupdriver=systemd"] } EOF# 在 /etc/hosts 中添加一个条目,将主机名(即仓库域名;在本示例中是 dockerhub.kubekey.local)映射到docker resgistry所在服务器的私有 IP 地址,如下所示,以下规划172.25.253.93是docker resgistry所在服务器 root@node01:/opt/deploy-k8s-ksp# cat >> /etc/hosts <<EOF 172.25.253.93 dockerhub.kubekey.local EOF# 应用上述文件并启动dicker服务,设置开机自启动 root@node01:/opt/deploy-k8s-ksp# systemctl daemon-reload && systemctl restart docker root@node01:/opt/deploy-k8s-ksp# systemctl status docker root@node01:/opt/deploy-k8s-ksp# systemctl enable docker.service root@node01:/opt/deploy-k8s-ksp# docker version Client: Version: 24.0.6 API version: 1.43 Go version: go1.20.7 Git commit: ed223bc Built: Mon Sep 4 12:30:04 2023 OS/Arch: linux/arm64 Context: default Server: Docker Engine - Community Engine: Version: 24.0.6 API version: 1.43 (minimum version 1.12) Go version: go1.20.7 Git commit: 1a79695 Built: Mon Sep 4 12:31:30 2023 OS/Arch: linux/arm64 Experimental: false containerd: Version: v1.7.3 GitCommit: 7880925980b188f4c97b462f709d0db8e8962aff runc: Version: 1.1.9 GitCommit: v1.1.9-0-gccaecfc docker-init: Version: 0.19.0 GitCommit: de40ad0# 启动docker命令自动补全 # root@node01:/opt/deploy-k8s-ksp# echo "source <(docker completion bash)" >> /root/.bashrc # root@node01:/opt/deploy-k8s-ksp# source /root/.bashrc
5.3 安装依赖组件
k8s集群的每个节点都要安装与配置。将node01节点上的/opt/deploy-k8s-ksp/kubekey/dependent-components.tar.gz
复制到k8s集群的其他所有节点上,然后按照如下方式解压与安装依赖组件。
1 2 3 4 5 6 7 8 9 10 11 12 root@node01:/opt/deploy-k8s-ksp# tar -zxf dependent-components.tar.gz root@node01:/opt/deploy-k8s-ksp# cd dependent-components# 使用dpkg命令进行离线安装 root@node01:/opt/deploy-k8s-ksp/dependent-components# dpkg -i *.deb# 可以先做好ssh免密登录 # 传输 dependent-components.tar.gz 到node01之外的其他k8s节点 /opt/deploy-k8s-ksp/ 目录下 root@node01:/opt/deploy-k8s-ksp# for i in {2..5}; do ssh -t root@node0${i} "mkdir -p /opt/deploy-k8s-ksp"; done root@node01:/opt/deploy-k8s-ksp# for i in {2..5}; do scp dependent-components.tar.gz root@node0${i}:/opt/deploy-k8s-ksp/; done # k8s集群所有节点安装依赖组件 root@node01:/opt/deploy-k8s-ksp# for i in {1..5}; do ssh -t root@node0${i} "cd /opt/deploy-k8s-ksp && tar -zxf dependent-components.tar.gz && cd dependent-components && dpkg -i *.deb"; done
5.4 准备一个私有镜像仓库
Harbor官方未提供harbor安装文件,虽然笔者已经找到在arm64服务器上部署harbor的方法,但本文以
Docker 仓库作为镜像仓库存储k8s部署过程中需要用到的镜像,并使用自签名证书 。
本文在node01上搭建 Docker 仓库。
使用自签名证书
1 2 3 4 5 # 执行以下命令生成您自己的证书 root@node01:/opt/deploy-k8s-ksp# mkdir certs root@node01:/opt/deploy-k8s-ksp# openssl req -addext "subjectAltName = DNS:dockerhub.kubekey.local" \ -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \ -x509 -days 36500 -out certs/domain.crt
image-20241229221911321
启动 Docker 仓库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 # 加载registry:2镜像 root@node01:/opt/deploy-k8s-ksp# docker load -i registry-2.tar.gz 2ee1e756df5d: Loading layer [==================================================>] 7.955MB/7.955MB 9ef0c8e13134: Loading layer [==================================================>] 898.6kB/898.6kB a7c03a80ddda: Loading layer [==================================================>] 16.65MB/16.65MB 55f11e417f9b: Loading layer [==================================================>] 3.584kB/3.584kB caa2189153ef: Loading layer [==================================================>] 2.048kB/2.048kB Loaded image: registry:2 root@node01:/opt/deploy-k8s-ksp# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry 2 1c6adc34955d 15 months ago 25MB# 让Docker信任刚生成的证书 root@node01:/opt/deploy-k8s-ksp# mkdir -p /etc/docker/certs.d/dockerhub.kubekey.local root@node01:/opt/deploy-k8s-ksp# cp certs/domain.crt /etc/docker/certs.d/dockerhub.kubekey.local/ca.crt# 执行以下命令启动 Docker 仓库 root@node01:/opt/deploy-k8s-ksp# docker run -d \ --restart=always \ --name registry \ -v "$(pwd)"/certs:/certs \ -v /mnt/registry:/var/lib/registry \ -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ -p 443:443 \ registry:2
验证仓库
1 2 3 4 # 要验证私有仓库是否有效,可以修改镜像registry:2的namespace,然后使用 docker push 和 docker pull 来测试。 root@node01:/opt/deploy-k8s-ksp# docker tag registry:2 dockerhub.kubekey.local/registry:2 root@node01:/opt/deploy-k8s-ksp# docker push dockerhub.kubekey.local/registry:2 root@node01:/opt/deploy-k8s-ksp# docker pull dockerhub.kubekey.local/registry:2
5.5 推送镜像至私有仓库
1 2 3 # 将打包的镜像文件传输至您的本地机器,并运行以下命令把它推送至仓库 # 命令中的域名是 dockerhub.kubekey.local,它是docker registry仓库的别名 root@node01:/opt/deploy-k8s-ksp# ./offline-installation-tool.sh -l images-list.txt -d ./kubesphere-images -r dockerhub.kubekey.local
5.6 创建离线集群配置文件
1 2 3 4 5 # 执行以下命令创建离线集群配置文件 root@node01:/opt/deploy-k8s-ksp# tar -zxf kubekey-v3.0.13-linux-arm64.tar.gz # 如果在这一步的命令中不添加标志 --with-kubesphere,则不会部署 KubeSphere,只能使用配置文件中的 addons 字段安装,或者后续使用 ./kk create cluster 命令时再次添加这个标志。 root@node01:/opt/deploy-k8s-ksp# ./kk create config --with-kubesphere v3.4.1 --with-kubernetes v1.23.17 -f ksp-v341-v12317-offline.yaml
命令执行成功后,在当前目录会生成文件名为 ksp-v341-v12317-offline.yaml
的配置文件。
5.7 修改 Cluster 配置
在离线集群配置文件文件中 kind: Cluster
小节的作用是部署 Kubernetes 集群。本文示例采用 3 个节点同时作为
control-plane、etcd 节点,两个节点作为 worker 节点。
1 2 # 执行以下命令修改离线集群配置文件 ksp-v341-v12317-offline.yaml root@node01:/data/kubekey# vi ksp-v341-v12317-offline.yaml
修改 kind: Cluster 小节中 hosts 和 roleGroups
等信息,修改说明如下。
hosts:指定节点的
IP、ssh登录用户、ssh登录密码,并指明服务器构架。
roleGroups:指定 3 个 etcd、control-plane 节点,2 个 worker
节点
修改controlPlaneEndpoint组的配置:
internalLoadbalancer: 启用内置的 HAProxy 负载均衡器
添加storage组的配置:
storage.openebs.basePath:新增配置 ,指定 openebs
默认存储路径为 /data/openebs/local
修改registry组的配置:
registry:使用 docker
registry,它的地址是"dockerhub.kubekey.local"
修改或添加的内容如下(其余保持默认):
image-20241230203614561
5.8 最后的配置
经过上述步骤,我们成功完成了对离线集群配置文件
ksp-v341-v12317-offline.yaml 的修改。此时,修改后的
ksp-v341-v12317-offline.yaml文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 apiVersion: kubekey.kubesphere.io/v1alpha2 kind: Cluster metadata: name: sample spec: hosts: - {name: node01 , address: 172.25 .253 .93 , internalAddress: 172.25 .253 .93 , user: root , password: "cloud@123" , arch: arm64 } - {name: node02 , address: 172.25 .253 .94 , internalAddress: 172.25 .253 .94 , user: root , password: "cloud@123" , arch: arm64 } - {name: node03 , address: 172.25 .253 .95 , internalAddress: 172.25 .253 .95 , user: root , password: "cloud@123" , arch: arm64 } - {name: node04 , address: 172.25 .253 .113 , internalAddress: 172.25 .253 .113 , user: root , password: "cloud@123" , arch: arm64 } - {name: node05 , address: 172.25 .253 .114 , internalAddress: 172.25 .253 .114 , user: root , password: "cloud@123" , arch: arm64 } roleGroups: etcd: - node01 - node02 - node03 control-plane: - node01 - node02 - node03 worker: - node04 - node05 controlPlaneEndpoint: internalLoadbalancer: haproxy domain: lb.kubesphere.local address: "" port: 6443 kubernetes: version: v1.23.17 clusterName: cluster.local autoRenewCerts: true containerManager: docker etcd: type: kubekey network: plugin: calico kubePodsCIDR: 10.233 .64 .0 /18 kubeServiceCIDR: 10.233 .0 .0 /18 multusCNI: enabled: false storage: openebs: basePath: /mnt/openebs/local registry: privateRegistry: "dockerhub.kubekey.local" namespaceOverride: "" registryMirrors: [] insecureRegistries: [] addons: []--- apiVersion: installer.kubesphere.io/v1alpha1 kind: ClusterConfiguration metadata: name: ks-installer namespace: kubesphere-system labels: version: v3.4.1 spec: persistence: storageClass: "" authentication: jwtSecret: "" local_registry: "" etcd: monitoring: false endpointIps: localhost port: 2379 tlsEnable: true common: core: console: enableMultiLogin: true port: 30880 type: NodePort redis: enabled: false enableHA: false volumeSize: 2Gi openldap: enabled: false volumeSize: 2Gi minio: volumeSize: 20Gi monitoring: endpoint: http://prometheus-operated.kubesphere-monitoring-system.svc:9090 GPUMonitoring: enabled: false gpu: kinds: - resourceName: "nvidia.com/gpu" resourceType: "GPU" default: true es: enabled: false logMaxAge: 7 elkPrefix: logstash basicAuth: enabled: false username: "" password: "" externalElasticsearchHost: "" externalElasticsearchPort: "" opensearch: enabled: true logMaxAge: 7 opensearchPrefix: whizard basicAuth: enabled: true username: "admin" password: "admin" externalOpensearchHost: "" externalOpensearchPort: "" dashboard: enabled: false alerting: enabled: false auditing: enabled: false devops: enabled: false jenkinsCpuReq: 0.5 jenkinsCpuLim: 1 jenkinsMemoryReq: 4Gi jenkinsMemoryLim: 4Gi jenkinsVolumeSize: 16Gi events: enabled: false ruler: enabled: true replicas: 2 logging: enabled: false logsidecar: enabled: true replicas: 2 metrics_server: enabled: false monitoring: storageClass: "" node_exporter: port: 9100 gpu: nvidia_dcgm_exporter: enabled: false multicluster: clusterRole: none network: networkpolicy: enabled: false ippool: type: none topology: type: none openpitrix: store: enabled: false servicemesh: enabled: false istio: components: ingressGateways: - name: istio-ingressgateway enabled: false cni: enabled: false edgeruntime: enabled: false kubeedge: enabled: false cloudCore: cloudHub: advertiseAddress: - "" service: cloudhubNodePort: "30000" cloudhubQuicNodePort: "30001" cloudhubHttpsNodePort: "30002" cloudstreamNodePort: "30003" tunnelNodePort: "30004" iptables-manager: enabled: true mode: "external" gatekeeper: enabled: false terminal: timeout: 600
5.9 安装配置 Harbor
arm64服务器上搭建harbor环境可以参考:https://jiangsanyin.github.io/2024/10/30/arm64%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8B%E7%9A%84Harbor-v2-11-1%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/。
后续用法跟x86_64构架服务器上的harbor一样。
六、安装 KubeSphere 和 K8s
集群
6.1 执行安装KubeSphere 和 K8s
集群
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 创建mkdir-copyfile.sh root@node01:/opt/deploy-k8s-ksp# touch mkdir-copyfile.sh# 其内容如下 root@node01:/opt/deploy-k8s-ksp# cat mkdir-copyfile.sh cd /opt/deploy-k8s-ksp mkdir kubekey/kube mkdir -p kubekey/kube/v1.23.17/arm64/ kubekey/helm/v3.9.0/arm64/ kubekey/cni/v1.2.0/arm64/ kubekey/crictl/v1.24.0/arm64/ kubekey/etcd/v3.4.13/arm64/ kubekey/docker/24.0.6/arm64/ kubekey/cni/v3.26.1/arm64/ cp -rp kubekey/v1.23.17/arm64/kube* kubekey/kube/v1.23.17/arm64/ cp -rp kubekey/v1.23.17/arm64/helm kubekey/helm/v3.9.0/arm64/ cp -rp kubekey/v1.23.17/arm64/cni-plugins-linux-arm64-v1.2.0.tgz kubekey/cni/v1.2.0/arm64/ cp -rp kubekey/v1.23.17/arm64/crictl-v1.24.0-linux-arm64.tar.gz kubekey/crictl/v1.24.0/arm64/ cp -rp kubekey/v1.23.17/arm64/etcd-v3.4.13-linux-arm64.tar.gz kubekey/etcd/v3.4.13/arm64/ cp -rp kubekey/v1.23.17/arm64/docker-24.0.6.tgz kubekey/docker/24.0.6/arm64/ cp -rp kubekey/v1.23.17/arm64/calicoctl-linux-arm64 kubekey/cni/v3.26.1/arm64/calicoctl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 如果 /mnt/openebs/local 目录非空,请将此目录下的所有文件清空,否则安装将失败、提示如下 # TASK [common : debug] ********************************************************** # ok: [localhost] => { # "msg" : [ # "1. check the storage configuration and storage server" , # "2. make sure the DNS address in /etc/resolv.conf is available" , # "3. execute 'kubectl logs -n kubesphere-system -l job-name=minio-make-bucket-job' to watch logs" , # "4. execute 'helm -n kubesphere-system uninstall ks-minio && kubectl -n kubesphere-system delete job minio-make-bucket-job'" , # "5. Restart the installer pod in kubesphere-system namespace" # ] # } # 执行以下命令,安装 KubeSphere 和 K8s 集群 root@node01:/opt/deploy-k8s-ksp# bash mkdir-copyfile.sh root@node01:/opt/deploy-k8s-ksp# ./kk create cluster -f ksp-v341-v12317-offline.yaml --yes
参数说明:
ksp-v341-v12317-offline.yaml :离线环境集群的配置文件
上面的命令执行后,首先 KubeKey 会检查部署 K8s
的依赖及其他详细要求。检查合格后,系统将提示确认安装。输入
yes 并按 ENTER 继续部署。
image-20241230205705028
6.2 部署后置处理
6.2.1
pod/default-http-backend-75f5768976-6svwx 一直处于ImagePullBackOff
状态
image-20241231095318516
因为安装程序尝试拉取与使用的镜像是amd64构架镜像,应该是安装程序(具体地说是kk工具)内部的错误。且在此处私有镜像镜像仓库中尝试拉取的镜像并不存在,所以一直拉取不成功。
1 2 3 # 修改 命名空间kubesphere-controls-system下的pod/default-http-backend-75f5768976-6svwx root@node01:/opt/deploy-k8s-ksp# kubectl -n kubesphere-controls-system edit pod default-http-backend-75f5768976-6svwx# 将spec中使用的镜像修改为“dockerhub.kubekey.local/mirrorgooglecontainers/defaultbackend-arm64:1.4”
image-20241231095456573
6.3 控制节点配置keepalived
暂略。配置keepalived相关方法可以参考:https://jiangsanyin.github.io/2024/08/10/%E6%90%AD%E5%BB%BA%E4%BA%92%E4%B8%BA%E4%B8%BB%E5%A4%87MySQL5-7%E9%9B%86%E7%BE%A4%E5%B9%B6%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%8A%A8%E5%88%87%E6%8D%A2/#2-3-%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AEkeepalived
七、部署结果验证
访问kubesphere3.4.1的web管理界面: http://172.25.253.93:30880/login
。默认用户名:admin,其默认密码:P@88w0rd
登录成功后看到的界面:
image-20241230205947409
查看节点状态:
image-20241230205929259
八、参考文档
https://v3-1.docs.kubesphere.io/zh/docs/installing-on-linux/introduction/air-gapped-installation/