本文共 4485 字,大约阅读时间需要 14 分钟。
Jenkins是很多公司开发中CI/CD用到的开源工具,但是开源里没有针对其提供高可用的方案,同时如果给每个Jenkins服务都分配一台机器,资源将比较浪费。另外在一个问题是大型一点的公司,为了能消除团队相互间的干扰,很可能是每个开发团队有自己的Jenkins服务器,,这又引入新的问题,将如何同时管理好这么多的Jenkins服务机器/集群,如果出错又该如何回复呢等等?
本文将通过容器+分布式存储的方式来构建容易维护的Jenkins集群,但是受制于Jenkins的实现机制,一个集群只能部署一个master实例,有Kubernetes的自动恢复容器的机制来保证高可用,后续再介绍如何使用容器的方式运行多个Jenkins Slave
这里挂载点的域名就是之前配置后得到的挂载点地址
这里定义的PVC的名字为:jenkins
,后面部署容器需要用到
kube-ops
apiVersion: v1kind: Namespacemetadata: name: kube-ops
apiVersion: v1kind: ServiceAccountmetadata: name: jenkins namespace: kube-ops---apiVersion: rbac.authorization.k8s.io/v1beta1kind: Rolemetadata: name: jenkins namespace: kube-opsrules: - 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"] verbs: ["get","list","watch"] - apiGroups: [""] resources: ["secrets"] verbs: ["get"]---apiVersion: rbac.authorization.k8s.io/v1beta1kind: RoleBindingmetadata: name: jenkins namespace: kube-opsroleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: jenkinssubjects: - kind: ServiceAccount name: jenkins namespace: kube-ops
---apiVersion: v1kind: Deploymentmetadata: name: jenkins namespace: kube-opsspec: template: metadata: labels: app: jenkins spec: terminationGracePeriodSeconds: 10 containers: - name: jenkins image: jenkins:latest imagePullPolicy: IfNotPresent ports: - containerPort: 8080 name: web protocol: TCP - containerPort: 50000 name: agent protocol: TCP resources: limits: cpu: 4000m memory: 4Gi requests: cpu: 2000m memory: 4Gi livenessProbe: httpGet: path: /login port: 8080 initialDelaySeconds: 90 timeoutSeconds: 5 failureThreshold: 12 readinessProbe: httpGet: path: /login port: 8080 initialDelaySeconds: 90 timeoutSeconds: 5 failureThreshold: 12 volumeMounts: - name: jenkinshome subPath: jenkins mountPath: /var/jenkins_home env: - name: LIMITS_MEMORY valueFrom: resourceFieldRef: resource: limits.memory divisor: 1Mi - name: JAVA_OPTS value: -Xmx$(LIMITS_MEMORY)m -XshowSettings:vm -Dhudson.slaves.NodeProvisioner.initialDelay=0 -Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85 -Duser.timezone=Asia/Shanghai securityContext: fsGroup: 1000 volumes: - name: jenkinshome persistentVolumeClaim: claimName: jenkins---apiVersion: v1kind: Servicemetadata: name: jenkins namespace: kube-ops labels: app: jenkinsspec: selector: app: jenkins ports: - name: web port: 8080 targetPort: web - name: agent port: 50000 targetPort: agent
apiVersion: extensions/v1beta1kind: Ingressmetadata: name: jenkins-ingress namespace: kube-ops annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/affinity: cookie nginx.ingress.kubernetes.io/session-cookie-hash: sha1 nginx.ingress.kubernetes.io/session-cookie-name: route spec: rules: - host: testjenkins.com http: paths: - backend: serviceName: jenkins servicePort: 8080
在客户端主机的配置testjenkins.com和对应的Ingress的SLB的IP的映射,然后通过浏览器访问testjenkins.com:就可
No valid crumb
问题(参考: ),解决办法是在Jenkins的安全配置里设置(系统管理->Configure Global Security)激活代理兼容
:转载地址:http://drkdm.baihongyu.com/