当前k8s集群信息:
这次部署的Jenkins部署文件包含了后期连接K8S集群需要的SA,RBAC授权,deployment,service文件。只要持久卷准备好了,就可以拉起来了。如果不想启动时间过长,可以取消掉探针,加快启动速度。
注意:
这里需要使用云厂商的nfs服务或者自己部署好nfs存储做jenkins服务的持久卷,部署的文档可以参考我之前的文档。
nfs服务的部署。
EFS卷部署到EKS中
一. 使用 YAML 文件安装 Jenkins
1.1创建 Jenkins 部署文件
创建持久卷样例:
创建pv:
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-pv
spec:
capacity:
storage: 20Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: efs-sc
csi:
driver: efs.csi.aws.com
volumeHandle: fs-08axxxxxxxx #这里填你的EFS id号
创建pvc:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-pvc
namespace: devops
spec:
accessModes:
- ReadWriteMany
storageClassName: efs-sc
resources:
requests:
storage: 20Gi
创建jenkins.yaml文件:
# jenkins.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins
namespace: devops
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: jenkins
rules:
- apiGroups: ["extensions", "apps"]
resources: ["deployments", "ingresses"]
verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
- apiGroups: [""]
resources: ["services"]
verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
- apiGroups: [""]
resources: ["pods/log", "events"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: jenkins
namespace: devops
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: jenkins
subjects:
- kind: ServiceAccount
name: jenkins
namespace: devops
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: devops
spec:
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
serviceAccount: jenkins
initContainers:
- name: fix-permissions
image: busybox
command: ["sh", "-c", "chmod -R 777 /var/jenkins_home"]
volumeMounts:
- name: jenkinshome
mountPath: /var/jenkins_home
containers:
- name: jenkins
image: jenkins/jenkins:lts-jdk17
imagePullPolicy: Always
env:
- name: JAVA_OPTS
value: -Dhudson.model.DownloadService.noSignatureCheck=true
ports:
- containerPort: 8080
name: web
protocol: TCP
- containerPort: 50000
name: agent
protocol: TCP
resources:
limits:
cpu: 30000m
memory: 4096Mi
requests:
cpu: 1500m
memory: 2048Mi
readinessProbe:
httpGet:
path: /login
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
failureThreshold: 12
volumeMounts:
- name: jenkinshome
mountPath: /var/jenkins_home
volumes:
- name: jenkinshome
persistentVolumeClaim:
claimName: jenkins-pvc
---
apiVersion: v1
kind: Service
metadata:
name: jenkins
namespace: devops
labels:
app: jenkins
spec:
selector:
app: jenkins
ports:
- name: web
port: 8080
targetPort: web
---
apiVersion: v1
kind: Service
metadata:
name: jenkins-agent
namespace: devops
labels:
app: jenkins
spec:
selector:
app: jenkins
ports:
- name: agent
port: 50000
targetPort: agent
nodePort: 31217
type: NodePort
将上面的内容复制文本编辑器中,创建一个 jenkins.yaml 文件。
该部署文件定义了字段所示的部署kind。
Deployment 指定单个副本。这可确保在发生故障时复制控制器将维护一个且仅一个实例。
容器镜像名称为jenkins,版本为2.440.2
规范中指定的端口列表是要从 Pods IP 地址上的容器公开的端口列表。
Jenkins 在 (http) 端口 8080 上运行。
Pod暴露了jenkins容器的8080端口和50000端口。
该文件的volumeMounts部分创建一个持久卷。该卷安装在容器内的路径 /var/jenkins_home 中,因此对 /var/jenkins_home 中数据的修改将写入该卷。持久卷的作用是存储基本的 Jenkins 数据,并在 Pod 的生命周期结束后保留这些数据。这里用的efs做的持久卷,因为直接挂载上去提示没有权限写入,所以用了初始镜像将持久卷的权限先开放出来
将内容添加到 Jenkins 部署文件后退出并保存更改。
1.2部署Jenkins
kubectl apply -f jenkins.yaml
验证创建部署是否成功
2.授予对 Jenkins 服务的访问权限
现在部署了一个 Jenkins 实例,但仍然无法访问。Jenkins Pod 已分配一个 Kubernetes 集群内部的 IP 地址。可以登录 Kubernetes 节点并从那里访问 Jenkins,但这不是访问服务的非常有用的方式。
我这里使用了api网关将clusterIP的端口服务映射出一个jenkins.xxxxx.xxx的域名,用来提供出来访问。
该服务文件定义了该字段所指示的服务kind。
该服务的类型为 ClusterIP。其他选项包括 NodePort(在集群暴露出一个端口来提供访问)和 LoadBalancer(由云提供商分配的 IP 地址,例如 AWS Elastic IP)。
规范中指定的端口列表是此服务公开的端口列表。
该端口是将由服务公开的端口。
目标端口是访问该服务所针对的 Pod 的端口。还可以指定端口名称。
选择器指定此服务所针对的 Pod 的选择标准。
查看服务是否正常:
访问 Jenkins 仪表板
如果忘记了密码,可以查看密码
kubectl exec --namespace default -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/chart-admin-password && echo
输入账号密码 admin/wakewake123
评论区