CI/CD DevOps Kubernetes

Hướng dẫn cấu hình Gitlab CI/CD trên Kubernetes

Gitlab

Bạn có thể sử dụng GitLab CI/CD để xây dựng và triển khai các ứng dụng của mình trên Kubernetes. Không khó để tích hợp GitLab với Kubernetes. Chúng ta có thể sử dụng GUI để thiết lập kết nối với cụm Kubernetes. Hơn nữa, GitLab CI cung cấp một registry container tích hợp để lưu trữ và chia sẻ image.

Lời nói đầu

Trong bài viết này, tôi sẽ mô tả tất cả các bước cần thiết để xây dựng và triển khai ứng dụng Java lên Kubernetes với GitLab CI/CD. Đầu tiên, chúng ta sẽ cần cài đặt GitLab trên cụm Kubernetes local. Sau đó, sử dụng các tính năng của GitLab để tích hợp với Kubernetes. Tiếp đến, chúng ta sẽ tạo một Pipeline cho ứng dụng Maven.

Bạn sẽ học cách xây dựng, chạy  automated tests, Build Image Docker và cuối cùng là chạy nó trên Kubernetes với GitLab CI.
Trong bài viết này, tôi sẽ tập trung vào sự đơn giản, sẽ chỉ cho bạn cách chạy GitLab CI trên Kubernetes với tài nguyên tối thiểu.

Cài đặt GitLab trên Kubernetes

Để dễ dàng bắt đầu với GitLab CI trên Kubernetes, chúng ta sẽ sử dụng images gitlab từ Docker Hub. Đầu tiên, chúng ta cần thay đổi URL mặc định. Tiếp đến là bật tính năng container registry. Để ghi đè cả hai thiết lập này, chúng ta cần thêm biến môi trường  GITLAB_OMNIBUS_CONFIG. Nó có thể chứa bất kỳ thuộc tính cấu hình GitLab nào. Vì tôi đang chạy trên Cluster Kubernetes cục bộ, tôi cũng cần ghi đè URL mặc định của sổ đăng ký Docker. Bạn có thể dễ dàng lấy nó bằng cách chạy lệnh 

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' registry

 local image registry đang chạy bên ngoài cụm Kubernetes dưới dạng một container Docker có tên  registry.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gitlab-deployment
spec:
  selector:
    matchLabels:
      app: gitlab
  template:
    metadata:
      labels:
        app: gitlab
    spec:
      containers:
      - name: gitlab
        image: gitlab/gitlab-ee
        env:
          - name: GITLAB_OMNIBUS_CONFIG
            value: "external_url 'http://gitlab-service.default/';gitlab_rails['registry_enabled'] = true;gitlab_rails['registry_api_url'] = \"http://172.17.0.2:5000\""
        ports:
        - containerPort: 80
          name: HTTP
        volumeMounts:
          - mountPath: /var/opt/gitlab
            name: data
      volumes:
        - name: data
          emptyDir: {}

Lưu ý: Thay đổi giá trị registry_api_url’] = “http://172.17.0.2:5000” cho phù hợp với môi trường của bạn

Sau đó, chúng ta cũng sẽ tạo Service Kubernetes  gitlab-service. GitLab UI có sẵn trên cổng 80. Chúng ta sẽ sử dụng dịch vụ đó để truy cập GitLab UI bên ngoài cụm Kubernetes.

apiVersion: v1
kind: Service
metadata:
  name: gitlab-service
spec:
  type: NodePort
  selector:
    app: gitlab
  ports:
  - port: 80
    targetPort: 80
    name: http

Cuối cùng, chúng ta có thể áp dụng GitLab manifest với  Deployment và  Service cho Kubernetes. Để làm điều đó, bạn chỉ cần thực hiện lệnh 

kubectl apply -f k8s/gitlab.yaml

. Hãy kiểm tra địa chỉ của  gitlab-service.

Tất nhiên, chúng ta cũng có thể cài đặt GitLab trên Kubernetes bằng Helm. Tuy nhiên, bạn nên nhớ rằng nó sẽ tạo ra một triển khai đầy đủ với một số thành phần cốt lõi và tùy chọn. Do đó, bạn sẽ phải tăng RAM được chỉ định cho cụm của mình lên khoảng 15MB để có thể chạy nó. Sau đây là danh sách các lệnh Helm bắt buộc. Để biết thêm chi tiết, bạn có thể tham khảo tài  liệu GitLab .

$ helm repo add gitlab https://charts.gitlab.io/
$ helm repo update
$ helm upgrade --install gitlab gitlab/gitlab \
  --timeout 600s \
  --set global.hosts.domain=example.com \
  --set global.hosts.externalIP=10.10.10.10 \
  --set [email protected]

Clone source code

Tiếp theo, tiến hành clone source code tại  sample-spring-boot-on-kubernetes  về máy

Đầu tiên, chúng ta hãy tạo một kho lưu trữ mới trên GitLab. Tất nhiên, tên của nó sẽ  sample-spring-boot-on-kubernetes như hình dưới đây.

