devops实战记录

机器分配:

机器名ip服务(端口)备注:
k8s-master01192.168.18.101Gitlab(20550)
k8s-node01192.168.18.102jenkins(30560)、sonarqube(30303)、PostgreSQL此机器的应用为master分配过来的。所以访问这些应用服务ip使用的是master节点的IP
k8s-node02192.168.18.103harbor(5432)

说明:

在这个DevOps项目中,我采用了一系列工具和技术来实现高效的软件开发、交付和运维流程。

  1. GitLab:使用GitLab作为源代码管理和版本控制工具。通过GitLab,管理和协作开发代码。它还提供了强大的持续集成和持续交付功能,使我们能够自动构建、测试和部署应用程序。
  2. SonarQube:使用SonarQube进行代码质量管理和静态代码分析。SonarQube帮助我们发现和修复潜在的代码缺陷、安全漏洞和代码质量问题。它提供了丰富的代码分析指标和报告,帮助我们持续改进代码质量和可维护性。
  3. Harbor:作为容器镜像仓库,Harbor提供了安全、稳定的镜像存储和分发平台。将构建的Docker镜像上传到Harbor,通过Harbor进行版本管理、权限控制和镜像复制等操作,确保镜像的可靠性和安全性。
  4. Spring Boot:作为我们的应用程序开发框架,Spring Boot提供了快速开发和轻量级的微服务架构。它简化了配置和部署过程,提供了丰富的开发工具和库,使我们能够快速构建高性能、可扩展的应用程序。—我也不懂这个框架,网上找的代码进行实验测试。
  5. Kubernetes:作为容器编排和管理平台,使用Kubernetes来部署、扩展和管理我们的应用程序。Kubernetes提供了自动化的容器调度、负载均衡和故障恢复机制,帮助我们实现高可用性和可伸缩性。
  6. Jenkins:作为持续集成和持续交付的关键工具,使用Jenkins来自动化构建、测试和部署流程。设置Jenkins流水线,通过配置各种构建和部署步骤,实现了快速、可靠的交付流程。

工作流程:
在这里插入图片描述

一、安装配置Gitlab

当前机器:k8s-master01: 192.168.18.101

1、安装Gitlab

当前路径:/root/stady_devops/gitlab

①、下载安装包

wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-15.9.1-ce.0.el7.x86_64.rpm

②、安装

rpm -i gitlab-ce-15.9.1-ce.0.el7.x86_64.rpm

③、编辑vim /etc/gitlab/gitlab.rb 文件
修改 external_url 访问路径 http://192.168.18.101:20550

其他配置如下:

[root@k8s-master01 ~]# cat /etc/gitlab/gitlab.rb | grep -ve "#" |  sed -e '/^$/d'

external_url 'http://192.168.18.101:20550' #外部 URL 地址
gitlab_rails['time_zone'] = 'Asia/Shanghai'	#上海时区
puma['worker_timeout'] = 20		#Puma Web 服务器的工作超时时间为 20 秒,Puma 是 GitLab 使用的一个高性能的 Ruby Web 服务器。
puma['worker_processes'] = 1	#Puma Web 服务器的工作进程数量为 1。
sidekiq['max_concurrency'] = 1	# Sidekiq 后台任务处理器的最大并发数为 1,Sidekiq 是一个用于处理后台任务的框架。
postgresql['shared_buffers'] = "64MB"	#设置 PostgreSQL 数据库的共享缓冲区大小为 64MB
postgresql['max_worker_processes'] = 1	#设置 PostgreSQL 数据库的最大工作进程数量为 1
prometheus['enable'] = false	#禁用了 GitLab 的内置 Prometheus 监控功能
prometheus_monitoring['enable'] = false  #禁用了 GitLab 的 Prometheus 监控集成
  1. sed -e '/^$/d':使用sed命令删除空行。
  2. grep -v "^#":使用grep命令过滤出没有以#开头的行。

④、 重新读取配置文件并且重启gitlab

gitlab-ctl reconfigure
gitlab-ctl restart

此处代表安装成功,占用内存较大,建议设置机器 内存>4G

在这里插入图片描述

2、页面配置

①、查看默认密码

cat /etc/gitlab/initial_root_password

在这里插入图片描述
②、登录后修改默认密码 > 右上角头像 > Perferences > Password

③、 修改系统配置:点击左上角三横 > Admin
# Settings > General > Account and limit > 取消 Gravatar enabled > Save changes

④、 关闭用户注册功能
# Settings > General > Sign-up restrictions > 取消 Sign-up enabled > Save changes

⑤、 开启 webhook 外部访问
# Settings > Network > Outbound requests > Allow requests to the local network from web hooks and services 勾选

