Sunday, January 19, 2025

[Jenkins] Triển khai Jenkins trên Kubernetes bằng manifest

-

Phần này mô tả cách sử dụng một tập hợp các file YAML (Yet Another Markup Language) để cài đặt Jenkins trên một cụm Kubernetes. Các file YAML dễ dàng theo dõi, chỉnh sửa và có thể được sử dụng lại vô thời hạn.

Tạo một namespace cung cấp thêm một lớp cách ly để dễ kiểm soát hơn đối với môi trường CICD. Tạo namespace cho việc triển khai Jenkins bằng cách nhập lệnh sau.

$ kubectl create namespace jenkins
namespace/jenkins created

Khi namespace đã được tạo, bạn có thể xác minh trạng thái của nó bằng cách nhập

$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   9m17s
jenkins           Active   47s
kube-node-lease   Active   9m20s
kube-public       Active   9m20s
kube-system       Active   9m20s

Tạo file jenkins-deploy.yaml triển khai Jenkins

cat > ./jenkins-deploy.yaml << OEF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      containers:
      - name: jenkins
        image: jenkins/jenkins:lts-jdk11
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: jenkins-home
          mountPath: /var/jenkins_home
      volumes:
      - name: jenkins-home
        emptyDir: { }

OEF
  • Triển khai chỉ định một bản sao duy nhất.
  • Tên image là jenkins và phiên bản là 2.32.2
  • Danh sách các cổng được chỉ định là danh sách các cổng trên địa chỉ IP của Pods.
    • Jenkins đang chạy trên cổng (http) 8080.
    • Pod container jenkins chạy cổng 8080.

Phần volumeMount của file sẽ tạo ra một Ổ cứng. Ổ đĩa này được gắn tại thư mục /var/jenkins_home và do đó các sửa đổi đối với dữ liệu trong /var/jenkins_home được ghi vào ổ đĩa.

Hãy tạo thư mục /var/jenkins_home để làm volume

$ mkdir -p /var/jenkins_home

Triển khai Jenkins

$ kubectl apply -f ./jenkins-deploy.yaml 
deployment.apps/jenkins created

Verify lại kết quả sau khi triển khai

$ kubectl get deploy,po -n jenkins
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/jenkins   1/1     1            1           48s

NAME                           READY   STATUS    RESTARTS   AGE
pod/jenkins-789c9b6b84-llwr7   1/1     Running   0          48s

Như vậy ta đã triển khai xong Jenkins nhưng vẫn không thể truy cập được. Jenkins Pod đã được gán một địa chỉ IP nội bộ cụm Kubernetes. Có thể vào Kubernetes Node và truy cập Jenkins từ đó nhưng đó không phải là cách rất hữu ích để truy cập dịch vụ.

Để làm cho Jenkins có thể truy cập bên ngoài cụm Kubernetes, Pod cần tạo một service với type network là NodePort. Bên ngoài sẽ truy cập thông qua địa chỉ IP Node và nodePort của dịch vụ.

Ta tạo file manifes service cho Jenkins như sau

cat > ./jenkins-service.yaml << OEF
apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: jenkins
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
  selector:
    app: jenkins
OEF

Triển khai manifest này

$ kubectl create -f jenkins-service.yaml -n jenkins
service/jenkins created

Để xác minh việc tạo dịch vụ đã thành công, bạn có thể chạy:

$ kubectl get services -n jenkins
NAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
jenkins   NodePort   10.110.80.231   <none>        8080:31372/TCP   57s

Hãy verify lại toàn bộ để đảm bảo tất cả đã hoàn tất

$ kubectl get deploy,po,svc -n jenkins
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/jenkins   1/1     1            1           9m36s

NAME                           READY   STATUS    RESTARTS   AGE
pod/jenkins-789c9b6b84-llwr7   1/1     Running   0          9m36s

NAME              TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/jenkins   NodePort   10.110.80.231   <none>        8080:31372/TCP   3m24s

Từ kết quả đầu ra ở trên, chúng ta có thể thấy rằng dịch vụ đã được hiển thị trên cổng 32664. Chúng ta cũng biết rằng vì dịch vụ thuộc loại NodeType nên dịch vụ sẽ định tuyến các yêu cầu được thực hiện tới bất kỳ node nào trên cổng này tới pod Jenkins. Tất cả những gì còn lại đối với chúng ta là xác định địa chỉ IP của node, nó chính là 192.168.13.238:31372.

Như vậy url để login trên trình duyệt sẽ là http://192.168.13.238:31372

Để lấy được mật khẩu, chúng ta đơn giản chỉ việc show logs của pod là xong

