匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

实战|基于K8S的DevOps全流程工具链的搭建和使用

实战|基于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作为环境管理工具。通过这些工具的整合,我们可以实现从代码提交到应用程序部署的全自动化流程。