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/