k8s简单部署jenkins服务
1.因为我的k8s集群是使用glusterfs+heketi作为pvc的存储,所以需提前准备好
2.准备pvc的yaml文件
jenkins-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: heketi-storage
resources:
requests:
storage: 10Gi
创建PVC,kubectl apply -f jenkins-pvc.yaml -n jenkins (pv由heketi管理的storageclass自动创建)
-n 是属于你jenkins的命名空间,也可以使用默认的default
如果提示没有命名空间则创建一个
jenkins-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: jenkins
3.创建ServiceAccount & ClusterRoleBinding
此 kubernetes 集群用的是 RBAC 安全插件,必须创建权限给一个 ServiceAccount,然后将此 ServiceAccount 绑定到 Jenkins 服务,这样赋予 Jenkins 服务一定权限执行一些操作,为了方便,这里将 cluster-admin 绑定到 ServiceAccount 以保证 Jenkins 能拥有一定的权限。
jenkins-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins-admin #ServiceAccount名
namespace: jenkins
labels:
name: jenkins
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: jenkins-admin
labels:
name: jenkins
subjects:
- kind: ServiceAccount
name: jenkins-admin
namespace: jenkins
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
kubectl apply -f jenkins-rabc.yaml
4.创建 Service & Deployment
这里开始部署 Jenkins 服务,创建 Service 与 Deployment,其中 Service 暴露两个接口 80880 与 50000。而 Deployment 里面要注意的是要设置上面创建的 ServiceAccount ,并且设置容器安全策略为“runAsUser: 0”以 Root 权限运行容器,而且暴露8080、50000两个端口。
jenkins-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: jenkins
labels:
app: jenkins
spec:
selector:
matchLabels:
app: jenkins
replicas: 1
template:
metadata:
labels:
app: jenkins
spec:
serviceAccountName: jenkins-admin
containers:
- name: jenkins
image: harbor.aift.ftwhale.com/library/jenkins/jenkins:2.250
securityContext:
runAsUser: #设置以ROOT用户运行容器
privileged: true #拥有特权
ports:
- name: http
containerPort: 8080
- name: jnlp
containerPort: 50000
resources:
limits:
memory: "2Gi"
cpu: "1000m"
requests:
memory: "1Gi"
cpu: "500m"
env:
- name: LIMITS_MEMORY
valueFrom:
resourceFieldRef:
resource: limits.memory
divisor: 1Mi
- name: "JAVA_OPTS" #设置变量,指定时区和 jenkins slave 执行者设置
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
"
- name: "JENKINS_OPTS"
value: "--prefix=/jenkins" #设置路径前缀加上 Jenkins
volumeMounts: #设置要挂在的目录
- name: data
mountPath: /var/jenkins_home
volumes:
- name: data
persistentVolumeClaim:
claimName: jenkins-pvc #设置PVC
jenkins-service.yaml
apiVersion: v1
kind: Service
metadata:
name: jenkins
labels:
app: jenkins
spec:
type: NodePort
ports:
- name: http
port: 8080 #服务端口
targetPort: 8080
nodePort: 28080 #NodePort方式暴露 Jenkins 端口
- name: jnlp
port: 50000 #代理端口
targetPort: 50000
nodePort: 30000
selector:
app: jenkins
参数说明:
- JAVA_OPTS: JVM 参数设置
- JENKINS_OPTS: Jenkins 参数设置
- 设置执行任务时候不等待:
默认情况下,Jenkins生成代理是保守的。例如,如果队列中有两个构建,它不会立即生成两个执行器。它将生成一个执行器,并等待某个时间释放第一个执行器,然后再决定生成第二个执行器。Jenkins确保它生成的每个执行器都得到了最大限度的利用。如果你想覆盖这个行为,并生成一个执行器为每个构建队列立即不等待,所以在Jenkins启动时候添加这些参数:
- -Dhudson.slaves.NodeProvisioner.initialDelay=0
- -Dhudson.slaves.NodeProvisioner.MARGIN=50
- -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
5.部署jenkins
kubectl apply -f jenkins-deployments
kubectl apply -f jenkins-service -n jenkins
6.从日志中查看密码并登录jenkins
kubectl log $(kubectl get pod -n jenkins|grep jenkin|awk '{print $1}') -n jenkins
7.插件安装(可选)
选择你想要的插件或者默认推荐,第一次可能需要较长的时间,请保持网络通畅