Sau đó, bạn nên sao chép kho lưu trữ ví dụ của tôi và di chuyển nó đến phiên bản GitLab của bạn đang chạy trên Kubernetes. Giả sử địa chỉ của phiên bản GitHub cục bộ của tôi là  http://localhost:30129, tôi cần thực hiện lệnh sau.

$ git remote add gitlab http://localhost:30129/root/sample-spring-boot-on-kubernetes.git

Để làm rõ hơn, chúng ta hãy hiển thị danh sách các Git từ xa cho kho lưu trữ hiện tại.

$ git remote -v
gitlab  http://localhost:30129/root/sample-spring-microservices-kubernetes.git (fetch)
gitlab  http://localhost:30129/root/sample-spring-microservices-kubernetes.git (push)
origin  https://github.com/piomin/sample-spring-microservices-kubernetes.git (fetch)
origin  https://github.com/piomin/sample-spring-microservices-kubernetes.git (push)

Cuối cùng, chúng ta có thể đẩy mã nguồn lên kho lưu trữ GitLab bằng cách sử dụng  gitlab điều khiển từ xa.

$ git push gitlab

Cấu hình tích hợp GitLab với Kubernetes

Sau khi đăng nhập vào GitLab UI, bạn nên bật các yêu cầu HTTP cục bộ. Để làm được điều đó, bạn cần vào phần quản trị. Sau đó nhấp vào  Settings” -> “Network” -> “Outbound requests .

Cuối cùng, bạn cần đánh dấu vào ô  Allow requests to the local network from web hooks and services . Chúng ta sẽ sử dụng giao tiếp nội bộ giữa GitLab và Kubernetes API, và giữa GitLab CI runner và GitLab master.

Bây giờ, chúng ta có thể cấu hình kết nối tới API Kubernetes. Để thực hiện điều đó, bạn nên vào phần “Kubernetes”, sau đó nhấp vào “Add Kubernetes cluster”, và cuối cùng chuyển sang tab “Connect existing cluster”. Chúng ta cần cung cấp một số thông tin cơ bản về cụm của mình trong biểu mẫu.

Tên là bắt buộc, do đó tôi sẽ đặt tên giống với ngữ cảnh Kubernetes của mình. Bạn có thể để giá trị mặc định trong trường “Environment scope”. Trong trường “API URL”, tôi sẽ cung cấp địa chỉ nội bộ của API Kubernetes. Địa chỉ đó là  http://kubernetes.default:443.

Chúng ta cũng cần dán chứng chỉ CA cụm. Để có được nó, trước tiên bạn phải tìm bí mật có tiền tố  default-token-, và sao chép nó bằng lệnh sau.

$ kubectl get secret default-token-ttswt -o jsonpath="{['data']['ca\.crt']}" | base64 --decode

Cuối cùng, chúng ta nên tạo một mục đặc biệt  ServiceAccount cho GitLab với  cluster-admin vai trò này.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: gitlab
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: gitlab-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: gitlab
    namespace: kube-system

Sau đó, bạn nên tìm bí mật có tiền tố  gitlab trong  kube-system không gian tên và hiển thị chi tiết của nó. Sau đó, chúng ta cần sao chép giá trị của trường  tokenvà dán vào biểu mẫu mà không cần giải mã.

$ kubectl describe secret gitlab-token-5sk2v -n kube-system

Sau đây là thông tin đầy đủ về cụm Kubernetes của chúng tôi theo yêu cầu của GitLab. Hãy thêm cụm này bằng cách nhấp vào “Add Kubernetes cluster“.

Sau khi bạn đã thêm thành công cụm Kubernetes mới vào GitLab UI, bạn cần hiển thị thông tin chi tiết của cụm đó. Trong tab “Applications”, bạn sẽ tìm thấy phần “GitLab runner” và cài đặt nó.

Trình chạy GitLab được triển khai tự động trong không gian tên  gitlab-managed-apps. Chúng ta có thể xác minh xem nó đã khởi động thành công hay chưa.

$ kubectl get pod -n gitlab-managed-apps
NAME                                   READY        STATUS    RESTARTS       AGE
runner-gitlab-runner-5649dbf49-5mnjv   1/1          Running   0              5m56s

Trình chạy GitLab cố gắng giao tiếp với GitLab master. Để xác minh mọi thứ hoạt động tốt, chúng ta cần chuyển đến phần  “Tổng quan”  ->  “Runners” . Nếu bạn thấy địa chỉ IP và số phiên bản, điều đó có nghĩa là trình chạy có thể giao tiếp với master. Trong trường hợp có bất kỳ vấn đề nào, bạn nên xem nhật ký pod.

Tạo application pipeline

Tệp cấu hình GitLab CI/CD có sẵn trong thư mục gốc của dự án. Tên của nó là  .gitlab-ci.yml. Nó bao gồm 5 giai đoạn và sử dụng hình ảnh Maven Docker để thực hiện các bản dựng. Nó được GitLab CI tự động phát hiện. Chúng ta hãy xem xét kỹ hơn.

