在 Kubernetes 集群中部署 Jenkins



我在 Kubernetes 中乞求并试图在集群中部署 Jenkins,但 pod 正在挂起。

我需要能够访问 kubernetes 的 jenkins,包括访问 docker 和 kubectl 命令,以便与我的微服务进行连续集成。

有了这个示例yaml文件,我可以通过Minikube在本地机器(我的笔记本(上启动一个jenkins实例。

但现在我正在尝试使用云集群作为我研究领域的一部分。

我接受改进建议。

正如我所说:我只想上传一个 jenkins 实例,我可以不断集成我的微服务。

这些是我的配置和日志。

我的错误是什么?

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: jenkins-rbac
subjects:
- kind: ServiceAccount
name: default
namespace: default
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: jenkins
labels:
type: local
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/data/jenkins/"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jenkins-claim
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
---
apiVersion: v1
kind: Service
metadata:
name: jenkins
labels:
app: jenkins
spec:
ports:
- port: 80
targetPort: 8080
nodePort: 32256
selector:
app: jenkins
tier: jenkins
type: NodePort
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: jenkins
labels:
app: jenkins
spec:
strategy:
type: Recreate
template:
metadata:
labels:
app: jenkins
tier: jenkins
spec:
containers:
- image: sammubr/jenkins
name: jenkins
securityContext:
privileged: true
ports:
- containerPort: 8080
name: jenkins
volumeMounts:
- name: jenkins-persistent-storage
mountPath: /var/jenkins_home
- name: docker
mountPath: /var/run/docker.sock
volumes:
- name: docker
hostPath:
path: /var/run/docker.sock
- name: jenkins-persistent-storage
persistentVolumeClaim:
claimName: jenkins-claim

然后kubectl --context do-sfo2-teste-cluster apply -f jenkins.yaml

但一直悬而未决:

samuel@samuel-Inspiron-5548:~/Documentos/teste/jenkins$ kubectl get all
NAME                           READY   STATUS    RESTARTS   AGE
pod/jenkins-5dc7fbd78d-9wxfl   0/1     Pending   0          8m34s
NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/jenkins      NodePort    10.245.30.47   <none>        80:32256/TCP   8m34s
service/kubernetes   ClusterIP   10.245.0.1     <none>        443/TCP        79m
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/jenkins   0/1     1            0           8m35s
NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/jenkins-5dc7fbd78d   1         1         0       8m35s
samuel@samuel-Inspiron-5548:~/Documentos/teste/jenkins$ kubectl describe pod/jenkins-5dc7fbd78d-9wxfl
Name:               jenkins-5dc7fbd78d-9wxfl
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               <none>
Labels:             app=jenkins
pod-template-hash=5dc7fbd78d
tier=jenkins
Annotations:        <none>
Status:             Pending
IP:                 
Controlled By:      ReplicaSet/jenkins-5dc7fbd78d
Containers:
jenkins:
Image:        sammubr/jenkins
Port:         8080/TCP
Host Port:    0/TCP
Environment:  <none>
Mounts:
/var/jenkins_home from jenkins-persistent-storage (rw)
/var/run/docker.sock from docker (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-5wdgs (ro)
Conditions:
Type           Status
PodScheduled   False 
Volumes:
docker:
Type:          HostPath (bare host directory volume)
Path:          /var/run/docker.sock
HostPathType:  
jenkins-persistent-storage:
Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName:  jenkins-claim
ReadOnly:   false
default-token-5wdgs:
Type:        Secret (a volume populated by a Secret)
SecretName:  default-token-5wdgs
Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type     Reason            Age               From               Message
----     ------            ----              ----               -------
Warning  FailedScheduling  7s (x8 over 10m)  default-scheduler  pod has unbound immediate PersistentVolumeClaims (repeated 2 times)

正如@ortomala-lokni前面提到的,你遇到了一个问题,即未绑定的PersistentVolumeClaims到PersitanceVolume之前声明的,这最终导致Jenkins Pod无法启动。

在 @ortomala-lokni 对 SO 类似问题的共享链接中,可以阅读此错误的各种原因以及如何修复它们。

在您的特定情况下,PVC 的需求与集群上实际配置的 PV 之间的不匹配是在访问模式(ReadWriteOnce 与 ReadWriteMany(中。

要解决您的问题,请相应地更新"持久卷声明"定义,应如下所示:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jenkins-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi

注意:
您不需要具有 Jenkins Pod 的单个副本的"ReadWriteMany"访问模式。这是因为在"jenkins"部署的当前定义下,部署控制器会在后台创建一个 ReplicaSet 对象,默认情况下,该对象确保只有 Jenkins Pod 的单个实例正在运行(= 简化只有 Jenkins 服务器的单个实例将一次写入此卷(。

请在这里找到另一个教程,介绍如何使用 helm 从头开始在 Kubernetes 上设置 Jenkins(推荐方式(。

删除持久卷定义文件中的引号 在行:

hostPath:
path: "/data/jenkins/"

正确的文件应如下所示:

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: jenkins-rbac
subjects:
- kind: ServiceAccount
name: default
namespace: default
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: jenkins
labels:
type: local
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/jenkins/
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jenkins-claim
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
---
apiVersion: v1
kind: Service
metadata:
name: jenkins
labels:
app: jenkins
spec:
ports:
- port: 80
targetPort: 8080
nodePort: 32256
selector:
app: jenkins
tier: jenkins
type: NodePort
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: jenkins
labels:
app: jenkins
spec:
strategy:
type: Recreate
template:
metadata:
labels:
app: jenkins
tier: jenkins
spec:
containers:
- image: sammubr/jenkins
name: jenkins
securityContext:
privileged: true
ports:
- containerPort: 8080
name: jenkins
volumeMounts:
- name: jenkins-persistent-storage
mountPath: /var/jenkins_home
- name: docker
mountPath: /var/run/docker.sock
volumes:
- name: docker
hostPath:
path: /var/run/docker.sock
- name: jenkins-persistent-storage
persistentVolumeClaim:
claimName: jenkins-claim

应用更改;

$ kubectl apply -f your-config-file.yaml

有关 PersistentVolumes 和PersistentVolumeClaims的更多信息,您可以在此处找到:持久卷。

最新更新