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