侧边栏壁纸
  • 累计撰写 208 篇文章
  • 累计创建 16 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

在 EKS中如何安装Jenkins

Wake
2023-08-04 / 0 评论 / 4 点赞 / 1,330 阅读 / 1,278 字

当前k8s集群信息:
image-1711531165060
这次部署的Jenkins部署文件包含了后期连接K8S集群需要的SA,RBAC授权,deployment,service文件。只要持久卷准备好了,就可以拉起来了。如果不想启动时间过长,可以取消掉探针,加快启动速度。

注意:
这里需要使用云厂商的nfs服务或者自己部署好nfs存储做jenkins服务的持久卷,部署的文档可以参考我之前的文档。
nfs服务的部署
EFS卷部署到EKS中

一. 使用 YAML 文件安装 Jenkins

1.1创建 Jenkins 部署文件

创建持久卷样例:
创建pv:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-pv
spec:
  capacity:
    storage: 20Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-08axxxxxxxx   #这里填你的EFS id号

创建pvc:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pvc
  namespace: devops
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: efs-sc
  resources:
    requests:
      storage: 20Gi

创建jenkins.yaml文件:

# jenkins.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins
  namespace: devops
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: jenkins
rules:
  - apiGroups: ["extensions", "apps"]
    resources: ["deployments", "ingresses"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  - apiGroups: [""]
    resources: ["services"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  - 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", "events"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: jenkins
  namespace: devops
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: jenkins
subjects:
  - kind: ServiceAccount
    name: jenkins
    namespace: devops
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: devops
spec:
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      serviceAccount: jenkins
      initContainers:
      - name: fix-permissions
        image: busybox
        command: ["sh", "-c", "chmod -R 777 /var/jenkins_home"]
        volumeMounts:
        - name: jenkinshome
          mountPath: /var/jenkins_home
      containers:
        - name: jenkins
          image: jenkins/jenkins:lts-jdk17
          imagePullPolicy: Always
          env:
          - name: JAVA_OPTS
            value: -Dhudson.model.DownloadService.noSignatureCheck=true
          ports:
            - containerPort: 8080
              name: web
              protocol: TCP
            - containerPort: 50000
              name: agent
              protocol: TCP
          resources:
            limits:
              cpu: 30000m
              memory: 4096Mi
            requests:
              cpu: 1500m
              memory: 2048Mi
          readinessProbe:
            httpGet:
              path: /login
              port: 8080
            initialDelaySeconds: 60
            timeoutSeconds: 5
            failureThreshold: 12
          volumeMounts:
            - name: jenkinshome
              mountPath: /var/jenkins_home
      volumes:
        - name: jenkinshome
          persistentVolumeClaim:
            claimName: jenkins-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: devops
  labels:
    app: jenkins
spec:
  selector:
    app: jenkins
  ports:
    - name: web
      port: 8080
      targetPort: web
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins-agent
  namespace: devops
  labels:
    app: jenkins
spec:
  selector:
    app: jenkins
  ports:
    - name: agent
      port: 50000
      targetPort: agent
      nodePort: 31217
  type: NodePort


将上面的内容复制文本编辑器中,创建一个 jenkins.yaml 文件。
该部署文件定义了字段所示的部署kind。
Deployment 指定单个副本。这可确保在发生故障时复制控制器将维护一个且仅一个实例。
容器镜像名称为jenkins,版本为2.440.2
规范中指定的端口列表是要从 Pods IP 地址上的容器公开的端口列表。
Jenkins 在 (http) 端口 8080 上运行。
Pod暴露了jenkins容器的8080端口和50000端口。

该文件的volumeMounts部分创建一个持久卷。该卷安装在容器内的路径 /var/jenkins_home 中,因此对 /var/jenkins_home 中数据的修改将写入该卷。持久卷的作用是存储基本的 Jenkins 数据,并在 Pod 的生命周期结束后保留这些数据。这里用的efs做的持久卷,因为直接挂载上去提示没有权限写入,所以用了初始镜像将持久卷的权限先开放出来
将内容添加到 Jenkins 部署文件后退出并保存更改。

1.2部署Jenkins

kubectl apply -f jenkins.yaml 

验证创建部署是否成功
image-1711532022441

2.授予对 Jenkins 服务的访问权限

现在部署了一个 Jenkins 实例,但仍然无法访问。Jenkins Pod 已分配一个 Kubernetes 集群内部的 IP 地址。可以登录 Kubernetes 节点并从那里访问 Jenkins,但这不是访问服务的非常有用的方式。

我这里使用了api网关将clusterIP的端口服务映射出一个jenkins.xxxxx.xxx的域名,用来提供出来访问。

该服务文件定义了该字段所指示的服务kind。

该服务的类型为 ClusterIP。其他选项包括 NodePort(在集群暴露出一个端口来提供访问)和 LoadBalancer(由云提供商分配的 IP 地址,例如 AWS Elastic IP)。

规范中指定的端口列表是此服务公开的端口列表。

该端口是将由服务公开的端口。

目标端口是访问该服务所针对的 Pod 的端口。还可以指定端口名称。

选择器指定此服务所针对的 Pod 的选择标准。

查看服务是否正常:
image-1711532140915

访问 Jenkins 仪表板

image-1708683382849

如果忘记了密码,可以查看密码

kubectl exec --namespace default -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/chart-admin-password && echo

输入账号密码 admin/wakewake123
image-1691141867508

4

评论区