准备k8s集群,在这里我就不详细的展示了可以去我另一篇帖子去准备k8s集群
kubectl create namespace devops
一条命令的事,简单的很,也可以写yaml文件,懒得写
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: jenkins-admin
rules:
- apiGroups: [""]
resources: ["*"]
verbs: ["*"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins-admin
namespace: devops
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: jenkins-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: jenkins-admin
subjects:
- kind: ServiceAccount
name: jenkins-admin
namespace: devops
简单介绍: 上述资源是创建了一个认证租户
ClusterRole定义的是一组权限,对所有的api组和资源具有全部的权限
ServiceAccount它代表一个应用程序或者组件,并具有访问集群中Kubernetes API的令牌
ClusterRoleBinding将前面定义的名为“jenkins-admin”的ServiceAccount绑定到名为“jenkins-admin”的ClusterRole上,使得该ServiceAccount具有了操作Kubernetes API的所有权限,同时这个ServiceAccount只能在“devops”命名空间内访问资源。
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-pv-volume
labels:
type: local
spec:
storageClassName: local-storage
claimRef:
name: jenkins-pv-claim
namespace: devops
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt/jenkins
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node1 ##这里更换为自己的k8s一个node节点名称,kubectl get nodes
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-pv-claim
namespace: devops
spec:
storageClassName: local-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
挂载卷配置说明
####StorageClass资源##########
provisioner: 定义存储类的提供者,即如何为应用程序提供存储卷。这里的值是 kubernetes.io/no-provisioner,表示该存储类不需要额外的动态卷的提供者。
volumeBindingMode: 定义卷的绑定模式,即如何将卷与 Pod 进行绑定。这里的值是 WaitForFirstConsumer,表示直到第一个使用该卷的 Pod 出现之前,该卷不会被绑定到任何节点上。
#######PersistentVolume#########
storageClassName: local-storage:指定存储类的名字,这里的存储类为“local-storage”。
claimRef:声明这个持久化卷被哪个声明(Persistent Volume Claim)所使用。
capacity:给这个持久化卷分配容量。
storage: 10Gi:分配10Gi的存储空间。
accessModes: 指定存储访问模式。
ReadWriteOnce: 仅允许单节点的读写模式访问。
local: 指定存储类型为本地存储。
path: /mnt/jenkins:指定该持久化卷的路径为“/mnt/jenkins”。
nodeAffinity: 指定节点亲和,即这个持久化卷只会被部署到特定的Kubernetes Node节点上。
required: 标明该节点亲和为必须的。
nodeSelectorTerms: 根据节点选择器进行匹配。
matchExpressions: 匹配表达式,用于指定这个持久化卷的节点。
key: kubernetes.io/hostname:指定匹配的键名为“kubernetes.io/hostname”。
operator: In:指定匹配方式为“in”。
values::指定匹配的值。
k8s-node1:匹配一个名为"k8s-node1"的Kubernetes Node节点。
pvc就没什么好解释得了,常见的配置,根据分配的存储绑定合适的pv
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: devops
spec:
replicas: 1
selector:
matchLabels:
app: jenkins-server
template:
metadata:
labels:
app: jenkins-server
spec:
securityContext:
fsGroup: 1000
runAsUser: 1000
serviceAccountName: jenkins-admin
containers:
- name: jenkins
image: jenkins/jenkins:2.369 #镜像这里用这个就行,版本是2.369,官方文档的镜像版本太低,好像是2.2版本的,不支持一些插件
imagePullPolicy: IfNotPresent
# resources:
# limits:
# memory: "2Gi"
# cpu: "1000m"
# requests:
# memory: "500Mi"
# cpu: "500m"
ports:
- name: httpport
containerPort: 8080
- name: jnlpport
containerPort: 50000
# livenessProbe:
# httpGet:
# path: "/login"
# port: 8080
# initialDelaySeconds: 90
# periodSeconds: 10
# timeoutSeconds: 5
# failureThreshold: 5
# readinessProbe:
# httpGet:
# path: "/login"
# port: 8080
# initialDelaySeconds: 60
# periodSeconds: 10
# timeoutSeconds: 5
# failureThreshold: 3
volumeMounts:
- name: jenkins-data
mountPath: /var/jenkins_home #这里为jenkins工作目录,挂载出来就好了,这样重启jenkins数据也不会丢失
volumes:
- name: jenkins-data
persistentVolumeClaim:
claimName: jenkins-pv-claim
apiVersion: v1
kind: Service
metadata:
name: jenkins-service
namespace: devops
annotations:
prometheus.io/scrape: 'true' #这一段是官方文档带的,是用来让prometheus(普罗米修斯)来识别pod的,可暂时不用管他
prometheus.io/path: /
prometheus.io/port: '8080'
spec:
selector:
app: jenkins-server
type: NodePort
ports:
- name: http
port: 8080
targetPort: 8080
nodePort: 32000
- name: agent
port: 50000
targetPort: 50000
nodePort: 50000
你说你50000端口没挂载上,你就不会百度问问????
vim /etc/kubernetes/manifests/kube-apiserver.yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 10.0.0.120:6443
creationTimestamp: null
labels:
component: kube-apiserver
tier: control-plane
name: kube-apiserver
namespace: kube-system
spec:
containers:
- command:
- kube-apiserver
- --service-node-port-range=3000-55000 #这行默认没有,自己给他加上,那端口范围我就不用解释了吧
- --advertise-address=10.0.0.120
- --allow-privileged=true
- --authorization-mode=Node,RBAC
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --enable-admission-plugins=NodeRestriction
- --enable-bootstrap-token-auth=true
- --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
- --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
改完什么都不用操作,他自己会更改,不用重启
yaml文件可以都放在一个目录下
kubectl apply -f .
查看pod是否正常启动
查看svc资源是否正常启动
可以看到资源已经正常启动
pod被部署在node1上,直接访问node1宿主机ip+端口
出现这个web界面就证明 jenkins部署成功了
密码可以查看pod的log日志获取
复制密码输入
这两个语言安装上
等待安装
创建用户
这样jenkins就在k8s集群中搭建好了
成功
创建的111文件在挂载目录下的workspace
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有