Đầu tiên, chúng ta chạy  build giai đoạn chịu trách nhiệm xây dựng ứng dụng cho mã nguồn. Nó chỉ chạy lệnh  mvn compile. Sau đó, chúng ta chạy thử nghiệm JUnit bằng  mvn test lệnh. Nếu tất cả các thử nghiệm đều vượt qua, chúng ta có thể xây dựng một hình ảnh Docker với ứng dụng của mình.

Chúng ta sử dụng plugin Jib Maven cho nó. Nó có thể xây dựng một hình ảnh ở chế độ không có docker. Do đó, chúng ta không phải chạy một hình ảnh với một máy khách Docker. Jib xây dựng một hình ảnh và đẩy nó vào sổ đăng ký Docker.

Cuối cùng, chúng ta có thể triển khai vùng chứa của mình trên Kubernetes. Để làm điều đó, chúng ta đang sử dụng hình  bitnami/kubectl ảnh. Nó cho phép chúng ta thực thi  kubectl các lệnh.

Trong bước đầu tiên, chúng ta đang triển khai ứng dụng trong  test không gian tên. Giai đoạn cuối cùng  deploy-prod yêu cầu phê duyệt thủ công. Cả hai giai đoạn triển khai chỉ được phép cho một  master nhánh.

image: maven:latest

stages:
  - build
  - test
  - image-build
  - deploy-tb
  - deploy-prod

build:
  stage: build
  script:
    - mvn compile

test:
  stage: test
  script:
    - mvn test

image-build:
  stage: image-build
  script:
    - mvn -s .m2/settings.xml -P jib compile jib:build

deploy-tb:
  image: bitnami/kubectl:latest
  stage: deploy-tb
  only:
    - master
  script:
    - kubectl apply -f k8s/deployment.yaml -n test

deploy-prod:
  image: bitnami/kubectl:latest
  stage: deploy-prod
  only:
    - master
  when: manual
  script:
    - kubectl apply -f k8s/deployment.yaml -n prod

Chúng ta có thể đẩy hình ảnh ứng dụng của mình đến một sổ đăng ký Docker từ xa hoặc cục bộ. Nếu bạn không truyền bất kỳ địa chỉ nào, theo mặc định, Jib sẽ cố gắng đẩy hình ảnh đến sổ  docker.io đăng ký.

<plugin>
   <groupId>com.google.cloud.tools</groupId>
   <artifactId>jib-maven-plugin</artifactId>
   <version>2.4.0</version>
   <configuration>
      <to>piomin/sample-spring-boot-on-kubernetes</to>
   </configuration>
</plugin>

Để đẩy hình ảnh vào  docker.io sổ đăng ký, chúng tôi cần cung cấp thông tin xác thực của khách hàng.

<servers>
   <server>
      <id>registry-1.docker.io</id>
      <username>${DOCKER_LOGIN}</username>
      <password>${DOCKER_PASSWORD}</password>
   </server>
</servers>

Sau đây là cấu hình tương tự, nhưng dành cho phiên bản cục bộ của sổ đăng ký.

<plugin>
   <groupId>com.google.cloud.tools</groupId>
   <artifactId>jib-maven-plugin</artifactId>
   <version>2.4.0</version>
   <configuration>
      <allowInsecureRegistries>true</allowInsecureRegistries>
      <to>172.17.0.2:5000/root/sample-spring-boot-on-kubernetes</to>
   </configuration>
</plugin>

Chạy pipeline GitLab CI trên Kubernetes

Cuối cùng, chúng ta có thể chạy GitLab CI/CD pipeline. Chúng ta có thể đẩy thay đổi vào mã nguồn hoặc chỉ cần chạy bản dựng thủ công. Bạn có thể thấy kết quả cho  master nhánh trong hình bên dưới.

Giai đoạn cuối cùng  deploy-prod cần phải được phê duyệt thủ công. Chúng tôi có thể xác nhận bằng cách nhấp vào nút “Play“.

Nếu bạn đẩy thay đổi sang nhánh khác thì  master pipeline sẽ chỉ chạy ba giai đoạn. Nó sẽ xây dựng ứng dụng, chạy thử nghiệm và xây dựng hình ảnh Docker.

Bạn cũng có thể tận dụng lợi thế của sổ đăng ký container tích hợp. Bạn chỉ cần đặt đúng tên của hình ảnh Docker. Nó phải chứa tên chủ sở hữu GitLab và tên hình ảnh. Trong trường hợp đó, nó là  root/sample-spring-boot-on-kubernetes. Tôi đang sử dụng sổ đăng ký Docker cục bộ của mình có sẵn tại  172.17.0.2:5000.

Phần kết luận

GitLab có vẻ là một công cụ rất thú vị để xây dựng các quy trình CI/CD trên Kubernetes. Nó cung cấp tích hợp sẵn với Kubernetes và một sổ đăng ký Docker container. Tài liệu của nó ở cấp độ rất cao. Trong bài viết này, tôi đã cố gắng chỉ cho bạn thấy rằng việc xây dựng các đường ống CI/CD cho các ứng dụng Maven trên Kubernetes tương đối dễ dàng.

ArgoCD Là Gì? Tăng Tốc Quá Trình Phát Triển Phần Mềm Của Bạn Ngay Hôm Nay!

Add Comment

Click here to post a comment