实战|基于K8S的DevOps全流程工具链的搭建和使用
随着云原生的快速发展,Kubernetes(简称K8S)已经成为了容器编排领域的事实标准。而DevOps则成为了软件开发和交付的关键词。那么,如何在K8S上建立一套完整的DevOps工具链呢?接下来,本文将带大家一步步搭建基于K8S的DevOps全流程工具链,并介绍其使用方法。
1. CI/CD工具:Jenkins
首先,我们需要选择一个持续集成/持续交付(CI/CD)工具来实现自动化部署。在这里我们选择Jenkins。
Jenkins是一个开源项目,提供了一套易于使用的持续集成和持续交付工具。它的插件生态系统非常丰富,可以扩展Jenkins的功能,适应不同的场景需求。
安装Jenkins需要在K8S中创建一个Jenkins的Deployment对象,并挂载一个PVC卷,用于持久化Jenkins的数据。具体步骤如下:
1. 创建一个命名空间
```
kubectl create namespace jenkins
```
2. 创建一个PVC卷
```
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-data-pvc
namespace: jenkins
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
```
3. 创建一个Jenkins Deployment对象
```
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins-deployment
namespace: jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
containers:
- name: jenkins
image: jenkins/jenkins:lts
ports:
- containerPort: 8080
volumeMounts:
- mountPath: /var/jenkins_home
name: jenkins-home
volumes:
- name: jenkins-home
persistentVolumeClaim:
claimName: jenkins-data-pvc
```
4. 安装Jenkins插件
安装完Jenkins之后,我们需要安装一些插件来扩展其功能。打开Jenkins Web界面,依次点击“Manage Jenkins”→“Manage Plugins”→“Available”选项卡,搜索并安装以下插件:
- Kubernetes
- Kubernetes CLI
- Kubernetes Continuous Deploy(KCD)
- Blue Ocean
5. 创建Jenkins Pipeline
创建一个Jenkins Pipeline,用于从代码仓库中拉取代码,并进行构建、测试和部署。Pipeline可以通过Jenkinsfile定义,也可以在Jenkins Web界面中进行可视化编辑。下面是一个简单的Pipeline示例:
```
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'npm install'
sh 'npm run build'
}
}
stage('Test') {
steps {
sh 'npm run test'
}
}
stage('Deploy') {
steps {
kubernetesDeploy(
kubeconfigId: 'my-kubeconfig',
manifests: kubernetesManifests(replaceTokens: [appVersion: "1.0.0"])
)
}
}
}
}
```
在上述Pipeline中,我们首先使用npm安装依赖,并进行构建和测试,然后通过kubernetesDeploy步骤进行部署。kubernetesDeploy步骤会使用Kubernetes插件将应用程序部署到指定的Kubernetes集群。
2. 代码托管:GitLab
代码托管是DevOps流程中的重要环节之一。我们选择GitLab作为代码托管平台,因为它提供了完整的CI/CD功能,可以与Jenkins进行无缝集成。
GitLab也是一个开源项目,提供了一套Web界面和API,可以方便地进行代码管理和版本控制。
安装GitLab需要在K8S中创建一个GitLab的Deployment对象,并设置相关参数。具体步骤如下:
1. 创建一个命名空间
```
kubectl create namespace gitlab
```
2. 创建一个GitLab Deployment对象
```
apiVersion: apps/v1
kind: Deployment
metadata:
name: gitlab-deployment
namespace: gitlab
spec:
replicas: 1
selector:
matchLabels:
app: gitlab
template:
metadata:
labels:
app: gitlab
spec:
containers:
- name: gitlab
image: gitlab/gitlab-ce:latest
env:
- name: GITLAB_ROOT_PASSWORD
value: "your_password_here"
ports:
- containerPort: 80
- containerPort: 22
volumeMounts:
- mountPath: /etc/gitlab
name: etc-gitlab
- mountPath: /var/log/gitlab
name: var-log-gitlab
- mountPath: /var/opt/gitlab
name: var-opt-gitlab
volumes:
- name: etc-gitlab
emptyDir: {}
- name: var-log-gitlab
emptyDir: {}
- name: var-opt-gitlab
emptyDir: {}
```
3. 创建一个GitLab Service对象
```
apiVersion: v1
kind: Service
metadata:
name: gitlab-service
namespace: gitlab
spec:
selector:
app: gitlab
ports:
- name: http
port: 80
targetPort: 80
```
4. 配置GitLab Runner
在GitLab中,我们需要为每个项目配置一个Runner,用于执行CI/CD Pipeline。Runner是一个代理程序,可以在指定的环境下运行Pipeline中的任务。在K8S中,我们可以使用GitLab Runner的Kubernetes Executor来实现。
首先,我们需要创建一个GitLab Runner的Deployment对象,并挂载一个PVC卷,用于持久化Runner的数据。具体步骤如下:
```
apiVersion: apps/v1
kind: Deployment
metadata:
name: gitlab-runner-deployment
namespace: gitlab
spec:
replicas: 1
selector:
matchLabels:
app: gitlab-runner
template:
metadata:
labels:
app: gitlab-runner
spec:
containers:
- name: gitlab-runner
image: gitlab/gitlab-runner:alpine-v13.11.0
command:
- /bin/sh
- -c
- |
gitlab-runner register \
--non-interactive \
--url http://gitlab-service.gitlab.svc.cluster.local \
--registration-token {registration_token} \
--kubernetes-namespace gitlab \
--kubernetes-image gitlab/gitlab-runner-helper:x86_64-latest \
--executor kubernetes \
--kubernetes-namespace gitlab \
--kubernetes-image alpine:latest \
--kubernetes-cpu 1 \
--kubernetes-memory 1Gi \
--kubernetes-cmd ""
env:
- name: REGISTRATION_TOKEN
valueFrom:
secretKeyRef:
name: gitlab-registration-token
key: registration_token
- name: RUNNER_NAME
value: "my-runner"
volumeMounts:
- name: runner-config
mountPath: /etc/gitlab-runner
- name: runner-data
mountPath: /var/lib/gitlab-runner
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 1
memory: 1Gi
volumes:
- name: runner-config
emptyDir: {}
- name: runner-data
persistentVolumeClaim:
claimName: gitlab-runner-data-pvc
```
在上述Deployment对象中,我们使用GitLab Runner的Kubernetes Executor来创建一个Runner,并注册到GitLab中。在注册时,我们需要提供GitLab的URL、注册令牌、Kubernetes的配置信息和资源限制等参数。在注册完成后,该Runner将会出现在GitLab的Runner列表中。
3. 环境管理:Helm
最后,我们需要一个环境管理工具,用于快速部署和管理K8S应用程序。在这里我们选择Helm。
Helm是Kubernetes的包管理器,可以帮助我们轻松部署和管理K8S应用程序。它提供了一套易于使用的Chart模板,可以在不同的环境中快速进行部署和更新。同时,Helm还提供了一套CLI工具和Web界面,方便用户进行管理和监控。
安装Helm需要在K8S中创建一个Tiller的Deployment对象,并进行相关配置。具体步骤如下:
1. 创建一个命名空间
```
kubectl create namespace tiller
```
2. 安装Helm
```
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
```
3. 初始化Tiller
```
helm init --tiller-namespace tiller
```
4. 配置Tiller访问权限
```
kubectl create serviceaccount tiller --namespace tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=tiller:tiller
kubectl patch deploy tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}' -n tiller
```
5. 安装应用程序
使用Helm可以从Chart模板中快速安装和部署应用程序。下面是一个简单的Chart示例:
```
apiVersion: v1
name: my-app
version: 0.1.0
description: A Helm chart for Kubernetes
dependencies:
- name: mongodb
version: 7.x.x
repository: https://charts.bitnami.com/bitnami
- name: redis
version: 10.x.x
repository: https://charts.bitnami.com/bitnami
- name: frontend
version: 1.x.x
repository: https://example.com/charts
- name: backend
version: 1.x.x
repository: https://example.com/charts
```
在上述Chart中,我们定义了一个名为“my-app”的应用程序,并声明了它所依赖的其他Chart。使用Helm安装该Chart时,会同时安装和部署其所依赖的其他Chart。
总结
在本文中,我们介绍了如何在K8S上搭建一套完整的DevOps全流程工具链,包括Jenkins作为CI/CD工具、GitLab作为代码托管平台,以及Helm作为环境管理工具。通过这些工具的整合,我们可以实现从代码提交到应用程序部署的全自动化流程。