1-1 k8s搭建jenkins
1、创建名称空间
kubectl create namespace jenkins-k8s
2、创建持久卷
apiVersion: v1 kind: PersistentVolume metadata: name: jenkins-k8s-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain nfs: path: /data/v2 server: 192.168.72.123
-
spec:定义了PersistentVolume的具体规格。capacity:定义了卷的容量。storage: 5Gi:表示这个卷提供5GiB的存储空间。
accessModes:定义了卷的访问模式。- ReadWriteMany:表示这个卷可以被多个节点以读写模式挂载。这对于需要被多个Pod同时访问的卷非常有用,比如NFS(网络文件系统)卷。
persistentVolumeReclaimPolicy:定义了当PersistentVolume不再被任何PersistentVolumeClaim(PVC)绑定时,应该采取的行动。Retain:表示保留卷,即即使PVC被删除,卷也会被保留。管理员需要手动回收这个卷。
nfs:指定了卷的类型是NFS(网络文件系统)。path: /data/v2:NFS服务器上卷的路径,即NFS服务器上的/data/v2目录将被用作Kubernetes中的卷。server: 192.168.72.123:NFS服务器的IP地址,这里是192.168.72.123。这个IP地址应该是NFS服务器在网络中的可访问地址。
kubectl apply -f pv.yaml
2、创建持久卷声明
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: jenkins-k8s-pvc namespace: jenkins-k8s spec: resources: requests: storage: 5Gi accessModes: - ReadWriteMany
-
kind: PersistentVolumeClaim:指明了这个YAML文件定义的资源类型是PersistentVolumeClaim。PersistentVolumeClaim(PVC)是用户或管理员对存储资源的请求。 -
apiVersion: v1:指定了Kubernetes API的版本,这里是v1,表示使用的是Kubernetes的核心API版本。 -
metadata:包含了关于这个PersistentVolumeClaim的元数据。name: jenkins-k8s-pvc:定义了PersistentVolumeClaim的名称,这里是jenkins-k8s-pvc。这个名称在指定的命名空间中应该是唯一的。namespace: jenkins-k8s:指定了这个PersistentVolumeClaim所属的命名空间,这里是jenkins-k8s。命名空间用于将集群中的资源逻辑上划分成不同的组,以便更好地管理和隔离。
-
spec:定义了PersistentVolumeClaim的具体规格。resources:定义了请求的资源。requests:指定了资源请求的具体内容。storage: 5Gi:表示请求5GiB的存储空间。
accessModes:定义了卷的访问模式。- ReadWriteMany:表示这个卷可以被多个节点以读写模式挂载。这对于需要被多个Pod同时访问的卷非常有用,但需要注意的是,并非所有类型的存储都支持ReadWriteMany模式。例如,NFS通常支持此模式,而某些块存储设备可能不支持。
执行apply
kubectl apply -f pvc.yaml
4、创建一个SA账号
kubectl create sa jenkins-k8s-sa -n jenkins-k8s
在jenkins-k8s命令空间下创建名为jenkins-k8s-sa的sa账号
5、对SA账号做RBAC授权
kubectl create clusterrolebinding jenkins-k8s-sa-cluster --clusterrole=cluster-admin --serviceaccount=jenkins-k8s:jenkins-k8s-sa
-
kubectl create clusterrolebinding:这是kubectl命令的一部分,用于创建一个新的ClusterRoleBinding资源。ClusterRoleBinding用于将ClusterRole(集群级别的角色)绑定到特定的用户、组或服务账户上,从而控制这些实体在集群范围内可以执行的操作。 -
jenkins-k8s-sa-cluster:这是你给新创建的ClusterRoleBinding指定的名称。这个名称在集群中应该是唯一的,用于标识这个绑定。 -
--clusterrole=cluster-admin:这个选项指定了要绑定的ClusterRole的名称。cluster-admin是一个内置的ClusterRole,它拥有对集群中几乎所有资源的最高权限。这意味着任何绑定到这个ClusterRole的实体都可以执行集群中的任何操作。 -
--serviceaccount=jenkins-k8s:jenkins-k8s-sa:这个选项指定了要绑定到ClusterRole的服务账户(ServiceAccount)的名称。服务账户是Kubernetes中用于Pod的自动化身份认证的一种机制。在这个例子中,jenkins-k8s是命名空间的名称,jenkins-k8s-sa是服务账户的名称。因此,这个命令将cluster-admin角色绑定到了jenkins-k8s命名空间中的jenkins-k8s-sa服务账户上。
6、通过Deployment部署Jenkins
apiVersion: apps/v1 kind: Deployment metadata: name: jenkins namespace: jenkins-k8s # 你可以指定一个不同的命名空间,如果默认命名空间不是你想要的 spec: replicas: 1 # 指定要运行的Pod副本数量 selector: matchLabels: app: jenkins # 用于匹配Pod的标签 template: metadata: labels: app: jenkins spec: serviceAccount: jenkins-k8s-sa # 指定了Pod使用的ServiceAccount为jenkins-k8s-satolerations: # 定义了Pod可以容忍的污点(taint),这里配置了容忍master节点的污点,允许Pod调度到master节点上。 - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule" containers: # 定义了Pod中的容器。 - name: jenkins # 容器的名称。 image: jenkins/jenkins:jdk17 # 容器使用的镜像和标签,这里使用的是jenkins/jenkins:jdk17。这里使用的镜像是每周最新版虽然官方社区说最新版的lts版本也可以但是有些插件还是装不上 imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有镜像则拉取 # jenkins的插件安装很麻烦,所以这里只用这个jenkins:jdk17每周最新版的镜像安装插件没有任何问题,因为这个镜像是dockerhub上的所以还需要****才可以拉取 ports: - containerPort: 8080 # 容器内部监听的端口 name: web protocol: TCP - containerPort: 50000 # Jenkins Agent监听的端口。 name: agent protocol: TCP resources: # 定义了容器的资源限制和请求。(这里资源设置太小也可能造成pod无法创建) limits: cpu: 1000m memory: 700Mi requests: cpu: 500m memory: 512Mi #livenessProbe: # 以下带注释的代码行都是配置健康检查的由于创建后造成健康检查失败故先注释掉 # httpGet: # path: /login # port: 8080 #initialDelaySeconds: 60 #timeoutSeconds: 5 #failureThreshold: 12 #readinessProbe: # httpGet: # path: /login # port: 8080 #initialDelaySeconds: 60 #timeoutSeconds: 5 #failureThreshold: 12 volumeMounts: # 定义了容器挂载的卷 - name: jenkins-volume # 挂载PersistentVolumeClaim(PVC)到/var/jenkins_home 用于持久化Jenkins数据 (在master主节点宿主机上的实际目录为/data/v2/jenkins-home/)subPath: jenkins-home mountPath: /var/jenkins_home - name: docker-sock # 允许Jenkins在容器内直接与Docker交互(为了这个jenkins的docker容器中使用docker命令) mountPath: /var/run/docker.sock - name: docker mountPath: /usr/bin/docker volumes: #volumes:定义了Pod中使用的卷。 - name: jenkins-volume persistentVolumeClaim: claimName: jenkins-k8s-pvc - name: docker-sock hostPath: path: /var/run/docker.sock - name: docker hostPath: path: /usr/bin/docker
创建完成后执行apply命令
※ 注意上面实现volumeMounts挂载卷这一块还要先在master主节点上创建nfs服务、node从节点上创建nfs客户端 (详情见 https://i.cnblogs.com/articles/edit;postId=18312811 kubernetes nfs共享盘设置)
kubectl apply -f jenkins-deployment.yaml
执行完成后查看jenkins时候创建成功
kubectl get pods -n jenkins-k8s
查看pod的日志和描述如果是镜像拉取失败,检查看看docker镜像加速是否配置成功 docker pull拉取试试、如果再不行则试试
kubectl logs jenkins-6d865ffc84-4nhf6 -n jenkins-k8s、kubectl describe pod jenkins-85cf94b9c6-47gjl -n jenkins-k8s
还是可能是EXITED状态的容器太多,执行删除所有已退出的容器:docker container prune再试试
其他再检查下内存是否够
7、在jenkins前端加上service,提供外部网络访问
apiVersion: v1 kind: Service metadata: name: jenkins-service namespace: jenkins-k8s labels: app: jenkins spec: selector: app: jenkins type: NodePort ports: - name: web port: 8080 targetPort: web nodePort: 30002 - name: agent port: 50000 targetPort: agent
执行apply
kubectl apply -f jenkins-service.yaml
8、配置jenkins
安装完成后浏览器访问节点的ip:30002即可
(浏览器版本太旧可能会造成显示页面不全,可以试试新版本的浏览器)
国内清华源镜像设置地址
Jenkins镜像源设置
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
浙公网安备 33010602011771号