前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我要在k8s上部署jenkins(简单)

我要在k8s上部署jenkins(简单)

原创
作者头像
dgds
修改2023-05-26 15:18:47
2.1K0
修改2023-05-26 15:18:47
举报
文章被收录于专栏:dgds的运维

官方地址

jenkins官方网址部署在k8s集群上

1.环境准备

准备k8s集群,在这里我就不详细的展示了可以去我另一篇帖子去准备k8s集群

另一篇帖子

2.编写yaml文件

1)创建名称空间

代码语言:txt
复制
kubectl create namespace devops
一条命令的事,简单的很,也可以写yaml文件,懒得写

2)创建认证管理

代码语言:txt
复制
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”命名空间内访问资源。

3)创建挂载卷

代码语言:txt
复制
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
代码语言:txt
复制
挂载卷配置说明
####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

4)创建deployment资源

代码语言:txt
复制
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

5)创建service资源

代码语言:txt
复制
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
代码语言:txt
复制
你说你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



    改完什么都不用操作,他自己会更改,不用重启

6)启动资源

代码语言:txt
复制
yaml文件可以都放在一个目录下
kubectl apply -f .

7)访问jenkins

代码语言:txt
复制
查看pod是否正常启动
查看svc资源是否正常启动

可以看到资源已经正常启动

pod被部署在node1上,直接访问node1宿主机ip+端口

出现这个web界面就证明 jenkins部署成功了

密码可以查看pod的log日志获取

复制密码输入

这两个语言安装上

等待安装

创建用户

这样jenkins就在k8s集群中搭建好了

成功

创建的111文件在挂载目录下的workspace

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 官方地址
  • 1.环境准备
  • 2.编写yaml文件
    • 1)创建名称空间
      • 2)创建认证管理
        • 3)创建挂载卷
          • 4)创建deployment资源
            • 5)创建service资源
              • 6)启动资源
                • 7)访问jenkins
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档