⑥、设置语言为中文(全局)
# Settings > Preferences > Localization > Default language > 选择简体中文 > Save changes

⑦、设置当前用户语言为中文
# 右上角用户头像 > Preferences > Localization > Language > 选择简体中文 > Save changes

3、配置secret

创建 gitlab 默认用户名密码 secret,并将其配置进k8s

当前路径:/root/stady_devops/gitlab/

[root@k8s-master01 gitlab]# echo root > ./username
[root@k8s-master01 gitlab]# echo 123456 > ./password
[root@k8s-master01 gitlab]# kubectl create namespace kube-devops
[root@k8s-master01 gitlab]# kubectl create secret generic git-user-pass --from-file=./username --from-file=./password -n kube-devops
  1. kubectl create secret generic git-user-pass:使用kubectl创建一个通用密钥对象,并命名为"git-user-pass"。
  2. --from-file=./username:从名为"username"的文件中提取值。"./username"表示当前目录下的"username"文件,您可以根据实际情况更改文件路径。
  3. --from-file=./password:从名为"password"的文件中提取值。"./password"表示当前目录下的"password"文件,同样,您可以根据实际情况更改文件路径。
  4. -n kube-devops:指定密钥将被创建在"kube-devops"命名空间中。"-n"选项用于指定命名空间。

在这里插入图片描述

创建项目并且将项目文件推送至仓库,详细推送操作看:
Git的使用-在IDEA中使用git

项目文件自取:https://gitee.com/cwc188/k8s-cicd-demo.git

在这里插入图片描述

二、安装Harbor

当前机器: k8s-node02: 192.168.18.103

1、安装

使用国内站点下载harbor安装包

当前路径:/root/study_devops

[root@k8s-node02 study_devops]# wget https://ghproxy.com/https://github.com/goharbor/harbor/releases/download/v2.5.3/harbor-offline-installer-v2.5.3.tgz

解压
[root@k8s-node02 study_devops]# tar -zxvf harbor-offline-installer-v2.5.3.tgz

备份配置文件

当前路径:/root/study_devops/harbor

[root@k8s-node02 harbor]# mv harbor.yml.tmpl harbor.yml

修改相关配置 vim harbor.yml
在这里插入图片描述

安装

./prepare
./install.sh 

搞定!

2、配置 Secret

当前机器:k8s-master01: 192.168.18.101

创建 harbor 访问账号密码(需要将下访问的配置信息改成你自己的)

[root@k8s-master01 ~]#  kubectl create secret docker-registry harbor-secret --docker-server=192.168.18.103:5432 --docker-username=admin --docker-password=aaa123456 -n kube-devops
  • kubectl create secret docker-registry:使用kubectl创建一个Docker Registry的Secret密钥。
  • harbor-secret:指定要创建的密钥的名称,这里是harbor-secret
  • --docker-server=192.168.18.103:5432:指定Docker Registry的服务器地址和端口。在这个示例中,Docker Registry的服务器地址是192.168.18.103,端口是5432。请根据实际情况替换为正确的地址和端口。
  • --docker-username=admin:指定连接到Docker Registry的用户名。在这个示例中,用户名是admin。请根据实际情况替换为正确的用户名。
  • --docker-password=aaa123456:指定连接到Docker Registry的密码。在这个示例中,密码是aaa123456。请根据实际情况替换为正确的密码。
  • -n kube-devops:指定密钥将被创建在kube-devops命名空间中。-n选项用于指定命名空间。

三、安装SonarQube

当前机器:k8s-master01: 192.168.18.101

当前路径:/root/stady_devops/SonarQube

sc动态制备器创建参考:k8s中使用Helm包管理器实战-安装Redis Chart

1、创建PostgreSQL数据库容器

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-data
  namespace: kube-devops
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "managed-nfs-storage"  #SC动态pv制备器名称
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-sonar
  namespace: kube-devops
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres-sonar
  template:
    metadata:
      labels:
        app: postgres-sonar
    spec:
      containers:
      - name: postgres-sonar
        image: postgres:14.2
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_DB
          value: "sonarDB"
        - name: POSTGRES_USER
          value: "sonarUser"
        - name: POSTGRES_PASSWORD 
          value: "123456"
        volumeMounts:
          - name: data
            mountPath: /var/lib/postgresql/data
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: postgres-data
---
apiVersion: v1
kind: Service
metadata:
  name: postgres-sonar
  namespace: kube-devops
  labels:
    app: postgres-sonar
spec:
  type: NodePort
  ports:
  - name: postgres-sonar
    port: 5432
    targetPort: 5432
    protocol: TCP
  selector:
    app: postgres-sonar

