赞
踩
机器分配:
机器名 | 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项目中,我采用了一系列工具和技术来实现高效的软件开发、交付和运维流程。
工作流程:
当前机器:k8s-master01: 192.168.18.101
当前路径:/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
①、查看默认密码
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
创建 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
当前机器: k8s-node02: 192.168.18.103
使用国内站点下载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
搞定!
当前机器: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
选项用于指定命名空间。
当前机器:k8s-master01: 192.168.18.101
当前路径:/root/stady_devops/SonarQube
sc动态制备器创建参考:k8s中使用Helm包管理器实战-安装Redis Chart
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
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/
当前主机:k8s-master01:192.168.18.101
带 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 .
查看镜像已经存在
docker login -uadmin 192.168.18.103:5432
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 |
①、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 访问凭证
①、gitlab和harbor的访问凭证创建方式同样
②、sonarqube的访问凭证需要去获取相应的token值才可以创建
这是我创建的凭证
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(换成你们自己的)
配置完成后保存即可
项目文件地址:https://gitee.com/cwc188/k8s-cicd-demo.git
系统管理 > 节点管理 > 列表中 master 节点最右侧的齿轮按钮
修改标签的值与项目中 Jenkinsfile 中 agent > kubernetes > label 的值相匹配
在首页点击 Create a Job 创建一个流水线风格的项目
在 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 项目设置界面 > Webhooks
将上方 Jenkins 中的 URL 配置到 URL 处
将上方生成的 Secret Token 配置到 Secret 令牌
按照需求勾选触发来源,这里我依然勾选 推送事件、合并请求事件
取消 SSL 验证
点击添加 webhook 按钮,添加后可以点击测试确认链接是否可以访问
流水线项目左下角有以下即代表测试推送事件成功
检查/创建相关凭证
①、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,并填写名称与地址
方式一:在 Jenkins 管理后台,进入项目中点击立即构建进行项目构建
方式二:在开发工具中修改代码,并将代码提交到远程仓库自动触发构建
成功运行pipeline脚本:
sonarqube成功创建项目进行自动代码质检
成功将镜像推送到harbor
成功将项目部署到生产环境
代码为网络上找的,不能正常运行,但是本次学习cicd自动化构建流程目的已经达成
整体构建成功
到此结束!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。