1.安装docker
1.1 下载docker离线包
地址:https://download.docker.com/linux/static/stable/
进入aarch64目录,下载需要的docker版本
下载后上传至服务器解压
代码语言:javascript复制tar -xvf docker-20.10.7.tgz
# 将 docker 文件移动到 /usr/bin 目录下
cp -p docker/* /usr/bin
1.2 编写docker.service
代码语言:javascript复制vim docker.service
内容如下:
代码语言:javascript复制
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# 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
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
添加到系统服务
代码语言:javascript复制# 将 docker.service 移到 /etc/systemd/system/ 目录
cp docker.service /etc/systemd/system/
# 设置 docker.service 文件权限
chmod x /etc/systemd/system/docker.service
代码语言:javascript复制
代码语言:javascript复制# 重新加载配置文件
systemctl daemon-reload
# 启动docker
systemctl start docker
# 设置 docker 开机自启
systemctl enable docker.service
代码语言:javascript复制
1.3 验证docker的安装
2.安装KS
服务器配置 (华为云服务器)
主机名 | IP | CPU | 内存 |
---|---|---|---|
master-1 | 192.168.0.115 | 4 | 8 |
master-2 | 192.168.0.150 | 4 | 8 |
master-3 | 192.168.0.58 | 4 | 8 |
2.1下载KK
在master节点操作(后续没有特殊说明都是在此节点)下载最新版的 KubeKey
代码语言:javascript复制export KKZONE=cn
curl -sfL https://get-kk.kubesphere.io | sh -
代码语言:javascript复制
下载后查看kk版本,可以看到版本信息以及架构
代码语言:javascript复制[root@node1 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"}
[root@node1 kubekey]#
代码语言:javascript复制
查看 KubeKey 支持的 Kubernetes 版本列表
代码语言:javascript复制./kk version --show-supported-k8s
代码语言:javascript复制
k8s 1.24后不再直接使用docker管理容器,我们为方便继续使用docker减少研发和运维工作量,使用1.22.12版本k8s
2.2创建k8s配置文件
代码语言:javascript复制./kk create config -f kubesphere-v340-v12212.yaml --with-kubernetes v1.22.12 --with-kubesphere v3.4.0
创建后编辑配置文件 kubesphere-v340-v12212.yaml,修改节点信息,hosts节点信息中添加arch为arm64
修改k8s中的containerManager为docker
代码语言:javascript复制apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
name: sample
spec:
hosts:
- {name: node1, address: 192.168.0.115, internalAddress: 192.168.0.115, user: root, password: "123456", arch: arm64}
- {name: node2, address: 192.168.0.150, internalAddress: 192.168.0.150, user: root, password: "123456", arch: arm64}
- {name: node3, address: 192.168.0.58, internalAddress: 192.168.0.58, user: root, password: "123456", arch: arm64}
roleGroups:
etcd:
- node1
- node2
- node3
control-plane:
- node1
- node2
- node3
worker:
- node1
- node2
- node3
controlPlaneEndpoint:
## Internal loadbalancer for apiservers
internalLoadbalancer: haproxy
domain: lb.kubesphere.local
address: ""
port: 6443
kubernetes:
version: v1.22.12
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
## multus support. https://github.com/k8snetworkplumbingwg/multus-cni
multusCNI:
enabled: false
storage:
openebs:
basePath: /data/openebs/local # base path of the local PV provisioner
registry:
privateRegistry: ""
namespaceOverride: ""
registryMirrors: []
insecureRegistries: []
addons: []
代码语言:javascript复制
2.3服务器基础配置和初始化
将kk拷贝到各节点服务器,执行
代码语言:javascript复制./kk init os
代码语言:javascript复制
2.4部署
代码语言:javascript复制export KKZONE=cn
./kk create cluster -f kubesphere-v340-v12212.yaml
代码语言:javascript复制
输入yes后开始执行安装部署
安装过程日志输出比较多,本文只展示重要的一点,一定要观察下载的二进制包,格式为 arm64(篇幅所限,只展示了部分日志输出)
代码语言:javascript复制Continue this installation? [yes/no]: yes
16:26:32 CST success: [LocalHost]
16:26:32 CST [NodeBinariesModule] Download installation binaries
16:26:32 CST message: [localhost]
downloading arm64 kubeadm v1.26.5 ...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 43.3M 100 43.3M 0 0 1016k 0 0:00:43 0:00:43 --:--:-- 1065k
代码语言:javascript复制
实际部署时如果不手工干预,必然会出现下面的情况 :
代码语言:javascript复制clusterconfiguration.installer.kubesphere.io/ks-installer created
18:13:51 CST skipped: [ksp-master-3]
18:13:51 CST skipped: [ksp-master-2]
18:13:51 CST success: [ksp-master-1]
Please wait for the installation to complete: <---<<
20:13:51 CST skipped: [ksp-master-3]
20:13:51 CST skipped: [ksp-master-2]
20:13:51 CST failed: [ksp-master-1]
error: Pipeline[CreateClusterPipeline] execute failed: Module[CheckResultModule] exec failed:
failed: [ksp-master-1] execute task timeout, Timeout=2h
代码语言:javascript复制
当出现等待安装完成的滚动条后,应该立即新开终端,使用 kubectl get pod -A
关注所有 Pod 的部署情况。
根据报错信息,参考下文的「异常组件解决方案」及时排查解决创建和启动异常的组件。
3. 异常组件及解决方案
此处需要使用kubectl get pods -A查看服务部署在哪个节点,并到该节点重新拉取镜像。为高可用实现,建议每个节点都操作一遍。
3.1 解决 metrics-server 异常
这个异常是第一个要处理的,在 kk 部署任务的最后,出现等待部署完成的任务滚动条时就要关注,如果该 Pod 出现异常需要立即处理。
- 获取适配的 ARM 版镜像(相同版本 KubeSphere 官方 ARM 版镜像)
# 拉取 arm64 镜像
代码语言:javascript复制docker pull registry.cn-beijing.aliyuncs.com/kubesphereio/metrics-server:v0.4.2-arm64 --platform arm64
代码语言:javascript复制镜像重新打 tag(可不做 )
代码语言:javascript复制
代码语言:javascript复制# 删除 amd64 镜像
#docker rmi registry.cn-beijing.aliyuncs.com/kubesphereio/metrics-server:v0.4.2
# 重新打 tag
# docker tag registry.cn-beijing.aliyuncs.com/kubesphereio/metrics-server:v0.4.2-arm64 registry.cn-beijing.aliyuncs.com/kubesphereio/metrics-server:v0.4.2
代码语言:javascript复制重新部署组件
代码语言:javascript复制
代码语言:javascript复制# 修改 Deployment 使用的镜像,并重启
kubectl set image deployment/metrics-server metrics-server=registry.cn-beijing.aliyuncs.com/kubesphereio/metrics-server:v0.4.2-arm64 -n kube-system
kubectl rollout restart deployment/metrics-server -n kube-system
代码语言:javascript复制
3.2 解决 Argo CD 异常
- 获取适配的 ARM 版镜像(相同版本 KubeSphere 官方 ARM 版镜像)
# 找个相同版本的 ARM 架构的镜像
代码语言:javascript复制docker pull kubespheredev/argocd-applicationset-arm64:v0.4.1
代码语言:javascript复制镜像重新打 tag(为了保持镜像名称风格一致)
代码语言:javascript复制
代码语言:javascript复制docker tag docker.io/kubespheredev/argocd-applicationset-arm64:v0.4.1 registry.cn-beijing.aliyuncs.com/kubesphereio/argocd-applicationset-arm64:v0.4.1
代码语言:javascript复制重新部署组件
代码语言:javascript复制
代码语言:javascript复制# 修改 Deployment 使用的镜像,并重启
kubectl set image deployment/devops-argocd-applicationset-controller applicationset-controller=registry.cn-beijing.aliyuncs.com/kubesphereio/argocd-applicationset-arm64:v0.4.1 -n argocd
kubectl rollout restart deployment/devops-argocd-applicationset-controller -n argocd
代码语言:javascript复制验证新的 Pod 创建并启动成功
代码语言:javascript复制
代码语言:javascript复制kubectl get pods -o wide -n argocd | grep applicationset-controller
代码语言:javascript复制3.3解决 Minio 异常
注意节点分配
- 获取适配的 ARM 版镜像(相近版本 Minio 官方 ARM 版镜像)
代码语言:javascript复制# 找个相近版本的 ARM 架构的镜像
# minio
docker pull minio/minio:RELEASE.2020-11-25T22-36-25Z-arm64
# mc
docker pull minio/mc:RELEASE.2020-11-25T23-04-07Z-arm64
代码语言:javascript复制
- 镜像重新打 tag
代码语言:javascript复制# minio
docker rmi registry.cn-beijing.aliyuncs.com/kubesphereio/minio:RELEASE.2019-08-07T01-59-21Z
docker tag docker.io/minio/minio:RELEASE.2020-11-25T22-36-25Z-arm64 registry.cn-beijing.aliyuncs.com/kubesphereio/minio:RELEASE.2019-08-07T01-59-21Z
# mc
docker rmi registry.cn-beijing.aliyuncs.com/kubesphereio/mc:RELEASE.2019-08-07T23-14-43Z
docker tag docker.io/minio/mc:RELEASE.2020-11-25T23-04-07Z-arm64 registry.cn-beijing.aliyuncs.com/kubesphereio/mc:RELEASE.2019-08-07T23-14-43Z
代码语言:javascript复制重新部署组件
代码语言:javascript复制
代码语言:javascript复制# 重新部署,删除旧的 Pod,系统会自动重建(此步的操作也可以使用修改 minio 对应的 deployment 使用的镜像名称的方式)
kubectl delete pod minio-757c8bc7f-tlnts -n kubesphere-system
kubectl delete pod minio-make-bucket-job-fzz95 -n kubesphere-system
代码语言:javascript复制3.4解决组件异常通用方案
在部署 ARM 的 KubeSphere 和 Kubernetes 集群时,遇到的异常多数都是因为镜像架构不匹配造成的,当遇到本文没有涉及的异常组件时,可以参考以下流程解决。
- 查看异常 Pod
- 查看异常 Pod 的日志
- 查看异常 Pod 使用的镜像
- 查看异常 Pod 镜像架构
- 获取适配的 ARM 版镜像
- 镜像重新打 tag
- 重新部署组件
当确定镜像架构没问题时,有些问题可以通过多次删除重建的方式解决。
4.日志收集
由于KubeSphere3.4抛弃了ES,使用了opensearch。由于项目中对接的是es,这里手动部署es。
先创建工作负载再创建服务(下面顺序只是参考)
4.1创建es服务
先开启日志审计组件,开启后在kubesphere-logging-system项目下新建服务名为elasticsearch-logging-data的服务
添加容器选择elasticsearch:7.17.14(该版本支持arm架构),端口设置9200
4.2修改fluent-bit配置
日志收集使用的fluent-bit守护进程,该进程将收集的日志发送的配置文件中的服务中。
修改配置字典fluent-bit-config中的fluent-bit.conf
ks3.4开启日志审计后默认配置为输出到opensearch,需要修改为新建的es服务
修改为3.3中的配置: