6-5-k8s实际应用-jenkins部署

基于java命令,运行java war包或jar包,本次以jenkins.war 包部署⽅式为例,且要求jenkins的数据保存⾄外部存储(NFS或者PVC),其他java应⽤看实际需求是否需要将数据保存至外部存储。
1. 镜像准备
构建镜像准备的文件
root@k8s-master01:/opt/k8s-data/dockerfile/cbear/jenkins# ll
total 91236
drwxr-xr-x 2 root root 4096 Jun 20 07:50 ./
drwxr-xr-x 5 root root 4096 Jun 20 06:59 ../
-rwxr-xr-x 1 root root 501 Jun 20 07:50 build-command.sh*
-rwxr-xr-x 1 root root 192 Jun 20 07:44 Dockerfile*
-rwxr-xr-x 1 root root 93404074 Jun 12 14:59 jenkins.war*
-rwxr-xr-x 1 root root 144 Jun 20 07:46 run_jenkins.sh*
构建
jenkins镜像Dockerfileroot@k8s-master01:/opt/k8s-data/dockerfile/cbear/jenkins# cat Dockerfile #Jenkins Version 2.452.2 FROM harbor.cbear.top/pub-images/jdk-17-base:v2 ADD jenkins.war /apps/jenkins/jenkins.war ADD run_jenkins.sh /usr/bin/ RUN yum install freetype fontconfig -y EXPOSE 8080 CMD ["/usr/bin/run_jenkins.sh"] 上述
Dockerfile主要引用了一个jdk-17-base的镜像,该镜像有java环境,然后再这基础之上将jenkins.war包和运行脚本加进去,然后暴露8080端口,最后给出运行jenkins的cmd命令。jenkins运行脚本root@k8s-master01:/opt/k8s-data/dockerfile/cbear/jenkins# cat run_jenkins.sh #!/bin/bash cd /apps/jenkins && java -server -Xms1024m -Xmx1024m -Xss512k -jar jenkins.war --webroot=/apps/jenkins/jenkins-data --httpPort=8080 准备构建脚本
#!/bin/bash echo "即将开始就像构建,请稍等!" && echo 3 && sleep 1 && echo 2 && sleep 1 && echo 1 nerdctl build -t harbor.cbear.top/cbear/jenkins:v2.452.2 . if [ $? -eq 0 ];then echo "即将开始镜像上传,请稍等!" && echo 3 && sleep 1 && echo 2 && sleep 1 && echo 1 nerdctl push harbor.cbear.top/cbear/jenkins:v2.452.2 if [ $? -eq 0 ];then echo "镜像上传成功!" else echo "镜像上传失败" fi else echo "镜像构建失败,请检查构建输出信息!" fi运行构建脚本
root@k8s-master01:/opt/k8s-data/dockerfile/cbear/jenkins# bash build-command.sh测试
jenkins镜像是否可以正常运行。看到如下界面判断jenkins镜像构建成功root@k8s-master01:/opt/k8s-data/dockerfile/cbear/jenkins# nerdctl run -it --rm -p 8080:8080 harbor.cbear.top/cbear/jenkins:v2.452.2
2. 准备k8s上运行jenkins
2.1 准备pv/pvc
2.1.1 准备pv
在
nfs服务器上准备jenkins数据目录root@harbor:~# mkdir -p /data/cbear/{jenkins-data,jenkins-root-data}配置
nfs配置文件root@harbor:~# cat /etc/exports # /etc/exports: the access control list for filesystems which may be exported # to NFS clients. See exports(5). # # Example for NFSv2 and NFSv3: # /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) # # Example for NFSv4: # /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) # /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check) # /data/cbear/jenkins-data *(rw,no_root_squash,no_subtree_check) /data/cbear/jenkins-root-data *(rw,no_root_squash,no_subtree_check)重新加载
nfs配置文件root@harbor:~# exportfs -rv exporting *:/data/cbear/jenkins-root-data exporting *:/data/cbear/jenkins-data在
k8s上创建pv--- apiVersion: v1 kind: PersistentVolume metadata: name: jenkins-datadir-pv namespace: cbear spec: capacity: storage: 100Gi accessModes: - ReadWriteOnce nfs: server: 192.168.71.34 path: /data/cbear/jenkins-data --- apiVersion: v1 kind: PersistentVolume metadata: name: jenkins-root-datadir-pv namespace: cbear spec: capacity: storage: 100Gi accessModes: - ReadWriteOnce nfs: server: 192.168.71.34 path: /data/cbear/jenkins-root-data创建并验证的
pvroot@k8s-master01:/opt/k8s-data/yaml/cbear/jenkins# kubectl apply -f jenkins-pv.yaml persistentvolume/jenkins-datadir-pv created persistentvolume/jenkins-root-datadir-pv created root@k8s-master01:/opt/k8s-data/yaml/cbear/jenkins# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE jenkins-datadir-pv 100Gi RWO Retain Available <unset> 12s jenkins-root-datadir-pv 100Gi RWO Retain Available <unset> 12s
2.1.2 准备pvc
准备
pvc的资源配置文件--- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: jenkins-datadir-pvc namespace: cbear spec: volumeName: jenkins-datadir-pv accessModes: - ReadWriteOnce resources: requests: storage: 80Gi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: jenkins-root-data-pvc namespace: cbear spec: volumeName: jenkins-root-datadir-pv accessModes: - ReadWriteOnce resources: requests: storage: 80Gi启用对应
pvc文件root@k8s-master01:/opt/k8s-data/yaml/cbear/jenkins# kubectl apply -f jenkins-pvc.yaml persistentvolumeclaim/jenkins-datadir-pvc created persistentvolumeclaim/jenkins-root-data-pvc created验证对应
pvcroot@k8s-master01:/opt/k8s-data/yaml/cbear/jenkins# kubectl get pvc -n cbear NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE jenkins-datadir-pvc Bound jenkins-datadir-pv 100Gi RWO <unset> 21s jenkins-root-data-pvc Bound jenkins-root-datadir-pv 100Gi RWO <unset> 21s
2.2 准备jenkins的yaml文件
准备对应资源配置文件
kind: Deployment #apiVersion: extensions/v1beta1 apiVersion: apps/v1 metadata: labels: app: cbear-jenkins name: cbear-jenkins-deployment namespace: cbear spec: replicas: 1 selector: matchLabels: app: cbear-jenkins template: metadata: labels: app: cbear-jenkins spec: containers: - name: cbear-jenkins-container image: harbor.cbear.top/cbear/jenkins:v2.452.2 #imagePullPolicy: IfNotPresent imagePullPolicy: Always ports: - containerPort: 8080 protocol: TCP name: http volumeMounts: - mountPath: "/apps/jenkins/jenkins-data/" name: jenkins-datadir-cbear - mountPath: "/root/.jenkins" name: jenkins-root-datadir volumes: - name: jenkins-datadir-cbear persistentVolumeClaim: claimName: jenkins-datadir-pvc - name: jenkins-root-datadir persistentVolumeClaim: claimName: jenkins-root-data-pvc --- kind: Service apiVersion: v1 metadata: labels: app: cbear-jenkins name: cbear-jenkins-service namespace: cbear spec: type: NodePort ports: - name: http port: 80 protocol: TCP targetPort: 8080 nodePort: 38080 selector: app: cbear-jenkins启用对应配置清单文件
root@k8s-master01:/opt/k8s-data/yaml/cbear/jenkins# kubectl apply -f ./ persistentvolume/jenkins-datadir-pv unchanged persistentvolume/jenkins-root-datadir-pv unchanged persistentvolumeclaim/jenkins-datadir-pvc unchanged persistentvolumeclaim/jenkins-root-data-pvc unchanged deployment.apps/cbear-jenkins-deployment created service/cbear-jenkins-service created
3. 验证
验证
Jenkins Pod是否正常运行root@k8s-master01:/opt/k8s-data/yaml/cbear/jenkins# kubectl get pods -n cbear NAME READY STATUS RESTARTS AGE cbear-jenkins-deployment-78d5f47755-9w4wz 1/1 Running 0 5m21s root@k8s-master01:/opt/k8s-data/yaml/cbear/jenkins# kubectl get svc -n cbear NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cbear-jenkins-service NodePort 10.68.62.59 <none> 80:38080/TCP 5m27s验证
web访问jenkins是否可正常访问?
查看对应
jenkins密码文件, 这里密码文件已经保存在nfs远程目录的/data/cbear/jenkins-root-data目录中root@harbor:~# ls /data/cbear/jenkins-root-data/ config.xml jenkins.telemetry.Correlator.xml nodeMonitors.xml secret.key secrets userContent hudson.model.UpdateCenter.xml jobs plugins secret.key.not-so-secret updates users root@harbor:~# cat /data/cbear/jenkins-root-data/secrets/initialAdminPassword 0543975f0e4b40258388ada98e4fa043将对应密码拷贝到对应页面中之后 使
jenkins页面进行初始化
4. 配置高可用
配置
haproxyroot@ha2:~# cat /etc/haproxy/haproxy.cfg global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners stats timeout 30s user haproxy group haproxy daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http listen stats mode http bind 0.0.0.0:9999 stats enable log global stats uri /haproxy-status stats auth haadmin:123456 listen k8s-6443 bind 192.168.71.150:6443 mode tcp balance roundrobin server 192.168.71.29 192.168.71.29:6443 check inter 2s fall 3 rise 5 server 192.168.71.30 192.168.71.30:6443 check inter 2s fall 3 rise 5 server 192.168.71.31 192.168.71.31:6443 check inter 2s fall 3 rise 5 listen nginx-svc-80 bind 192.168.71.150:80 mode tcp server k8s-node01 192.168.71.37:30090 check inter 2000 fall 3 rise 5 server k8s-node02 192.168.71.35:30090 check inter 2000 fall 3 rise 5 server k8s-node03 192.168.71.36:30090 check inter 2000 fall 3 rise 5 listen k8s-jenkins-8080 bind 192.168.71.150:8080 mode tcp server k8s-node01 192.168.71.37:38080 check inter 2000 fall 3 rise 5 server k8s-node02 192.168.71.35:38080 check inter 2000 fall 3 rise 5 server k8s-node03 192.168.71.36:38080 check inter 2000 fall 3 rise 5重启对应
haproxy和keepalived
之后直接访问192.168.71.150:8080即可