2、创建sonarqube容器

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sonarqube-data
  namespace: kube-devops
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "managed-nfs-storage"
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sonarqube
  namespace: kube-devops
  labels:
    app: sonarqube
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sonarqube
  template:
    metadata:
      labels:
        app: sonarqube
    spec:
      initContainers:
      - name: init-sysctl
        image: busybox:1.28.4
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
        securityContext:
          privileged: true
      containers:
      - name: sonarqube
        image: sonarqube
        ports:
        - containerPort: 9000
        env:
        - name: SONARQUBE_JDBC_USERNAME
          value: "sonarUser"
        - name: SONARQUBE_JDBC_PASSWORD
          value: "123456"
        - name: SONARQUBE_JDBC_URL
          value: "jdbc:postgresql://postgres-sonar:5432/sonarDB"
        livenessProbe:
          httpGet:
            path: /sessions/new
            port: 9000
          initialDelaySeconds: 60
          periodSeconds: 30
        readinessProbe:
          httpGet:
            path: /sessions/new
            port: 9000
          initialDelaySeconds: 60
          periodSeconds: 30
          failureThreshold: 6
        volumeMounts:
        - mountPath: /opt/sonarqube/conf
          name: data
        - mountPath: /opt/sonarqube/data
          name: data
        - mountPath: /opt/sonarqube/extensions
          name: data
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: sonarqube-data 
---
apiVersion: v1
kind: Service
metadata:
  name: sonarqube
  namespace: kube-devops
  labels:
    app: sonarqube
spec:
  type: NodePort
  ports:
  - name: sonarqube
    port: 9000
    targetPort: 9000
    protocol: TCP
  selector:
    app: sonarqube

3、启动容器

当前路径:/root/stady_devops

注意:需要pg数据库容器先启动,sonarqube容器才能正常启动。

[root@k8s-master01 stady_devops]# kubectl apply -f SonarQube/

在这里插入图片描述

四、安装配置jenkins

当前主机:k8s-master01:192.168.18.101

1、构建镜像

带 maven 环境的 jenkins 镜像

当前路径:/root/stady_devops/jenkin-test/maven

FROM jenkins/jenkins:2.392-jdk11
ADD ./apache-maven-3.9.0-bin.tar.gz /usr/local/
ADD ./sonar-scanner-4.8.0.2856-linux.tar.gz /usr/local/

USER root

WORKDIR /usr/local/
RUN mv sonar-scanner-4.8.0.2856-linux sonar-scanner-cli
RUN ln -s /usr/local/sonar-scanner-cli/bin/sonar-scanner /usr/bin/sonar-scanner

ENV MAVEN_HOME=/usr/local/apache-maven-3.9.0
ENV PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH

RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
USER jenkins
[root@k8s-master01 maven]# docker build -t 192.168.18.103:5432/library/jenkins-maven01:jdk-11 .

在这里插入图片描述

查看镜像已经存在

在这里插入图片描述

2、登录 harbor

docker login -uadmin 192.168.18.103:5432

在这里插入图片描述

3、推送镜像

docker push 192.168.18.103:5432/library/jenkins-maven01:jdk-11

推送成功

在这里插入图片描述

登录harbor仓库查看,已经存在。

在这里插入图片描述

# 进入 jenkins 目录,安装 jenkins

当前路径:/root/stady_devops/jenkin-test

创建一个mani目录,将jenkins的创建文件放在里面。

kubectl apply -f mani/

# 查看是否运行成功

kubectl get pod -n kube-devops

在这里插入图片描述

# 查看 service 端口,通过浏览器访问

kubectl get svc -n kube-devops

在这里插入图片描述

# 查看容器日志,获取默认密码

kubectl logs -f pod名称 -n kube-devops
例如:kubectl logs -f jenkins-76f76dcc6c-fmw4t  -n kube-devops

到此即部署jenkins成功,可以通过相应端口访问。(这是我修改后的密码)

服务(端口)账号密码
jenkins(30560)admin123456
snoarqube(30303)admin123456
harbor(192.168.18.103:5432)adminaaa123456
gitlab(20550)root123456

4、安装插件

①、Build Authorization Token Root

构建授权 token

②、Gitlab

gitlab 配置插件

③、SonarQube Scanner for Jenkins

代码质量审查工具

④、Node and Label parameter

节点标签参数配置

⑤、Kubernetes

jenkins + k8s 环境配置

⑥、Config File Provider

用于加载外部配置文件,如 Maven 的 settings.xml 或者 k8s 的 kubeconfig 等

⑦、Git Parameter

