安装 NFS 服务端
powershell
sudo apt update
sudo apt install -y nfs-kernel-server
# 创建挂载路径
sudo mkdir -p /mnt/nfs_data
# 修改配置
vim /etc/exports
# 允许 所有网段读写,同步写入,保留客户端 root 权限
# *要挨着括号
/mnt/nfs_data *(rw,sync,no_root_squash)
# 重新加载所有共享(-a:全部,-r:重新导出,-v:详细输出)
exportfs -arv
# 启动 NFS 服务
systemctl restart nfs-kernel-server && systemctl enable nfs-kernel-server
# 检查状态
systemctl status nfs-kernel-server
# 检查是否挂载好
showmount -e localhost

创建 namespaces
powershell
kubectl create ns jenkins

PV 的 yaml文件
一个使用 NFS 存储卷的 PV 示例
yaml
# pv-nfs.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-2g
spec:
volumeMode: Filesystem # 存储卷模式,默认为 Filesystem (文件系统) 和 Block(块)
capacity: # 存储能力
storage: 2Gi # 容量大小,Gi 或 Mi
accessModes: # 访问模式
- ReadWriteMany # 访问模式
persistentVolumeReclaimPolicy: Retain # 回收策略
storageClassName: nfs
nfs: # 持久卷类型(如 hostPath、nfs、ceph 等)
path: /mnt/nfs_data/pv_nfs_2g # 存储路径要确保已经存在
server: 10.0.3.100
创建pv
powershell
kubectl apply -f pv-nfs.yaml

PVC 的 yaml文件
yaml
# pvc-jenkins.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-jenkins
namespace: jenkins # 与 Deployment 同命名空间
spec:
accessModes:
- ReadWriteMany # 与 pv 里面的相同
resources:
requests:
storage: 2Gi
volumeName: pv-nfs-2g # 与 PV 的 Name 一致
storageClassName: nfs # 与 PV 的 StorageClass 一致
创建pvc
powershell
kubectl apply -f pvc-jenkins.yaml

创建deploy
kubectl apply -f deploy_jenkins.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: jenkins
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: jenkins-server
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: jenkins-server
spec:
containers:
- image: docker.io/jenkins/jenkins:jdk17
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
path: /login
port: 8080
scheme: HTTP
initialDelaySeconds: 300
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
timeoutSeconds: 5
name: jenkins
ports:
- containerPort: 8080
name: httpport
protocol: TCP
- containerPort: 50000
name: jnlpport
protocol: TCP
readinessProbe:
httpGet:
path: /login
port: 8080
scheme: HTTP
initialDelaySeconds: 120
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
timeoutSeconds: 5
resources:
limits:
cpu: "2"
memory: 4Gi
requests:
cpu: "1"
memory: 1Gi
securityContext:
privileged: true
runAsUser: 0
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/jenkins_home
name: jenkins-data
restartPolicy: Always
terminationGracePeriodSeconds: 30
volumes:
- name: jenkins-data
persistentVolumeClaim:
claimName: pvc-jenkins
创建svc
kubectl apply -f svc_jenkins.yaml
yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: jenkins-server
name: jenkins-svc
namespace: jenkins
spec:
ports:
- name: service-jenkins
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: jenkins-server
type: ClusterIP
创建Ingress Controller
Ingress资源要正常工作,集群中必须要有个Ingress Controller来解析Ingress的转发规则
参考文档:https://blog.csdn.net/weixin_46887489/article/details/134586363
查看集群中定义的 IngressClass
powershell
kubectl get ingressclass

创建Ingress
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: jenkins
namespace: jenkins
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
nginx.ingress.kubernetes.io/whitelist-source-range: "0.0.0.0/0"
spec:
ingressClassName: nginx-master
rules:
- host: jenkinss.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: jenkins-svc
port:
number: 8080

本地配置hosts
域名任意配置一个节点的IP

curl 测试
curl jenkinss.com 如下图这样就代表部署成功,后续用浏览器就能直接打开
