Jenkins + k8s 实现 CICD(持续集成和持续部署)
Kiml Lv5
1
2
24-08-25 初始记录
24-09-10 更换 k8s 为 minikube

什么是 CI /CD

在深入研究 CI / CD 自动化工具之前,我们首先需要了解这个概念。正如我们所提到的,持续集成和持续部署通常与敏捷开发环境齐头并进,在这种环境中,团队希望在完成后立即将不同的代码段部署到生产环境中。

使用 CI / CD 工具可自动完成构建,测试和部署新代码的过程。每个团队成员都可以立即获得有关其代码生产准备情况的反馈,即使他们只更改了一行或一个字符。这样,每个团队成员都可以将他们的代码推送到生产中,而构建,测试和部署的过程则自动完成,以便他们可以继续处理应用程序的下一部分。

Kubernetes(minikube)

  1. 安装minikube

1
2
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
  1. 启动集群

1
2
3
4
minikube start --force --driver=docker

# 直接使用 minikube start 可能会出现以下报错
Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges.
  1. 访问集群

1
2
3
4
5
6
7
kubectl get po -A

# 或者使用minikube下载使用
minikube kubectl -- get po -A

# 可以添加以下命令简化
alias kubectl="minikube kubectl --"
  1. Kubernetes 仪表板

1
minikube dashboard

Jenkins

开源工具 描述 官方文档 官方安装文档 docker 安装
Jenkins devops 持续集成工具 https://www.jenkins.io/ https://www.jenkins.io/download/ https://hub.docker.com/r/jenkins/jenkins/

docker 安装命令:

1
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts-jdk11

自定义 yaml 文件安装 jenkins

  1. 由于 jenkins 需要持久化数据,所以我们需要创建 PVC ,建议使用 storageClass 动态创建 PVC,在 minikube 中有一个默认的 storageClass,名称是:standard,可以使用下面的命令查看:

1
2
# 第一次会进行下载,需要时间较长
kubectl get sc
  1. 创建 jenkins-deploy.yaml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
###############使用 storageClass 创建 pvc ###################
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-data-pvc
namespace: default
spec:
accessModes:
- ReadWriteMany
# 指定 storageClass 的名字,这里使用 minikube 默认的 standard
storageClassName: "standard"
resources:
requests:
storage: 10Gi

###############创建一个ServiceAccount 名称为:jenkins-admin###################
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins-admin
namespace: default
labels:
name: jenkins

###############绑定账户jenkins-admin 为集群管理员角色,为了控制权限建议绑定自定义角色###################
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: jenkins-admin
labels:
name: jenkins
subjects:
- kind: ServiceAccount
name: jenkins-admin
namespace: default
roleRef:
kind: ClusterRole
# cluster-admin 是 k8s 集群中默认的管理员角色
name: cluster-admin
apiGroup: rbac.authorization.k8s.io


############### 在 default 命名空间创建 deployment ###################
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
terminationGracePeriodSeconds: 10
# 注意:k8s 1.21.x 中 serviceAccount 改名为 serviceAccountName
# 这里填写上面创建的 serviceAccount 的 name
serviceAccount: jenkins-admin
containers:
- name: jenkins
image: jenkins/jenkins:lts-jdk11
imagePullPolicy: IfNotPresent
env:
- name: JAVA_OPTS
value: -Duser.timezone=Asia/Shanghai
ports:
- containerPort: 8080
name: web
protocol: TCP
- containerPort: 50000
name: agent
protocol: TCP
resources:
limits:
cpu: 1000m
memory: 1Gi
requests:
cpu: 500m
memory: 512Mi
livenessProbe:
httpGet:
path: /login
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
failureThreshold: 12
readinessProbe:
httpGet:
path: /login
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
failureThreshold: 12
volumeMounts:
- name: jenkinshome
mountPath: /var/jenkins_home
volumes:
- name: jenkinshome
persistentVolumeClaim:
claimName: jenkins-data-pvc

############### 在 default 命名空间创建 service ###################
---
apiVersion: v1
kind: Service
metadata:
name: jenkins
namespace: default
labels:
app: jenkins
spec:
selector:
app: jenkins
type: ClusterIP
ports:
- name: web
port: 8080
targetPort: 8080


---
apiVersion: v1
kind: Service
metadata:
name: jenkins-agent
namespace: default
labels:
app: jenkins
spec:
selector:
app: jenkins
type: ClusterIP
ports:
- name: agent
port: 50000
targetPort: 50000
  1. 部署 jenkins

1
kubectl apply -f jenkins-deploy.yaml
  1. 临时暴露服务端口(只能通过内网访问)

1
kubectl port-forward service/jenkins 8080:8080 -n default
  1. 外部网络访问 Jenkins 服务

    1. 使用 NodePort
    2. 使用 LoadBalancer
    3. 设置 Ingress(这里选用这种)

Ingress 是一种暴露服务到外部网络的方法,通常与 Ingress 控制器(如 Nginx)一起使用。

  • 安装 Ingress 控制器

1
2
# 基本上成功不了
minikube addons enable ingress

国内的互联网环境。。。

1
2
# 下载yaml配置文件
wget https://cdn.jsdelivr.net/gh/jasonkayzk/kubernetes-learn@book-learn/chapter5/ingress-nginx/deploy.yaml

使用 helm 安装

// todo

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量