基于helm的方式在k8s集群中部署gitlab - 部署(一)
文章目录
- 1. 背景说明
- 2. 你可以学到什么?
- 3. 前置条件
- 4. 安装docker服务(所有节点)
- 5. 部署k8s集群
- 5.1 系统配置(所有节点)
- 5.2 安装kubelet组件(所有节点)
- 5.2.1 编写kubelet源
- 5.2.2 安装kubelet
- 5.2.3 启动kubelet
- 5.3 集群初始化(master节点)
- 5.4 从节点加入到集群中
- 5.5 安装k8s网络插件
- 5.6 安装ingress网络
- 5.7 配置StorageClass
- 6. helm安装gitlab
- 6.1 添加gitlab的helm源
- 6.2 创建证书密钥
- 6.3 创建集成smtp和ldap的密钥
- 6.4 拉取并修改gitlab的values文件
- 6.5 部署gilab
- 6.6 修改gitlab-nginx-ingress
- 方法1: 修改gitlab-nginx-ingress的暴露type(upgrade后会失效)
- 方法2: 修改gitlab的values文件
- 6.7 修改gitlab-shell的端口
- 7. 部署runner
- 7.1 部署nginx代理
- 7.2 配置runner
- 7.3 更新gitlab
- 7.4 测试runner
- 8. minio功能验证
- 9. ldap功能验证
1. 背景说明
客户之前的gitlab服务在k8s集群中部署的,为了整合现有的硬件资源,计划将gitlab服务迁移到虚拟机上。
先在测试环境进行如下模拟操作:
- 基于kubeadm部署一套k8s集群,在集群上部署gitlab服务;
- 将数据备份到对象存储中;
- 最终将数据恢复在另外一台gitlab单实例上,实现gitlab在k8s和单实例ominibus之前迁移的一个完整闭环。
2. 你可以学到什么?
- k8s集群部署
- K8s 暴露服务的类型
- K8s storageclass、configmap、secret
- helm部署gitlab(配置smtp、ldap、runner)
- gitlab配置对象存储
3. 前置条件
- helm 安装
- K8s 集群版本 1.23 (两台 8C16G OS为7.9)
- Docker 版本 20.10.23
- 证书在阿里云上申请免费ssl证书即可或者通过let’s encry 申请免费的泛域名证书
4. 安装docker服务(所有节点)
参考 docker安装(二进制&yum)
5. 部署k8s集群
参考k8s1.15安装详细精华版
也可以通过如下命令快捷安装
5.1 系统配置(所有节点)
修改内核参数 - /etc/sysctl.conf
# 转发
net.ipv4.ip_forward = 1
# iptables网络
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#加在生效
sysctl -p
5.2 安装kubelet组件(所有节点)
5.2.1 编写kubelet源
编辑/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
yum repolist
5.2.2 安装kubelet
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
5.2.3 启动kubelet
# 启动
systemctl start kubelet.service
# 开启自启
systemctl enable kubelet.service
5.3 集群初始化(master节点)
主节点上执行如下命令
# 命令解析
kubeadm init \
--apiserver-advertise-address=10.100.0.14 \ # 通常为主节点的ip地址
--image-repository registry.aliyuncs.com/google_containers \ # 指定基础镜像拉取的仓库
--kubernetes-version v1.23.0 \ # 指定k8s的组件版本
--service-cidr=10.92.0.0/12 \ # k8s集群svc的子网
--pod-network-cidr=10.220.0.0/16 \ # k8s集群pod的子网
--ignore-preflight-errors=all # 忽略运行时的错误# 一条初始化命令如下:
kubeadm init --apiserver-advertise-address=10.100.0.14 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.23.0 --service-cidr=10.92.0.0/12 --pod-network-cidr=10.220.0.0/16 --ignore-preflight-errors=all
5.4 从节点加入到集群中
从节点上执行如下命令
kubeadm join 10.100.0.14:6443 \--token saleos.q26gm2rbtgrwvdla \--discovery-token-ca-cert-hash sha256:5058ac78bd8f7879e14bae262d359b2b499d55a2d54796e3d103a27208f06d93
5.5 安装k8s网络插件
# 参考 https://github.com/flannel-io/flannel#deploying-flannel-with-kubectl
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
5.6 安装ingress网络
# 参考 https://github.com/kubernetes/ingress-nginx/tree/controller-v1.1.1#support-versions-table
# 参考 https://github.com/kubernetes/ingress-nginx/blob/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
# 下载wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
# 如果有问题 可以下一下crd的网络和你的svc的crd一样即可,将LoadBalancer改成NodePort
5.7 配置StorageClass
参考 安装并配置StorageClass
6. helm安装gitlab
6.1 添加gitlab的helm源
# 添加helm源
helm repo add gitlab-jh https://charts.gitlab.cn
# 更新helm源
helm repo update
6.2 创建证书密钥
# 创建gitlab服务运行的命名空间
kubectl create ns jihulab
# 创建证书sa(将证书上传到主节点机器上的某个目录下,然后切换到该目录即可)
kubectl create secret tls gitlab-jihulab-cn-ssl --cert=kube.bdeet.top.pem --key=kube.bdeet.top.key -n jihulab
kubectl create secret tls registry-jihulab-cn-ssl --cert=registry.bdeet.top.pem --key=registry.bdeet.top.key -n jihulab
kubectl create secret tls minio-jihulab-cn-ssl --cert=minio.bdeet.top.pem --key=minio.bdeet.top.key -n jihulab
6.3 创建集成smtp和ldap的密钥
kubectl create secret generic ldap-admin --from-literal=password='Jh@2022' -n jihulab
kubectl create secret generic smtp-gitlab --from-literal=password='wqfhqohixshrnnnh' -n jihulab
6.4 拉取并修改gitlab的values文件
拉取gitlab 15.8.0的charts,编辑values文件
...
...
## 域名配置hosts: domain: bdeet.top hostSuffix: externalIP: ssh: gitlab: name: kube.bdeet.top https: true minio: name: minio.bdeet.top https: true registry: name: registry.bdeet.top https: true
...
...
## ldap集成ldap: preventSignin: false servers: main: label: 'LDAP' host: '129.226.208.223' port: 389 uid: 'uid' bind_dn: 'cn=ldap,dc=wkx,dc=cn' base: 'dc=wkx,dc=cn' password: secret: ldap-admin key: password encryption: 'plain'
...
...
## 配置邮箱 smtp: enabled: true address: smtp.gmail.com port: 587 user_name: "kxw12108@gmail.com" ## https://docs.gitlab.com/charts/installation/secrets#smtp-password password: secret: "smtp-gitlab" key: password # domain: authentication: "login" starttls_auto: true openssl_verify_mode: "peer" pool: false ## https://docs.gitlab.com/charts/charts/globals#outgoing-email ## Email persona used in email sent by GitLab email: from: "kxw12108@gmail.com" display_name: "GitLab Administrator" reply_to: "kxw12108@gmail.com" subject_suffix: "GitLab" smime: enabled: false secretName: "" keyName: "tls.key" certName: "tls.crt"
...
...
6.5 部署gilab
# 创建gitlab运行的命名空间
kubectl create ns jihulab
# 安装gitlab
helm install gitlab gitlab-jh/gitlab \
--version 6.8.0 \
--timeout 600s \
--set certmanager.install=false \
--set global.ingress.configureCertmanager=false \
--set global.ingress.tls.enabled=true \
--set gitlab.webservice.ingress.tls.secretName=gitlab-jihulab-cn-ssl \
--set registry.ingress.tls.secretName=registry-jihulab-cn-ssl \
--set minio.ingress.tls.secretName=minio-jihulab-cn-ssl \
--values values.yaml -n jihulab
6.6 修改gitlab-nginx-ingress
方法1: 修改gitlab-nginx-ingress的暴露type(upgrade后会失效)
kubectl edit svc -n jihulab gitlab-nginx-ingress-controller
# 将type: LoadBalancer 改成 type: NodePort,保存退出后,会看到gitlab-shell
方法2: 修改gitlab的values文件
...
...
nginx-ingress:enabled: true......service:externalTrafficPolicy: "Local"type: "NodePort" # 添加ingress的svc的type......
问题说明
由于我们的自建k8s集群 gitlab的ingress的svc没有使用LoadBalancer而是NodePort,因为之前将minio、registry、gitlab的域名解析到该节点上后肯定是无法访问的,还必须需要在域名后添加nodeport的端口才可以。
kube.bdeet.top ---> kube.bdeet.top:nodeport
registry.bdeet.top ---> registry.bdeet.top:nodeport
minio.bdeet.top ---> minio.bdeet.top:nodeport
6.7 修改gitlab-shell的端口
由于将gitlab-nginx-ingress-controller的暴露端口的方式修改成了NodePort,因为ssh的端口也需要调整(查看下gitlab-nginx-ingress-controller ssh的暴露端口),否则会无法克隆。修改gitlab-shell
...
...
global: shell: port: 31475
...
...
更新gitlab
# 更新
helm upgrade gitlab gitlab-jh/gitlab \
--version 6.8.0 \
--timeout 600s \
--set certmanager.install=false \
--set global.ingress.configureCertmanager=false \
--set global.ingress.tls.enabled=true \
--set gitlab.webservice.ingress.tls.secretName=gitlab-jihulab-cn-ssl \
--set registry.ingress.tls.secretName=registry-jihulab-cn-ssl \
--set minio.ingress.tls.secretName=minio-jihulab-cn-ssl \
--set nginx-ingress.service.type=NodePort \
--set global.shell.port=31475 \
--values values.yaml -n jihulab
7. 部署runner
这样的runner存在一个问题就是由于使用的是nodeport的暴露方式,因为runner中的gitlaburl需要加端口,同时在runner进行克隆的时候也需要加端口,因为在部署一个nginx,作为一个转发。
7.1 部署nginx代理
# 安装nginx
yum -y install nginx
# 配置nginx
# cat /etc/nginx/nginx.conf
...
...server {listen 443 ssl http2;listen [::]:443 ssl http2;server_name kube.bdeet.top;ssl_certificate "/root/cert/kube.bdeet.top.pem";ssl_certificate_key "/root/cert/kube.bdeet.top.key";ssl_session_cache shared:SSL:1m;ssl_session_timeout 10m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {proxy_pass https://kube.bdeet.top:31501;}error_page 404 /404.html;location = /40x.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}
...
...
7.2 配置runner
修改values文件
...
...runner:registrationToken:secret: gitlab-gitlab-runner-secret # gitlab-runner的secret
...
...
gitlab-runner:install: truegitlabUrl: https://kube.bdeet.top #修改gitlab的域名rbac:create: truerunners:privileged: true #开启特权locked: falseconfig: |[[runners]][runners.kubernetes]image = "ubuntu:18.04"{{- if .Values.global.minio.enabled }}[runners.cache]Type = "s3"Path = "gitlab-runner"Shared = true[runners.cache.s3]#ServerAddress = {{ include "gitlab-runner.cache-tpl.s3ServerAddress" . }}ServerAddress = "https://minio.bdeet.top:31501" #接入对象存储BucketName = "runner-cache"BucketLocation = "us-east-1"Insecure = false
...
...
7.3 更新gitlab
Upgrade 更新gitlab
helm upgrade gitlab gitlab-jh/gitlab \
--version 6.8.0 \
--timeout 600s \
--set certmanager.install=false \
--set global.ingress.configureCertmanager=false \
--set global.ingress.tls.enabled=true \
--set gitlab.webservice.ingress.tls.secretName=gitlab-jihulab-cn-ssl \
--set registry.ingress.tls.secretName=registry-jihulab-cn-ssl \
--set minio.ingress.tls.secretName=minio-jihulab-cn-ssl \
--set nginx-ingress.service.type=NodePort \
--set global.shell.port=31475 \
--values values.yaml -n jihulab
7.4 测试runner
gitlab上创建一个pipeline项目,然后commit提交后触发。
.gitlab-ci.yml文件如下
image: busybox:latestbefore_script:- echo "Before script section"- echo "For example you might run an update here or install a build dependency"- echo "Or perhaps you might print out some debugging details"after_script:- echo "After script section"- echo "For example you might do some cleanup here"build1:stage: buildscript:- echo "Do your build here"test1:stage: testscript:- echo "Do a test here"- echo "For example run a test suite"- echo 1 > index.htmlartifacts:paths:- index.htmltest2:stage: testscript:- echo "Do another parallel test here"- echo "For example run a lint test"deploy1:stage: deployscript:- echo "Do your deploy here"environment: production
可以发现minio上有artifacts文件(5/6/9 分别是job的artifacts文件、meta元数据、日志)

## 8. 邮箱验证
可以验证项目创建、提交代码、pipeline测试、runner测试、minio测试
修改个人邮箱

设置通知 - 自定义全部勾选

运行pipeline

邮箱查看

8. minio功能验证
查看artifacts

9. ldap功能验证
查看用户属性


相关文章:
基于helm的方式在k8s集群中部署gitlab - 部署(一)
文章目录 1. 背景说明2. 你可以学到什么?3. 前置条件4. 安装docker服务(所有节点)5. 部署k8s集群5.1 系统配置(所有节点)5.2 安装kubelet组件(所有节点)5.2.1 编写kubelet源5.2.2 安装kubelet5.2.3 启动kubelet 5.3 集…...
flask web开发学习之初识flask(二)
文章目录 一、创建程序实例并注册路由1. 为视图绑定绑定多个URL2. 动态URL 二、启动开发服务器1. 自动发现程序实例2. 管理环境变量3. 使用pycharm运行服务器4. 更多的启动选项5. 设置运行环境6. 调试器7. 重载器 一、创建程序实例并注册路由 app.py # 从flask包中导入flask类…...
利用异或、取反、自增bypass_webshell_waf
目录 引言 利用异或 介绍 eval与assert 蚁剑连接 进阶题目 利用取反 利用自增 引言 有这样一个waf用于防御我们上传的文件: function fun($var): bool{$blacklist ["\$_", "eval","copy" ,"assert","usort…...
K8s Docker实践三
单主机创建多个node 在Mac桌面上部署多个Kubernetes节点可以使用Minikube工具。Minikube是一个轻量级的Kubernetes工具,它可以在单个主机上创建一个虚拟集群。以下是在Mac桌面上使用Minikube部署多个Kubernetes节点的步骤: 安装Minikube,运…...
记录 | pip加速配置
以下方法不仅适用于linux,也适用于mac 临时加速配置: pip install -i https://pypi.douban.com/simple --trusted-host pypi.douban.com matplotlib3.4.0其中可选源有: https://pypi.douban.com/simple http://mirrors.aliyun.com/pypi/sim…...
HarmonyOS开发—Arkts循环渲染(ForEach)深入运用详解【鸿蒙专栏-16】
文章目录 ArkTS ForEach接口详解与应用示例ForEach接口概述介绍接口描述参数说明键值生成规则默认规则组件创建规则首次渲染非首次渲染使用场景高级用法条件渲染逻辑LazyForEach的性能优化渲染结果预期ForEach的错误使用案例与性能降低渲染结果非预期渲染性能降低结语ArkTS For…...
uniapp挽留提示2.0
项目需求:有时候挽留的ui是全屏的,用page-container也可以。后来产品提了个问题,手机侧滑的时候没那么顺畅(就是一用侧滑,就显示出来,产品要的方案是如下图,emmm大概是这个意思) 后面…...
电源控制系统架构(PCSA)之系统分区电压域
目录 4.1 电压域 4.1.1 系统逻辑 4.1.2 Always-On逻辑 4.1.3 处理器Clusters 4.1.4 图形处理器 4.1.5 其他功能 4.1.6 SoC分区示例 本章描述基于Arm组件的SoC划分为电压域和电源域。 所描述的选择并不详尽,只是可能性的一个子集。目的是描述基于Arm组件的SoC…...
[Linux] 正则表达式及grep和awk
一、正则表达式 1.1 什么是正则表达式 正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。 正则表达式可以在文本中查找、替换、提取和验证特定的模式。 正则表达式和通配符的区别 正则…...
ssm+java车辆售后维护系统 springboot汽车保养养护管理系统+jsp
以前汽车维修人员只是在汽车运输行业中从事后勤保障工作,随着我国经济的发展,汽车维修行业已经从原来的从属部门发展成了如今的功能齐备的独立企业。这种结构的转变,给私营汽修企业和个体汽修企业的发展带来了契机,私营企业和个体维修企业的加入也带动了整个汽修行业的整体水平…...
HNU练习七 字符串编程题7. 机器人游戏
【问题描述】 有人建造了一些机器人,并且将他们放置在包含n个单元的一维网格上,一个长度为n的字符串s代表了他们的编排方式,字符串中的字符既可以是.,也可以是0~9之间的一个数字字符,字符.表示开始时在相应的单元上无机…...
【Linux】bash 终端指令
bash # 查看当前使用的shell $ echo $SHELL /bin/bash# 查看当前发行版可以使用的shell $ cat /etc/shells 或 chsh -l /bin/sh /bin/bash /sbin/nologin /bin/zsh /bin/tcsh /bin/csh# 切换bash $ chsh -s /bin/bash# 切换zsh $ chsh -s /bin/zsh进程 $ ps aux | grep pwd w…...
基于SpringBoot高校心理教育辅导设计与实现
摘 要 随着Internet技术的发展,心理教育辅导系统应运而生,心理教育辅导系统为用户提供了一个更为便利的心理测试咨询平台。所以,为了充分满足高校学生心理教育辅导的需求,特开发了本高校心理教育辅导系统。 本高校心理教育辅导系统…...
关于电脑提示vcruntime140_1.dll无法继续执行代码的解决办法
vcruntime140_1.dll是Visual C运行时库的一个组成部分,它包含了大量用于支持C应用程序运行时的功能。这个文件通常在开发和使用C程序时被调用,特别是在使用Microsoft Visual Studio进行开发时。vcruntime140_1.dll文件丢失或损坏会导致C程序无法正常运行…...
5. 链表
内存空间是所有程序的公共资源,在一个复杂的系统运行环境下,空闲的内存空间可能散落在内存各处。我们知道,存储数组的内存空间必须是连续的,而当数组非常大时,内存可能无法提供如此大的连续空间。此时链表的灵活性优势…...
OSI七层模型与TCP/IP四层模型的区别(计算机网络)
一、OSI七层网络模型 OSI 网络模型共有 7 层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。 应用层,负责给应用程序提供统一的接口;表示层,负责把数据转换成兼容另一个系统能识别的格式;会话…...
Other--什么是 CGI,FastCGI、asp、jsp
文章目录 1. 了解什么是动态网页2. 什么是 CGI2.1 CGI 概念2.2 CGI 功能2.3 CGI 作用2.4 CGI 分类2.5 CGI 程序的工作原理2.6 CGI 程序的特点2.7 CGI 程序的应用领域4. 什么是 FastCGI4.1 FastCGI 概念4.2 FastCGI 程序工作原理4.3 FastCGI 对进程的管理方式4.4 FastCGI 的特点…...
sql关联另一个表,update表的值
sql示例: update student_score ss set ss.names.name from student s where ss.codes.code 最常见的学生成绩表 student_score通过学生student_code关联学生信息表student 学生信息表(student): code name age gender 1001 …...
Python基础:JSON保存结构化数据(详解)
1. JSON概念 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生产。 虽然JSON使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台,JSON解…...
抑郁症日常如何调节?
抑郁症是一种常见的心理障碍,影响患者的情绪、思维和身体健康。以下是一些建议,帮助抑郁症患者进行日常调节: 保持积极心态:积极的心态是应对抑郁症的关键。尝试保持乐观、积极的态度,看待生活中的困难和挑战。尽管抑…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
