Devops项目实战-k8s
在这个DevOps项目中,我采用了一系列工具和技术来实现高效的软件开发、交付和运维流程。
devops实战记录
机器分配:
机器名 | ip | 服务(端口) | 备注: |
---|---|---|---|
k8s-master01 | 192.168.18.101 | Gitlab(20550) | |
k8s-node01 | 192.168.18.102 | jenkins(30560)、sonarqube(30303)、PostgreSQL | 此机器的应用为master分配过来的。所以访问这些应用服务ip使用的是master节点的IP |
k8s-node02 | 192.168.18.103 | harbor(5432) |
说明:
在这个DevOps项目中,我采用了一系列工具和技术来实现高效的软件开发、交付和运维流程。
- GitLab:使用GitLab作为源代码管理和版本控制工具。通过GitLab,管理和协作开发代码。它还提供了强大的持续集成和持续交付功能,使我们能够自动构建、测试和部署应用程序。
- SonarQube:使用SonarQube进行代码质量管理和静态代码分析。SonarQube帮助我们发现和修复潜在的代码缺陷、安全漏洞和代码质量问题。它提供了丰富的代码分析指标和报告,帮助我们持续改进代码质量和可维护性。
- Harbor:作为容器镜像仓库,Harbor提供了安全、稳定的镜像存储和分发平台。将构建的Docker镜像上传到Harbor,通过Harbor进行版本管理、权限控制和镜像复制等操作,确保镜像的可靠性和安全性。
- Spring Boot:作为我们的应用程序开发框架,Spring Boot提供了快速开发和轻量级的微服务架构。它简化了配置和部署过程,提供了丰富的开发工具和库,使我们能够快速构建高性能、可扩展的应用程序。—我也不懂这个框架,网上找的代码进行实验测试。
- Kubernetes:作为容器编排和管理平台,使用Kubernetes来部署、扩展和管理我们的应用程序。Kubernetes提供了自动化的容器调度、负载均衡和故障恢复机制,帮助我们实现高可用性和可伸缩性。
- 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 监控集成
sed -e '/^$/d'
:使用sed
命令删除空行。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
kubectl create secret generic git-user-pass
:使用kubectl创建一个通用密钥对象,并命名为"git-user-pass"。--from-file=./username
:从名为"username"的文件中提取值。"./username"表示当前目录下的"username"文件,您可以根据实际情况更改文件路径。--from-file=./password
:从名为"password"的文件中提取值。"./password"表示当前目录下的"password"文件,同样,您可以根据实际情况更改文件路径。-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-devop
s:指定密钥将被创建在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) | admin | 123456 |
snoarqube(30303) | admin | 123456 |
harbor(192.168.18.103:5432) | admin | aaa123456 |
gitlab(20550) | root | 123456 |
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
事先安装 Config File Provider 插件
进入系统管理 > 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 保存并提交
- 复制保存后文件 id 到 Jenkinsfile 中的 KUBECONFIG_CREDENTIAL_ID 处
④、SonarQube 凭证
添加 SonarQube Webhook
- 进入 SonarQube 管理页面,点击顶部菜单栏的配置 > 配置(小三角) > 网络调用
点击右侧创建按钮创建新的 Webhook,并填写名称与地址
5、构建项目
方式一:在 Jenkins 管理后台,进入项目中点击立即构建进行项目构建
方式二:在开发工具中修改代码,并将代码提交到远程仓库自动触发构建
成功运行pipeline脚本:
sonarqube成功创建项目进行自动代码质检
成功将镜像推送到harbor
成功将项目部署到生产环境
代码为网络上找的,不能正常运行,但是本次学习cicd自动化构建流程目的已经达成
整体构建成功
到此结束!
更多推荐
所有评论(0)