No menu items!
No menu items!
More

    [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/

    Bài viết gần đây

    spot_img

    Related Stories

    Leave A Reply

    Please enter your comment!
    Please enter your name here

    Đăng ký nhận thông tin bài viết qua email