在 kubernetes 集群内安装 jenkins

在 kubernetes 集群内安装 jenkins

准备 jenkins 镜像

到官网上查看当前 jenkins 的版本是什么,这里目前使用的是2.249.1,然后拉去到本地推送到本地仓库

# docker pull jenkins/jenkins:2.249.1
# docker tag jenkins/jenkins:2.249.1 harbor.zsf.com/public/jenkins:2.249.1
# docker push harbor.zsf.com/public/jenkins:2.249.1

改造 jenkins 官方镜像

jenkins 的官方镜像对于我们并不能直接使用,我们来对此进行改造

FROM harbor.zsf.com/public/jenkins:2.249.1
MAINTAINER zhangshoufu wx: y18163201
USER root
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
		echo "Asia/Shanghai" > /etc/timezone
		
COPY id_rsa /root/.ssh/id_rsa
COPY config.json /root/.docker/config.json
COPY get-docker.sh /get-docker.sh
RUN echo "StrictHostKeyCheck no" >> /etc/ssh/ssh_config && \
		/get-docker.sh

解释 Dockerfile

1,导入我们刚才从 docker hub 拉去的 jenkins 基础镜像

2,声明了 Dockerfile 的作者

3,更改 容器启动时候使用的用户,我们这里面使用 root用户,因为我们要执行 Docker 打包操作

4,更改 jenkins 容器内的时区为上海,

7,在宿主机上生成一个 SSH 秘钥对,把私钥拷贝到 jenkins 里面,因为我们要通过 SSH 的方式去 gitlab上拖取代码

8,因为我们要登录私有的 docker 仓库,所以我们把 docker 的登录仓库的 json 文件拷贝进去,在宿主机上/root/.docker/config.json,可以拷贝到当前路径,config.json 里面放的就是登录信息

9,我们需要在 jenkins 里面安装 docker客户端,使其能执行 docker 打包操作。此脚本通过curl -fsSL https://get.docker.com -o get-docker.sh 获得

10,取消 ssh 登录的时候秘钥验证,就是第一次登录机器的时候 接收秘钥 yes 的动作,并安装 docker 客户端,

创建 SSH 秘钥,准备 config.json文件

# ssh-keygen -t rsa -b 2048 -C "zsf18163201@qq.com" -N "" -f ./id_rsa
# cp /root/.docker/config.json ./
# curl -fsSL https://get.docker.com -o get-docker.sh
# chmod +x get-docker.sh
# tree .
.
├── config.json
├── Dockerfile
├── get-docker.sh
├── id_rsa
└── id_rsa.pub

打包 Docker images

# docker build -f Dockerfile  . -t harbor.zsf.com/infra/jenkins:2.249.1
# docker push harbor.zsf.com/infra/jenkins:2.249.1

需要注意的一点是 infra 是我们的私有仓库

k8s 中部署 jenkins

创建 namespaces

# kubectl create namespace infra
namespace/infra created

创建登录docker 私有仓库的凭证

创建一个 docker-registry 的 secret 资源

# kubectl create secret docker-registry harbor --docker-server=harbor.zsf.com --docker-username=admin --docker-password='Flzx3000c@' -n infra
secret/harbor created

创建的secret 类型为 docker-registry 的秘钥。

查看 secret 证书的 yaml 文件

# kubectl get secret -n infra harbor -o yaml
apiVersion: v1
data:
  .dockerconfigjson: eyJhdXRocyI6eyJoYXJib3Iub2QuY29tIjp7InVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IkZsengzMDAwY0AiLCJhdXRoIjoiWVdSdGFXNDZSbXg2ZURNd01EQmpRQT09In19fQ==
kind: Secret
metadata:
  creationTimestamp: "2020-09-24T06:45:34Z"
  name: harbor
  namespace: infra
  resourceVersion: "5671330"
  selfLink: /api/v1/namespaces/infra/secrets/harbor
  uid: 04f553fb-a0db-4e6d-844b-57bbcd898710
type: kubernetes.io/dockerconfigjson

其中.dockerconfigjson字段的值是 Docker 凭据的 base64 表示。要想查看dockerconfigjson字段中的内容,请将 Secret 数据转换为可读格式:

# kubectl get secret -n infra harbor --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
{"auths":{"harbor.od.com":{"username":"admin","password":"Flzx3000c@","auth":"YWRtaW46Rmx6eDMwMDBjQA=="}}}

要想查看 auth 字段的信息,请使用下面命令:

# echo "XXXXXX" |base64 --decode

创建 nfs 共享存储

我们在 192.168.4.73 机器上安装,

# yum -y install nfs-utils rpcbind
# cat /etc/exports
/home/kubernetes-volume/jenkins-data 192.168.4.0/24(rw)
# systemctl enable rpcbind && systemctl start rpcbind
# systemctl enable nfs && systemctl start rpcbind

然后每个节点上面需要安装nfs-utils,这里不再赘述

创建jenkins 的 yaml 文件

创建 jenkins-deployment 文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: infra
  labels:
    app: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      imagePullSecrets:
      - name: harbor
      containers:
      - name: jenkins
        image: harbor.zsf.com/infra/jenkins:2.249.1
        imagePullPolicy: IfNotPresent
        ports:
        - name: jenkins-8080
          containerPort: 8080
          protocol: TCP
        env:
        - name: JAVA_OPTS
          value: -Xmx1g -Xms1g  
        volumeMounts:
        - name: jenkins-data
          mountPath: /var/jenkins_home
        - name: docker-sock
          mountPath: /var/run/docker.sock
        - name: time
          mountPath: /etc/localtime
        resources:
          limits:
            memory: 1.5Gi
          requests:
            memory: 1.5Gi
      volumes:
      - name: jenkins-data
        nfs:
          server: jx4-73
          path: /home/kubernetes-volume/jenkins-data
      - name: docker-sock
        hostPath:
          path: /var/run/docker.sock
          type: Socket
      - name: time
        hostPath:
          path: /etc/localtime
          type: File
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  revisionHistoryLimit: 5
  progressDeadlineSeconds: 600

创建 service ingress 文件

apiVersion: v1
kind: Service
metadata:
  labels:
    app: loki
  name: loki
  namespace: monitoring
spec:
  ports:
  - name: loki-3100
    port: 3100
    targetPort: loki-3100
  selector:
    app: loki

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: loki
  namespace: monitoring
spec:
  rules:
  - host: loki.zsf.com
    http:
      paths:
      - path: /
        backend:
          serviceName: loki
          servicePort: 3100

然后在 DNS 服务器上面配置域名

到我们的 DNS 服务器上条件一个jenkins.zsf.com的域名解析。然后我们访问 jenkins

访问配置 Jenkins

我们通过web 界面登录 jenkins,然后安装插件。

设置匿名用户访问 jenkins,但是不能配置

jenkins-->Manage Jenkins-->Security-->configure global security-->Authorization

image-20200924225709591

安装插件,更换插件源

我们采用默认的jenkins 站点去安装插件的时候,因为墙的原因我们安装插件很困难,所以我们第一步先替换一下升级所使用的站点

系统管理 --> 管理插件 --> 高级 --> 升级站点

image-20200615155457469

替换成地址http://mirrors.jenkins-ci.org/status.html 然后提交再去安装插件

安装语言插件 [Locale plugin](

posted @ 2021-03-05 10:10  张首富  阅读(301)  评论(0编辑  收藏  举报