文章目录
- 项目基础信息
- 工具版本
- 测试环境
- 下载资源文件
- 下载sealos二进制命令文件
- 下载k8s安装镜像和组件资源
- 下载docker离线安装包
- 下载Docker Registry容器镜像
- NFS共享配置
- coredns服务的DNS解析配置
- 安装配置sealos、k8s服务
- 安装sealos工具
- 导入k8s及相关组件镜像
- 安装 K8s 集群
- 部署ingress组件
- 调整Ingress资源请求体大小限制
- 部署NFS Provisioner组件
- 安装docker registry本地镜像仓库
- 离线安装docker
- 安装Docker Registry本地镜像仓库
- 参考资料
项目基础信息
在内部网络的离线环境中,通过使用sealos工具自动化部署一套高可用的k8s服务集群,配置使用NFS共享存储,以及搭建了一个Docker Registry本地镜像仓库的服务。
近期因工作所需,不得已又捡起放下了几年的k8s,在多方咨询后,确认sealos工具是可以满足我们部署一套高可用k8s服务集群需求的,也不致于影响到后续的长期运行维护与故障处理,于是使用了几天时间部署、验证并整理出这样一篇技术资料,发与大家共享。
工具版本
- sealos v4.3.7
- 集群镜像版本 labring/kubernetes:v1.27.16
测试环境
操作系统版本为RHEL7.9 64
测试机信息如下:
- 172.16.10.52 k8s master节点
- 172.16.10.53 k8s master节点
- 172.16.10.54 k8s master节点
- 172.16.10.55 k8s worker节点
- 172.16.10.56 k8s worker节点
- 172.16.10.57 k8s worker节点
- 172.16.10.63 NFS共享节点
- 172.16.10.64 docker image仓库
需要注意的是容器默认使用/var/lib作为数据存储路径,在开始安装服务前,务必检查下各主机节点的数据盘空间分配使用,或者是直接挂载到/var/lib路径,或者是将数据盘空间追加到/var分区均可。
在k8s集群所有主机节点上增加/etc/hosts映射配置如下:
cat << EOF >> /etc/hosts
172.16.10.52 test-APP-10-52
172.16.10.53 test-APP-10-53
172.16.10.54 test-APP-10-54
172.16.10.55 test-APP-10-55
172.16.10.56 test-APP-10-56
172.16.10.57 test-APP-10-57
EOF
下载资源文件
需要先找一个能访问互联网的linux主机,下载需要的资源文件。拷贝到内网中离线使用。
下载sealos二进制命令文件
以下命令均使用root用户执行。
VERSION=v4.3.7
export VERSION
wget https://mirror.ghproxy.com/https://github.com/labring/sealos/releases/download/${VERSION}/sealos_${VERSION#v}_linux_amd64.tar.gz
查看下载的文件:
ls -lh
-rw-r--r--. 1 root root 61M Oct 31 2023 sealos_4.3.7_linux_amd64.tar.gz
下载k8s安装镜像和组件资源
以下命令均使用root用户执行。
在有网络的环境中导出集群镜像:
sealos pull registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.16
sealos save -o kubernetes.tar registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.16sealos pull registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4
sealos save -o helm.tar registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4sealos pull registry.cn-shanghai.aliyuncs.com/labring/calico:v3.26.1
sealos save -o cilium.tar registry.cn-shanghai.aliyuncs.com/labring/calico:v3.26.1sealos pull registry.cn-shanghai.aliyuncs.com/labring/ingress-nginx:v1.11.2
sealos save -o ingress-nginx.tar registry.cn-shanghai.aliyuncs.com/labring/ingress-nginx:v1.11.2sealos pull registry.cn-shanghai.aliyuncs.com/labring/nfs-subdir-external-provisioner:v4.0.18
sealos save -o nfs-subdir-external-provisioner.tar registry.cn-shanghai.aliyuncs.com/labring/nfs-subdir-external-provisioner:v4.0.18
下载docker离线安装包
https://download.docker.com/linux/static/stable/x86_64/docker-20.10.24.tgz
下载Docker Registry容器镜像
找一个可以访问互联网的docker容器,执行下面命令下载并导出一份容器镜像文件:
docker pull registry
docker images
docker save IMAGE_ID > registry.tar
将上面下载的各种资源文件,拷贝到内网中做离线部署使用。
NFS共享配置
我们测试环境中没有nas共享网盘资源,所以在搭建该测试服务时改为使用一台测试机自行搭建一个NFS共享服务,管理信息如下:
- 测试机地址 :172.16.10.64
- 文件系统共享路径:/nfsdata
在这里跳过怎么配置上述linux系统下的nfs共享服务了,有不明白的可自行查找参考资料。
需要特别注意的一点是,需要调整nfs共享路径的属主权限如下:
## nfs 目录权限问题,执行命令修改权限:
chown nfsnobody:nfsnobody /nfsdata
coredns服务的DNS解析配置
由于目前测试环境没有dns解析服务,coredns容器会因找不到dns server而启动失败,解决方法有两种:
1)在k8s集群所有测试机上手工配置一条dns server地址
cat << EOF >> /etc/resolv.conf
nameserver 114.114.114.114
EOF
对于无法访问互联网的测试机来说,其实上面的nameserver地址可以随便写一个即可。需要注意的是,还需要手工修改下测试机网卡配置文件,增加DNS1=114.114.114.114的配置内容,以防测试机重启后会丢失resolv.conf中的配置信息。
2)执行命令kubectl edit cm coredns -n kube-system
在configmap配置文件中删除以下内容:
forward . /etc/resolv.conf {max_concurrent 1000}
保存退出后,删除相应的coredns pod即可。
安装配置sealos、k8s服务
挑选第一个k8s master节点,使用root用户执行以下配置操作。
安装sealos工具
tar zxvf sealos_${VERSION#v}_linux_amd64.tar.gz sealos
chmod 744 /usr/bin/sealos
mv sealos /usr/bin
导入k8s及相关组件镜像
将 kubernetes.tar、helm.tar、calico.tar 拷贝到离线环境, 使用 load 命令导入镜像即可:
sealos load -i kubernetes.tar
sealos load -i helm.tar
sealos load -i calico.tar
sealos load -i ingress-nginx.tar
sealos load -i nfs-subdir-external-provisioner.tar
查看集群镜像是否导入成功:
sealos imagesREPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-shanghai.aliyuncs.com/labring/kubernetes v1.27.16 d8938a9ce5af 11 days ago 623 MB
registry.cn-shanghai.aliyuncs.com/labring/ingress-nginx v1.11.2 66a7671dfb5f 2 months ago 130 MB
registry.cn-shanghai.aliyuncs.com/labring/calico v3.26.1 1e8350ad92f0 14 months ago 340 MB
registry.cn-shanghai.aliyuncs.com/labring/nfs-subdir-external-provisioner v4.0.18 379a90149496 16 months ago 18 MB
registry.cn-shanghai.aliyuncs.com/labring/helm v3.9.4 3376f6822067 2 years ago 46.4 MB
安装 K8s 集群
在所有节点上,预安装几个工具包如下:
yum -y install socat conntrack-tools ipvsadm nfs-utils
在所有节点上,配置支持ipvs:
mkdir -p /opt/k8s/
cat << EOF > /opt/k8s/ipvs.sh
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_sh
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- nf_conntrack_ipv4
EOFchmod +x /opt/k8s/ipvs.sh
echo "/opt/k8s/ipvs.sh" >>/etc/rc.local
chmod +x /etc/rc.localipvsadm -ln
在master1节点上面,通过sealos工具一键创建k8s服务集群:
sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.16 \registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 \registry.cn-shanghai.aliyuncs.com/labring/calico:v3.26.1 \--masters 172.16.10.52,172.16.10.53,172.16.10.54 \--nodes 172.16.10.55,172.16.10.56,172.16.10.57 -p change-to-your-password
## 查看配置结果,各节点应该是Ready状态
kubectl get nodes
## 查看容器Pod实例状态,STATUS应该是Running状态
kubectl get po -A -o wide
参数说明:
参数名 参数值示例 参数说明
- –masters 192.168.64.2 # K8s master 节点地址列表
- –nodes 192.168.64.1 # K8s node 节点地址列表
- –ssh-passwd [your-ssh-passwd] # ssh 登录密码
- kubernetes labring/kubernetes:v1.27.16 # K8s 集群镜像
在干净的服务器上直接执行上面命令,不要做任何多余操作即可安装一个高可用 K8s 集群。
查看最终的完整k8s集群配置结果:
[root@test-APP-10-52 sealos-k8s]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
test-app-10-52 Ready control-plane 23h v1.27.16
test-app-10-53 Ready control-plane 23h v1.27.16
test-app-10-54 Ready control-plane 23h v1.27.16
test-app-10-55 Ready <none> 23h v1.27.16
test-app-10-56 Ready <none> 23h v1.27.16
test-app-10-57 Ready <none> 23h v1.27.16
以下仅为参考,是节点增、删管理的更多方法:
## 增加master节点
$ sealos add --nodes 192.168.64.21,192.168.64.19
$ sealos add --masters 192.168.64.21,192.168.64.19 ## 删除 K8s 节点
$ sealos delete --nodes 192.168.64.21,192.168.64.19
$ sealos delete --masters 192.168.64.21,192.168.64.19
部署ingress组件
生成一个ingress-nginx服务的ConfigMap配置文件:
cat << EOF > ingress-nginx-config.yaml
apiVersion: apps.sealos.io/v1beta1
kind: Config
metadata:creationTimestamp: nullname: ingress-nginx-config
spec:data: |controller:hostNetwork: truekind: DaemonSetservice:type: NodePortmatch: registry.cn-shanghai.aliyuncs.com/labring/ingress-nginx:v1.11.2path: charts/ingress-nginx/values.yamlstrategy: merge
EOF
创建ingress-nginx服务:
sealos run registry.cn-shanghai.aliyuncs.com/labring/ingress-nginx:v1.11.2 --config-file ingress-nginx-config.yaml
[root@test-APP-10-52 sealos-k8s]# kubectl get po -A -o wide|grep nginx
ingress-nginx ingress-nginx-controller-5dj7c 1/1 Running 0 19h 172.16.10.56 test-app-10-56 <none> <none>
ingress-nginx ingress-nginx-controller-6jbqk 1/1 Running 0 19h 172.16.10.57 test-app-10-57 <none> <none>
ingress-nginx ingress-nginx-controller-cqb28 1/1 Running 0 19h 172.16.10.55 test-app-10-55 <none> <none>
调整Ingress资源请求体大小限制
在Kubernetes中,当使用Nginx Ingress Controller时,需要调整请求体大小限制,可以直接在Ingress资源中添加相应的annotations。
1、编辑Ingress资源
在Ingress资源的YAML文件中,添加或修改以下annotations:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata: name: my-ingress annotations: # 这里注解用于指定请求体的最大大小,这里设置为200MB。nginx.ingress.kubernetes.io/proxy-body-size: 200m
spec: ...
2、应用配置变更
保存并更新Ingress资源
kubectl apply -f your-ingress.yaml
3、验证配置
检查Nginx Ingress Controller的日志或使用kubectl describe命令查看Ingress资源的详细信息,确保配置生效。
部署NFS Provisioner组件
在这里遇到一个问题是,在离线网络环境中,无法正常使用helm添加仓库并部署nfs provisioner组件,也未找到更简单的解决方法,下面提供了一种临时的解决方案,仅供参考吧。
## 1、先找到sealos nfs组件的下载文件路径
find / -name nfs-subdir-external-provisioner
## 该路径与右侧类似,路径中间部分会有差别,我们以右侧路径进行示例说明:/var/lib/sealos/data/default/applications/default-dom2h16c/workdir/charts/nfs-subdir-external-provisioner
## 2、修改nfs provisioner组件的部署参数
cd /var/lib/sealos/data/default/applications/default-dom2h16c/workdir/charts/nfs-subdir-external-provisioner/
vi values.yaml
下面是values.yaml文件中需要根据实际配置信息进行修改的内容,重点是replicaCount、nfs.server、nfs.path这几个参数值:
replicaCount: 2
strategyType: Recreateimage:repository: registry.k8s.io/sig-storage/nfs-subdir-external-provisionertag: v4.0.2pullPolicy: IfNotPresent
imagePullSecrets: []nfs:server: 172.16.10.63path: /nfsdatamountOptions:volumeName: nfs-subdir-external-provisioner-root# Reclaim policy for the main nfs volumereclaimPolicy: Retain
执行创建nfs provisioner服务的命令:
cd /var/lib/sealos/data/default/applications/default-dom2h16c/workdir
./nfs-subdir-external-provisioner.sh
Release "nfs-subdir-external-provisioner" has been upgraded. Happy Helming!
NAME: nfs-subdir-external-provisioner
LAST DEPLOYED: Wed Oct 30 17:16:58 2024
NAMESPACE: nfs-provisioner
STATUS: deployed
REVISION: 4
TEST SUITE: None
查看nfs 驱动组件配置结果:
## 查看nfs deployment:
[root@test-APP-10-52 sealos-k8s]# kubectl get deployment -A -o wide|grep nfs
## 查看nfs ReplicaSet:
[root@test-APP-10-52 sealos-k8s]# kubectl get ReplicaSet -A -o wide|grep nfs
## 查看nfs storageclass:
[root@test-APP-10-52 sealos-k8s]# kubectl get sc -A -o wide|grep nfs
## 查看nfs provisioner容器:
[root@test-APP-10-52 sealos-k8s]# kubectl get po -A -o wide|grep nfs
nfs-provisioner nfs-subdir-external-provisioner-7fccc96d5-kwz5w 1/1 Running 0 44m 100.93.100.133 test-app-10-55 <none> <none>
nfs-provisioner nfs-subdir-external-provisioner-7fccc96d5-nq6t7 1/1 Running 0 70m 100.107.99.195 test-app-10-56 <none> <none>
## 如果继续查看容器配置详情,可执行以下命令:
[root@test-APP-10-52 sealos-k8s]# kubectl describe pod nfs-subdir-external-provisioner-7fccc96d5-kwz5w -n nfs-provisioner
设置nfs-client为默认使用的storageclass类:
kubectl get sc -A -o wide
kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
安装docker registry本地镜像仓库
在镜像仓库主机节点上执行。
离线安装docker
tar -zxvf ./docker-20.10.24.tgz
cp docker/* /usr/bin/
配置docker服务管理:
cat << EOF > /etc/systemd/system/docker.service
[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 --selinux-enabled=false --insecure-registry=127.0.0.1
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
配置docker服务启动管理:
systemctl daemon-reload
systemctl enable docker.service
systemctl start docker
systemctl status docker
## 查看docker版本信息:
docker -v
安装Docker Registry本地镜像仓库
以下配置,是在镜像仓库节点上面执行。
预先检查与配置:
- 检查并为镜像仓库节点挂载数据盘 /data
- 配置并开放系统防火墙端口:
systemctl enable firewalld
systemctl start firewalld
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.10.52" port protocol="tcp" port="5000" accept'
## 以上规则仅为示例,在实际部署时需按细粒度为所有访问镜像仓库的ip配置访问权限
firewall-cmd --reload
特别注意:该主机节点启动了firewalld系统墙服务后,轻易不可再做变更,否则会干扰docker容器的数据包转发链正常运行。如果一定要修改系统墙规则,那么在变更firewalld服务后,需要重启下服务systemctl restart docker。
导入registry离线镜像包:
docker load < registry.tar
运行docker私有仓库服务:
docker run -d -p 5000:5000 --restart always --name registry -v /data/registry/:/tmp/registry --privileged=true registry
登录与退出容器的方法:
docker exec -it container\_id /bin/sh
注意在退出容器时,不可执行exit,这会导致容器实例直接关停。正确退出容器的方法是连续执行以下两个命令的组合:
Ctrl+P Ctrl+Q
查看仓库中的镜像信息:
curl -XGET http://172.16.10.64:5000/v2/_catalog
配置linux客户端使用http协议访问私有仓库并推送容器镜像,可参考以下方法:
注意在
镜像仓库的服务器端是不需要调整配置的
:
vi /etc/docker/daemon.json
{"insecure-registries": ["0.0.0.0:5000"]
}
参考资料
- https://sealos.io/zh-Hans/docs/category/quick-start-1
- https://blog.csdn.net/weixin_37926734/article/details/123279987
- https://www.cnblogs.com/netcore3/p/16982828.html