小伙伴们大家好呀!断更了近一个月,XiXi去学习了一下K8s和Jenkins的相关技术。学习内容有些庞杂,近一个月的时间里我只学会了一些皮毛,更多的内容还需要后面不断学习,不断积累。最主要的是云主机真得很贵,为了写这篇文章,我花了近200块😭
回到正题,这里我分享的成果是:在K8s上部署一套Jenkins环境,可以基于Pod实现动态的Jenkins-Slave的扩展,下面记录着我的整个搭建过程。
环境介绍
- K8s1.28.2集群
- 一台可以连接外网的云主机:用于下载一些Docker镜像
准备NFS制备器
在创建Jenkins之前,我们需要先在K8s集群上创建一个NFS制备器。创建NFS制备器后,我们只需要声明PVC,NFS制备器便会自动地基于NFS文件系统创建相应的PV。
NFS文件系统搭建
我们需要先搭建起一个NFS文件系统,搭建流程相当简单
- 每台主机上执行安装
# 安装 nfs
yum install nfs-utils -y
# 启动 nfs
systemctl start nfs-server
# 查看 nfs 版本
cat /proc/fs/nfsd/versions
- 选择某一台主机创建共享目录
这里我选择了内网ip:172.24.12.240的一台云主机
# 创建共享目录
mkdir -p /data/nfs/jenkins
# 设置共享目录 export
vim /etc/exports
/data/nfs/jenkins *(rw,sync,no_subtree_check,no_root_squash)
# 重新加载
exportfs -f
systemctl reload nfs-server
# 查看
showmount -e 172.24.12.240
- 其他机器可以挂载共享目录
mkdir -p /data/nfs/jenkins
# 注意执行mount时的目录,不要是挂载目录
mount -t nfs 172.24.12.240:/data/nfs/jenkins /data/nfs/jenkins
- 最终效果
最终,可以实现,在任意一台主机的 /data/nfs/jenkins中操作,都会同步到其他主机上
NFS制备器
参考官方GitHub:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
官方为我们提供了3种NFS制备器的创建方式:
- Helm
- Kustomize
- 手动方式
下面我采取手动的方式给大家做个演示
步骤一:克隆官方项目
# 不管用什么方式大家将项目克隆下来就好
git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git
主要是需要使用项目中deploy文件夹中的yaml文件
步骤二:修改deploy目录中的yaml的内容
注:如果制备器想创建在default命名空间,配置文件中namespace的相关内容不用改
- class.yaml:用于创建StorageClass
- deployment.yaml:用于创建Deployment
- rbac.yaml:创建ServiceAccount和绑定角色
- class.yaml文件
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-jenkins-client
provisioner: xixi.io/nfs-subdir-external-provisioner
archiveOnDelete: "false"
name:nfs-jenkins-client(可以保持原样)
provisioner: xixi.io/nfs-subdir-external-provisioner(可以保持原样,在下面的deployment.yaml文件中用到)
- deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-jenkins-client-provisioner
labels:
app: nfs-jenkins-client-provisioner
# replace with namespace where provisioner is deployed
namespace: kube-system
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-jenkins-client-provisioner
template:
metadata:
labels:
app: nfs-jenkins-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-jenkins-client-provisioner
image: registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
# class.yaml 中的 provisioner保持一致
value: xixi.io/nfs-subdir-external-provisioner
- name: NFS_SERVER
value: 172.24.12.240
- name: NFS_PATH
value: /data/nfs/jenkins
volumes:
- name: nfs-client-root
nfs:
server: 172.24.12.240
path: /data/nfs/jenkins
- nfs的地址和目录路径必改,其他的可以保持原样
- rbac.yaml文件
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list"