Merge branch 'jenkins'
commit
2c794a9399
|
@ -1,38 +1,31 @@
|
|||
# Jenkins Kubernetes Integration
|
||||
# Jenkins in Kubernetes
|
||||
|
||||
## Kubernetes Setup
|
||||
|
||||
Create *jenkins* user:
|
||||
|
||||
```sh
|
||||
kubeadm kubeconfig user \
|
||||
--client-name jenkins \
|
||||
--config kubeadm-user.yaml \
|
||||
--org jenkins \
|
||||
> jenkins.kubeconfig
|
||||
```
|
||||
|
||||
Configure Jenkins resources:
|
||||
|
||||
```sh
|
||||
kubectl apply -f jenkins.yaml
|
||||
ln imagepull-gitea jenkins/.dockerconfigjson
|
||||
kubectl apply -k jenkins
|
||||
```
|
||||
|
||||
|
||||
## Jenkins Setup
|
||||
|
||||
Install [Kubernetes plugin][0].
|
||||
|
||||
Set *TCP port for inbound agents* setting (*Manage Jenkins* → *Configure Global
|
||||
Security*) to *Fixed* and enter a number. Be sure to open this port with
|
||||
*firewalld* on the Jenkins server.
|
||||
Security*) to *Fixed* and enter `40414`.
|
||||
|
||||
Configure Kubernetes (*Manage Jenkins* → *Manage Nodes and Clouds* → *Configure
|
||||
Clouds*:
|
||||
|
||||
* *Kubernetes URL*: https://kubernetes.pyrocufflink.blue:6443
|
||||
* *Kubernetes server certificate key*: Contents of `/etc/kubernetes/pki/ca.crt`
|
||||
* *Kubernetes Namespace*: jenkins
|
||||
* *Credentials*: Certificate and private key from `jenkins.kubeconfig`
|
||||
1. *Add a new cloud* → *Kubernetes*
|
||||
2. Enter a name
|
||||
3. *Kubernetes Cloud details...*
|
||||
* *Kubernetes URL*: (leave blank; will use Kubernetes service discovery)
|
||||
* *Kubernetes Namespace*: `jenkins-jobs`
|
||||
* *Credentials*: `- none -` (will use Service Account token)
|
||||
* *Jenkins tunnel*: `jenkins.jenkins.svc.cluster.local:` (trailing colon!)
|
||||
|
||||
|
||||
[0]: https://plugins.jenkins.io/kubernetes/
|
||||
|
|
|
@ -3,12 +3,43 @@ kind: Namespace
|
|||
metadata:
|
||||
name: jenkins
|
||||
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: jenkins-jobs
|
||||
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: jenkins
|
||||
namespace: jenkins
|
||||
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: jenkins
|
||||
namespace: jenkins
|
||||
labels:
|
||||
app.kubernetes.io/name: jenkins
|
||||
app.kubernetes.io/component: master
|
||||
app.kubernetes.io/instance: jenkins
|
||||
app.kubernetes.io/part-of: jenkins
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 20Gi
|
||||
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: Role
|
||||
metadata:
|
||||
name: jenkins
|
||||
namespace: jenkins
|
||||
namespace: jenkins-jobs
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ''
|
||||
|
@ -23,13 +54,106 @@ rules:
|
|||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: RoleBinding
|
||||
metadata:
|
||||
name: jenkins-binding
|
||||
namespace: jenkins
|
||||
name: jenkins
|
||||
namespace: jenkins-jobs
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: Role
|
||||
name: jenkins
|
||||
subjects:
|
||||
- apiGroup: rbac.authorization.k8s.io
|
||||
kind: User
|
||||
- kind: ServiceAccount
|
||||
name: jenkins
|
||||
namespace: jenkins
|
||||
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: master
|
||||
app.kubernetes.io/name: jenkins
|
||||
app.kubernetes.io/instance: jenkins
|
||||
app.kubernetes.io/part-of: jenkins
|
||||
name: jenkins
|
||||
namespace: jenkins
|
||||
spec:
|
||||
ports:
|
||||
- name: http
|
||||
port: 8080
|
||||
- name: jnlp
|
||||
port: 40414
|
||||
selector:
|
||||
app.kubernetes.io/component: master
|
||||
app.kubernetes.io/name: jenkins
|
||||
app.kubernetes.io/instance: jenkins
|
||||
type: ClusterIP
|
||||
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: jenkins
|
||||
namespace: jenkins
|
||||
labels:
|
||||
app.kubernetes.io/name: jenkins
|
||||
app.kubernetes.io/component: master
|
||||
app.kubernetes.io/instance: jenkins
|
||||
app.kubernetes.io/part-of: jenkins
|
||||
spec:
|
||||
serviceName: jenkins
|
||||
selector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/name: jenkins
|
||||
app.kubernetes.io/component: master
|
||||
app.kubernetes.io/instance: jenkins
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/name: jenkins
|
||||
app.kubernetes.io/component: master
|
||||
app.kubernetes.io/instance: jenkins
|
||||
spec:
|
||||
containers:
|
||||
- name: jenkins
|
||||
image: docker.io/jenkins/jenkins:lts
|
||||
imagePullPolicy: Always
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: 8080
|
||||
- name: jnlp
|
||||
containerPort: 40414
|
||||
volumeMounts:
|
||||
- name: jenkins-data
|
||||
mountPath: /var/jenkins_home
|
||||
securityContext:
|
||||
runAsUser: 1000
|
||||
fsGroup: 1000
|
||||
fsGroupChangePolicy: OnRootMismatch
|
||||
serviceAccountName: jenkins
|
||||
volumes:
|
||||
- name: jenkins-data
|
||||
persistentVolumeClaim:
|
||||
claimName: jenkins
|
||||
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: jenkins
|
||||
namespace: jenkins
|
||||
spec:
|
||||
ingressClassName: nginx
|
||||
rules:
|
||||
- host: jenkins.pyrocufflink.blue
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: jenkins
|
||||
port:
|
||||
name: http
|
||||
tls:
|
||||
- hosts:
|
||||
- jenkins.pyrocufflink.blue
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
|
||||
resources:
|
||||
- jenkins.yaml
|
||||
|
||||
secretGenerator:
|
||||
- name: imagepull-gitea
|
||||
namespace: jenkins
|
||||
type: kubernetes.io/dockerconfigjson
|
||||
files:
|
||||
- .dockerconfigjson
|
Loading…
Reference in New Issue