git 参数插件,在进行项目参数化构建时使用创建 gitlab 访问凭证

5、创建全局访问凭证

①、gitlab和harbor的访问凭证创建方式同样

在这里插入图片描述

②、sonarqube的访问凭证需要去获取相应的token值才可以创建

在这里插入图片描述

在这里插入图片描述

这是我创建的凭证

在这里插入图片描述

6、配置系统配置

在这里插入图片描述

Name:sonarqube # 注意这个名字要在 Jenkinsfile 中用到
Server URL:http://sonarqube:9000

该url无效的话可以像我下面这样填

在这里插入图片描述

Name:sonarqube-scanner
自动安装:取消勾选
SONAR_RUNNER_HOME:/usr/local/sonar-scanner-cli

在这里插入图片描述

配置 k8s 集群

进入 Dashboard > 系统管理 > 节点管理 > Configure Clouds 页面

Kubernetes 地址:
如果 jenkins 是运行在 k8s 容器中,直接配置服务名即可
https://kubernetes.default
Jenkins 地址:
如果部署在 k8s 集群内部:http://jenkins-service.kube-devops
如果在外部:http://192.168.18.101:30560(换成你们自己的)

配置完成后保存即可

在这里插入图片描述

在这里插入图片描述

五、SpringBoot项目CICD实战

项目文件地址:https://gitee.com/cwc188/k8s-cicd-demo.git

1、配置节点标签

系统管理 > 节点管理 > 列表中 master 节点最右侧的齿轮按钮

修改标签的值与项目中 Jenkinsfile 中 agent > kubernetes > label 的值相匹配

在这里插入图片描述

2、创建流水线项目

在首页点击 Create a Job 创建一个流水线风格的项目

在这里插入图片描述

3、Webhook 构建触发器

①、 Jenkins 流水线项目 Webhook 配置

在 Jenkins 项目配置下找到构建触发器栏目

Build when a change is pushed to GitLab. GitLab webhook URL: http://192.168.18.101:30560/project/cicd-test

上方的 URL 就是用于配置到 gitlab 项目 webhook 的地址

启用 Gitlab 构建触发器:
Push Events:表示有任意推送到 git 仓库的操作都会触发构建
Opend Merge Request Events:表示有请求合并时触发构建

在这里插入图片描述

点击高级 > Secret Token > Generate 按钮,生成 token

在这里插入图片描述

配置使用git拉取gitlab仓库的jenkinsfile脚本文件来进行流水线操作

在这里插入图片描述

②、 GitLab 项目 Webhook 配置

进入 GitLab 项目设置界面 > Webhooks

将上方 Jenkins 中的 URL 配置到 URL 处

将上方生成的 Secret Token 配置到 Secret 令牌

按照需求勾选触发来源,这里我依然勾选 推送事件、合并请求事件

取消 SSL 验证

点击添加 webhook 按钮,添加后可以点击测试确认链接是否可以访问

在这里插入图片描述

流水线项目左下角有以下即代表测试推送事件成功

在这里插入图片描述

4、Pipeline 脚本配置

检查/创建相关凭证
①、Harbor 镜像仓库凭证
②、Gitlab 访问凭证

​ ③、kubeconfig 文件 id

  1. 事先安装 Config File Provider 插件

  2. 进入系统管理 > Mapped files > Add a new Config 添加配置文件

2.1 Type 选择 Custom file 点击 next

2.2 在 k8s master 节点执行 cat ~/.kube/config 查看文件内容,并将所有内容复制

2.3 将复制的内容贴到 Config file 的 Content 中后点击 Submit 保存并提交

在这里插入图片描述

  1. 复制保存后文件 id 到 Jenkinsfile 中的 KUBECONFIG_CREDENTIAL_ID 处

④、SonarQube 凭证

添加 SonarQube Webhook

  1. 进入 SonarQube 管理页面,点击顶部菜单栏的配置 > 配置(小三角) > 网络调用

在这里插入图片描述

  1. 点击右侧创建按钮创建新的 Webhook,并填写名称与地址

    在这里插入图片描述

5、构建项目

方式一:在 Jenkins 管理后台,进入项目中点击立即构建进行项目构建

方式二:在开发工具中修改代码,并将代码提交到远程仓库自动触发构建

成功运行pipeline脚本:

在这里插入图片描述

sonarqube成功创建项目进行自动代码质检
在这里插入图片描述

成功将镜像推送到harbor

在这里插入图片描述

成功将项目部署到生产环境

代码为网络上找的,不能正常运行,但是本次学习cicd自动化构建流程目的已经达成

在这里插入图片描述

整体构建成功

在这里插入图片描述
到此结束!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