$ kubectl logs pod/jenkins-789c9b6b84-llwr7 -n jenkins
Running from: /usr/share/jenkins/jenkins.war
webroot: EnvVars.masterEnvVars.get("JENKINS_HOME")
2022-10-05 14:22:35.762+0000 [id=1]     INFO    winstone.Logger#logInternal: Beginning extraction from war file
2022-10-05 14:22:37.799+0000 [id=1]     WARNING o.e.j.s.handler.ContextHandler#setContextPath: Empty contextPath
2022-10-05 14:22:37.876+0000 [id=1]     INFO    org.eclipse.jetty.server.Server#doStart: jetty-10.0.11; built: 2022-06-21T21:12:44.640Z; git: d988aa016e0bb2de6fba84c1659049c72eae3e32; jvm 11.0.16.1+1
2022-10-05 14:22:38.269+0000 [id=1]     INFO    o.e.j.w.StandardDescriptorProcessor#visitServlet: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
2022-10-05 14:22:38.344+0000 [id=1]     INFO    o.e.j.s.s.DefaultSessionIdManager#doStart: Session workerName=node0
2022-10-05 14:22:39.015+0000 [id=1]     INFO    hudson.WebAppMain#contextInitialized: Jenkins home directory: /var/jenkins_home found at: EnvVars.masterEnvVars.get("JENKINS_HOME")
2022-10-05 14:22:39.211+0000 [id=1]     INFO    o.e.j.s.handler.ContextHandler#doStart: Started w.@150ede8b{Jenkins v2.361.2,/,file:///var/jenkins_home/war/,AVAILABLE}{/var/jenkins_home/war}
2022-10-05 14:22:39.238+0000 [id=1]     INFO    o.e.j.server.AbstractConnector#doStart: Started ServerConnector@e84a8e1{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
2022-10-05 14:22:39.258+0000 [id=1]     INFO    org.eclipse.jetty.server.Server#doStart: Started Server@32c8e539{STARTING}[10.0.11,sto=0] @4273ms
2022-10-05 14:22:39.261+0000 [id=23]    INFO    winstone.Logger#logInternal: Winstone Servlet Engine running: controlPort=disabled
2022-10-05 14:22:39.575+0000 [id=28]    INFO    jenkins.InitReactorRunner$1#onAttained: Started initialization
2022-10-05 14:22:39.599+0000 [id=28]    INFO    jenkins.InitReactorRunner$1#onAttained: Listed all plugins
2022-10-05 14:22:40.635+0000 [id=29]    INFO    jenkins.InitReactorRunner$1#onAttained: Prepared all plugins
2022-10-05 14:22:40.640+0000 [id=28]    INFO    jenkins.InitReactorRunner$1#onAttained: Started all plugins
2022-10-05 14:22:40.651+0000 [id=28]    INFO    jenkins.InitReactorRunner$1#onAttained: Augmented all extensions
2022-10-05 14:22:40.886+0000 [id=28]    INFO    jenkins.InitReactorRunner$1#onAttained: System config loaded
2022-10-05 14:22:40.887+0000 [id=29]    INFO    jenkins.InitReactorRunner$1#onAttained: System config adapted
2022-10-05 14:22:40.887+0000 [id=29]    INFO    jenkins.InitReactorRunner$1#onAttained: Loaded all jobs
2022-10-05 14:22:40.889+0000 [id=28]    INFO    jenkins.InitReactorRunner$1#onAttained: Configuration for all jobs updated
2022-10-05 14:22:40.905+0000 [id=42]    INFO    hudson.model.AsyncPeriodicWork#lambda$doRun$1: Started Download metadata
2022-10-05 14:22:40.914+0000 [id=42]    INFO    hudson.util.Retrier#start: Attempt #1 to do the action check updates server
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.vmplugin.v7.Java7$1 (file:/var/jenkins_home/war/WEB-INF/lib/groovy-all-2.4.21.jar) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int)
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.vmplugin.v7.Java7$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2022-10-05 14:22:41.500+0000 [id=28]    INFO    jenkins.install.SetupWizard#init: 

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

76c1c8f062f044f18d11c856d0387245

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

2022-10-05 14:23:12.326+0000 [id=29]    INFO    jenkins.InitReactorRunner$1#onAttained: Completed initialization
2022-10-05 14:23:12.343+0000 [id=22]    INFO    hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running
2022-10-05 14:23:13.554+0000 [id=42]    INFO    h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
2022-10-05 14:23:13.555+0000 [id=42]    INFO    hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1
2022-10-05 14:23:13.557+0000 [id=42]    INFO    hudson.model.AsyncPeriodicWork#lambda$doRun$1: Finished Download metadata. 32,650 ms

Vậy mật khẩu login của chúng ta là 76c1c8f062f044f18d11c856d0387245

Hãy nhập mật khẩu vào ô Administrator password và bấm Continue, ta được màn hình hiển thị như dưới, hãy chọn Install suggested plugins để Jenkins giúp bạn cài các plugins cơ bản hoặc bạn có thể chọn Select plugins to install nếu muốn tùy chọn plugins.

Chờ ít phút để quá trình cài đặt các plugins được diễn ra

Sau khi cài đặt xong plugins thì Jenkins sẽ tự động chuyển sang màn hình khởi tạo username và password theo cá nhân.

Nếu bạn không có ý định thay đổi đường dẫn thì giữ nguyên và bấm Save and Finish

Hãy bấm Start using Jenkins để kết thúc việc thiết lập

Và đây là kết quả

Tham khảo: https://www.jenkins.io/doc/book/installing/kubernetes/

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories