Hiện tại mình đang làm giải Digital Transformation (Chuyển đổi số, số hóa) cho một đơn vị, một trong các nhiệm vụ đặt ra là xây dựng quy trình phát triển phần mềm cho công ty. Vào thời điểm hiện tại mô hình Scrum – Agile (Quy trình phát triển phần mềm Scrum theo phương pháp Agile) có thể nói đang là xu hướng được rất nhiều công ty phần mềm áp dụng. Không nằm ngoài xu thế đó, team mình cũng bắt đầu áp dụng triển khai, một trong những quy trình đầu tiên đó là Automation Deploy/Testing source code.
Sau khi tham khảo nhiều mô hình, mình quyết định áp dụng Jenkins CI/CD và triển khai trên máy chủ của công ty lúc này chỉ đơn giản 1 con desktop cấu hình mạnh. Dưới đây là các bước chi tiết.
Cài đặt Microk8s
Xem hướng dẫn Cài đặt Kubernetes với Microk8s
Deploy
Tạo namespace
Đầu tiên chúng ta khởi tạo namespace với tên jenkins
# namespace.yaml apiVersion: v1 kind: Namespace metadata: name: jenkins
Tạo PersistentVolume
# jenkins-pv.yaml kind: PersistentVolume apiVersion: v1 metadata: name: jenkins-pv labels: type: local namespace: jenkins spec: storageClassName: manual capacity: storage: 50Gi accessModes: - ReadWriteOnce hostPath: path: "/your-path/Jenkins-data"
Phần hostPath
là thư mục chứa data của Jenkins server, nếu chưa tồn tại bạn cần tạo thư mục đó.
Tạo PersistentVolumeClaim
# jenkins-pvc.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: jenkins-pvc labels: type: local namespace: jenkins spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 40Gi volumeName: jenkins-pv
Deployment
# deployment.yaml --- apiVersion: v1 kind: List items: - apiVersion: apps/v1 kind: Deployment metadata: name: jenkins-master-deployment labels: app: jenkins-master version: latest group: jenkins namespace: jenkins spec: replicas: 1 selector: matchLabels: app: jenkins-master version: latest group: jenkins template: metadata: labels: app: jenkins-master version: latest group: jenkins spec: securityContext: fsGroup: 1000 runAsUser: 0 containers: - name: jenkins-master image: ghcr.io/nvtienanh/jenkins-master:latest imagePullPolicy: Always env: - name: JAVA_OPTS value: -Djenkins.install.runSetupWizard=false # value: -Djenkins.install.runSetupWizard=false -Dhudson.TcpSlaveAgentListener.hostName=jenkins-jnlp.vanphong.local -Dhudson.TcpSlaveAgentListener.port=443 ports: - name: http-port containerPort: 8080 - name: jnlp-port containerPort: 50000 volumeMounts: - name: jenkins-home mountPath: /var/jenkins_home volumes: - name: jenkins-home persistentVolumeClaim: claimName: jenkins-pvc readOnly: false - apiVersion: v1 kind: Service metadata: labels: app: jenkins-master version: latest group: jenkins namespace: jenkins name: jenkins-master-service spec: # type: NodePort ports: - name: http port: 8080 targetPort: 8080 protocol: TCP - name: jnlp port: 50000 targetPort: 50000 protocol: TCP selector: app: jenkins-master version: latest group: jenkins
Tạo Ingress
# ingress.yaml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/add-base-url: "true" nginx.ingress.kubernetes.io/proxy-body-size: "0" name: jenkins-ingress namespace: jenkins spec: rules: - host: jenkins.yourdomain.com http: paths: - backend: serviceName: jenkins-master-service servicePort: 8080 path: /
Sau khi tạo xong các file yaml, chúng ta vào terminal và chạy:
microk8s kubectl apply -f namespace.yaml microk8s kubectl apply -f jenkins-pv.yaml microk8s kubectl apply -f jenkins-pvc.yaml microk8s kubectl apply -f deployment.yaml microk8s kubectl apply -f ingress.yaml
Sau khi thực thi các lệnh trên, chúng ta mở Kubernetes Dashboard UI và kiểm tra các resource của namespace jenkins
đã được khởi tạo thành công chưa. Nếu mọi thử ổn, bây giờ có thể truy cập vào jenkins master tại: http://jenkins.yourdomain.com
Cấu hình plugin Kubernetes cho Jenkins master
Truy cập vào phần http://jenkins.yourdomain.com/configureClouds/

Chúng ta cần cấu hình để Jenkins server có thể hoạt động được với Kubernetes cluster.
Thông tin Kubernetes URL và Kubernetes server certificate key được lấy từ output của lệnh microk8s config
:
apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBVENDQWVtZ0F3SUJBZ0lKQVBXUnJiZmtkR1cvTUEwR0NTcUdTSWIzRFFFQkN3VUFNQmN4RlRBVEJnTlYKQkFNTURERXdMakUxT.............XFFF server: https://xxx.xxx.xxx.xxx:xxxxx name: microk8s-cluster .....