Giới thiệu
Trong hướng dẫn này, chúng ta sẽ cùng nhau triển khai Jenkins trên Amazon EKS với kho lưu trữ bền vững nhờ vào AWS EFS sử dụng driver CSI. Thiết lập này đảm bảo rằng Jenkins có thể mở rộng, bền vững và chia sẻ kho lưu trữ cho các bản dựng.
Mục lục
- Cài đặt AWS EFS CSI Driver
- Thiết lập Tài nguyên AWS
- Tạo Hệ thống Tệp EFS
- Thiết lập Lưu trữ Kubernetes
- RBAC cho Jenkins
- Dịch vụ Jenkins
- Triển khai Jenkins
- Thông tin đăng nhập Jenkins
- Mã thông báo Tài khoản Dịch vụ
- Cấu hình Cloud Kubernetes cho Jenkins
Cài đặt AWS EFS CSI Driver
Để bắt đầu, bạn cần cài đặt driver AWS EFS CSI. Sử dụng lệnh sau:
bash
kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=master"
Thiết lập Tài nguyên AWS
Trước khi triển khai Jenkins, bạn cần thiết lập một số tài nguyên AWS:
Lấy ID VPC
Sử dụng lệnh sau để lấy ID VPC:
bash
aws eks describe-cluster \
--name hulk-santhosh-cluster \
--query "cluster.resourcesVpcConfig.vpcId" \
--output text \
--region ap-south-1
Lấy Dải CIDR VPC
Tiếp theo, lấy dải CIDR của VPC:
bash
aws ec2 describe-vpcs \
--vpc-ids vpc-07937adc3227e4b54 \
--query "Vpcs[].CidrBlock" \
--output text \
--region ap-south-1
Tạo Nhóm Bảo mật
Tạo nhóm bảo mật mới:
bash
aws ec2 create-security-group \
--description efs-test-sg \
--group-name efs-sg \
--vpc-id vpc-07937adc3227e4b54 \
--region ap-south-1
Cấp quyền Ingress
Cấp quyền cho nhóm bảo mật:
bash
aws ec2 authorize-security-group-ingress \
--group-id sg-0be281b6c437376c5 \
--protocol tcp \
--port 2049 \
--cidr 192.168.0.0/16
Tạo Hệ thống Tệp EFS
Tạo hệ thống tệp EFS để sử dụng với Jenkins:
bash
aws efs create-file-system \
--creation-token eks-efs \
--region ap-south-1
Tạo Điểm Gắn
Tiếp theo, tạo điểm gắn cho hệ thống tệp:
bash
aws efs create-mount-target \
--file-system-id fs-04ec113cee81e30b2 \
--subnet-id subnet-0a6d27e06ff1e24ed \
--security-group sg-0be281b6c437376c5
Thiết lập Lưu trữ Kubernetes
Thiết lập PersistentVolume và PersistentVolumeClaim cho Jenkins:
PersistentVolume
yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: efs-sc
csi:
driver: efs.csi.aws.com
volumeHandle: fs-04ec113cee81e30b2
PersistentVolumeClaim
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-claim
spec:
accessModes:
- ReadWriteMany
storageClassName: efs-sc
resources:
requests:
storage: 5Gi
RBAC cho Jenkins
Thiết lập RBAC để Jenkins có thể hoạt động:
yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: jenkins
rules:
# Thêm quy tắc liên quan ở đây
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: jenkins
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: jenkins
subjects:
- kind: ServiceAccount
name: jenkins
namespace: jenkins
Dịch vụ Jenkins
Tạo dịch vụ cho Jenkins:
yaml
apiVersion: v1
kind: Service
metadata:
name: jenkins
labels:
app: jenkins
spec:
type: ClusterIP
ports:
- name: ui
port: 8080
targetPort: 8080
- name: slave
port: 50000
- name: http
port: 80
targetPort: 8080
selector:
app: jenkins
Triển khai Jenkins
Cuối cùng, triển khai Jenkins với cấu hình sau:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: jenkins
labels:
app: jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
securityContext:
fsGroup: 1000
initContainers:
- name: volume-permission-fix
image: busybox
command: ["sh", "-c", "chown -R 1000:1000 /var/jenkins_home"]
securityContext:
runAsUser: 0
volumeMounts:
- name: jenkins-home
mountPath: /var/jenkins_home
containers:
- name: jenkins
image: jenkins/jenkins:lts
ports:
- containerPort: 8080
- containerPort: 50000
volumeMounts:
- name: jenkins-home
mountPath: /var/jenkins_home
volumes:
- name: jenkins-home
persistentVolumeClaim:
claimName: jenkins-claim
Thông tin đăng nhập Jenkins
Sau khi triển khai, bạn có thể lấy thông tin đăng nhập admin:
bash
kubectl exec -it <jenkins-pod-name> -n jenkins -- cat /var/jenkins_home/secrets/initialAdminPassword
Mã thông báo Tài khoản Dịch vụ
Tạo mã thông báo cho tài khoản dịch vụ:
yaml
apiVersion: v1
kind: Secret
metadata:
name: jenkins-token
namespace: jenkins
annotations:
kubernetes.io/service-account.name: jenkins
type: kubernetes.io/service-account-token
Cấu hình Cloud Kubernetes cho Jenkins
Cuối cùng, bạn cần cấu hình Jenkins để kết nối với Kubernetes:
- Kubernetes URL: https://kubernetes.default.svc.cluster.local
- Namespace: jenkins
- Credentials: Mã thông báo tài khoản dịch vụ
- Jenkins URL: http://jenkins.jenkins.svc.cluster.local:8080
- Jenkins Tunnel: jenkins.jenkins.svc.cluster.local:50000
Kiểm tra kết nối — nó sẽ thông báo rằng đã kết nối với Kubernetes.
Mẫu Pod cho Jenkins Agents
- Tên: jenkins-agent
- Namespace: jenkins
- Nhãn: jenkins-agent
- Sử dụng: Chỉ các công việc xây dựng với nhãn khớp
Mẫu Container
- Tên: jnlp
- Hình ảnh: jenkins/inbound-agent:latest
- Thư mục làm việc: /home/jenkins/agent
- Cấp phát pseudo-TTY: Có
Thực hành tốt nhất
- Đảm bảo rằng bạn đã kiểm tra các quyền và hạn chế an ninh cho nhóm bảo mật của bạn.
- Theo dõi hiệu suất của Jenkins và EFS để tối ưu hóa chi phí và hiệu suất.
Những cạm bẫy thường gặp
- Không cấp quyền đúng cho nhóm bảo mật có thể dẫn đến lỗi khi kết nối đến EFS.
- Quên không tạo PersistentVolumeClaim có thể làm Jenkins không thể lưu trữ dữ liệu.
Mẹo hiệu suất
- Tối ưu hóa cấu hình EFS để đạt hiệu suất tốt hơn cho các tác vụ đọc/ghi.
Giải quyết sự cố
Nếu bạn gặp vấn đề với kết nối Jenkins tới Kubernetes, hãy kiểm tra các thông báo lỗi trong log của Jenkins và đảm bảo rằng tất cả các tài nguyên đã được thiết lập đúng cách.
Kết luận
Triển khai Jenkins trên Amazon EKS với EFS mang lại khả năng mở rộng và tính bền vững cho quy trình CI/CD của bạn. Hãy làm theo hướng dẫn từng bước và tối ưu hóa cấu hình của bạn để đạt được hiệu suất tốt nhất. Nếu bạn có bất kỳ câu hỏi hoặc thắc mắc nào, đừng ngần ngại chia sẻ với cộng đồng phát triển!