天行健,君子以自强不息;地势坤,君子以厚德载物。
每个人都有惰性,但不断学习是好好生活的根本,共勉!
文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。
一、概述
在k8s中部署gitlab,然后使用gitlab来实现代码打包到打镜像再到使用镜像自动生成容器服务的过程
用到了reids、postgresql、gitlab,将三个应用配置好之后启动即可安装gitlab
二、持久化存储安装
安装持久化存储工具,可以使用nfs或ebs
以ebs为例(使用起来好像简单些)
1. 安装ebs
kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml
2. 查看ebs集群服务
查看集群的StorageClass
kubectl get sc
3. 设置ebs为默认
设置openobs-hostpath为default
kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
4. 使用ebs
在配置持久化时可根据安装的持久化工具将storageClassName参数的值填充:
先查看sc的名称
kubectl get sc
然后将其名称作为storageClassName参数对应的值
如ebs名称为openebs-hostpath
则在pvc中配置参数为
storageClassName: openebs-hostpath
三、创建命名空间
在部署之前先创建一个namespace用于分类管理服务
创建一个名为gitlab-dev的命名空间
kubectl create namespace gitlab-dev
四、账号密码
分别创建存储账号和密码的文件
账号文件username,用于存储账号信息
echo -n "gitlab-admin" > ./username
密码文件password,用于存储密码信息
echo -n "gitlab.123" > ./password
查看文件
ls
查看文件内容
cat ./username
cat ./password
secret对象生成
kubectl create secret generic git-user-pass --from-file=./username --from-file=./password -n gitlab-dev
查看secret
kubectl -n gitlab-dev get secret git-user-pass -o yaml
拓展:
如果创建错误或者想重新创建secret,则需先删除
kubectl delete secret git-user-pass -n gitlab-dev
五、创建文件夹
创建gitlab-yaml文件夹用于存储gitlab相关的yaml部署文件
mkdir -p gitlab-yaml
六、Postgresql部署
为了方便管理以及后续修改更新文件,本篇对每个结构部分都创建一个yaml文件,且创建的文件都放在当前目录下的gitlab-yaml文件夹下,后续redis和gitlab的部分与此相同
参数:
pgs:Postgresql
dplm:Deployment
pvc:PersistentVolumeClaim
svc:Service
1. 持久化配置
pgs-pvc.yaml
1.1 文件创建
创建文件pgs-pvc.yaml
vim ./gitlab-yaml/pgs-pvc.yaml
将以下内容复制粘贴到文件中,其中name可自定义,namespace前面创建了gitlab-dev
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pgs-pvc
namespace: gitlab-dev
spec:
accessModes:
- ReadWriteOnce
storageClassName: openebs-hostpath
resources:
requests:
storage: 1Gi
查看文件内容
cat ./gitlab-yaml/pgs-pvc.yaml
1.2 部署命令
根据文件来部署服务
kubectl apply -f ./gitlab-yaml/pgs-pvc.yaml
1.3 查看服务
查看创建的服务
kubectl get pvc -n gitlab-dev pgs-pvc
注:如需删除创建的服务请参考:kubectl操作命令集合
2. 部署配置
pgs-dplm.yaml
2.1 文件创建
创建文件pgs-dplm.yaml
vim ./gitlab-yaml/pgs-dplm.yaml
将以下内容复制粘贴到文件中
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgresql
namespace: gitlab-dev
labels:
name: postgresql
spec:
replicas: 1
selector:
matchLabels:
name: postgresql
template:
metadata:
name: postgresql
labels:
name: postgresql
spec:
#nodeSelector:
#key: gitlab-dev
containers:
- name: postgresql
image: sameersbn/postgresql
imagePullPolicy: IfNotPresent
env:
- name: DB_USER
value: gitlab
- name: DB_PASS
value: passw0rd
- name: DB_NAME
value: gitlab_production
- name: DB_EXTENSION
value: pg_trgm
ports:
- name: postgres
containerPort: 5432
volumeMounts:
- mountPath: /var/lib/postgresql
name: data
livenessProbe:
exec:
command:
- pg_isready
- -h
- localhost
- -U
- postgres
initialDelaySeconds: 30
timeoutSeconds: 5
readinessProbe:
exec:
command:
- pg_isready
- -h
- localhost
- -U
- postgres
initialDelaySeconds: 5
timeoutSeconds: 1
volumes:
- name: data
persistentVolumeClaim:
claimName: pgs-pvc
注:nodeSelector的key的值就是namespace,最后的claimName的值是持久化配置文件的名称pgs-pvc
查看文件内容
cat ./gitlab-yaml/pgs-dplm.yaml
2.2 部署命令
部署服务
kubectl apply -f ./gitlab-yaml/pgs-dplm.yaml
2.3查看服务
查看已创建的服务
kubectl get pod -n gitlab-dev
注:pod启动需要一点时间,开始状态为ContainerCreating,过一会才会显示Running
3. 服务配置
pgs-svc.yaml
3.1 文件创建
创建文件pgs-svc.yaml
vim ./gitlab-yaml/pgs-svc.yaml
将以下内容复制粘贴到文件中
apiVersion: v1
kind: Service
metadata:
name: postgresql
namespace: gitlab-dev
labels:
name: postgresql
spec:
ports:
- name: postgres
port: 5432
targetPort: postgres
selector:
name: postgresql
查看文件内容
cat ./gitlab-yaml/pgs-svc.yaml
3.2 部署命令
部署服务
kubectl apply -f ./gitlab-yaml/pgs-svc.yaml
3.3 查看服务
查看已部署的服务
kubectl get svc -n gitlab-dev
七、Redis部署
数据缓存redis
1. 持久化配置
redis-pvc.yaml
1.1 文件创建
创建文件redis-pvc.yaml
vim ./gitlab-yaml/redis-pvc.yaml
将以下内容复制粘贴到文件中
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-pvc
namespace: gitlab-dev
spec:
accessModes:
- ReadWriteOnce
storageClassName: openebs-hostpath
resources:
requests:
storage: 1Gi
查看文件内容
cat ./gitlab-yaml/redis-pvc.yaml
1.2 部署命令
部署服务
kubectl apply -f ./gitlab-yaml/redis-pvc.yaml
1.3 查看服务
查看已部署的服务
kubectl get pvc -n gitlab-dev redis-pvc
2. 部署配置
redis-dplm.yaml
2.1 文件创建
创建redis-dplm.yaml文件
vim ./gitlab-yaml/redis-dplm.yaml
将以下内容复制粘贴到文件中
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: gitlab-dev
labels:
name: redis
spec:
replicas: 2
selector:
matchLabels:
name: redis
template:
metadata:
name: redis
labels:
name: redis
spec:
#nodeSelector:
#key: gitlab-dev
containers:
- name: redis
image: sameersbn/redis
imagePullPolicy: IfNotPresent
ports:
- name: redis
containerPort: 6379
volumeMounts:
- mountPath: /var/lib/redis
name: data
livenessProbe:
exec:
command:
- redis-cli
- ping
initialDelaySeconds: 30
timeoutSeconds: 5
readinessProbe:
exec:
command:
- redis-cli
- ping
initialDelaySeconds: 5
timeoutSeconds: 1
volumes:
- name: data
persistentVolumeClaim:
claimName: redis-pvc
查看文件内容
cat ./gitlab-yaml/redis-dplm.yaml
2.2 部署命令
部署服务
kubectl apply -f ./gitlab-yaml/redis-dplm.yaml
2.3 查看服务
查看已部署的服务
kubectl get pod -n gitlab-dev
因为文件中配置的副本数为2,故生成了两个redis的pod
3. 服务配置
redis-svc.yaml
3.1 文件创建
创建文件redis-svc.yaml
vim ./gitlab-yaml/redis-svc.yaml
讲一下内容复制粘贴进文件中
apiVersion: v1
kind: Service
metadata:
name: redis-svc
namespace: gitlab-dev
labels:
name: redis-svc
spec:
ports:
- name: redis
port: 6379
targetPort: redis
selector:
name: redis
查看文件内容
cat ./gitlab-yaml/redis-svc.yaml
3.2 部署命令
部署服务
kubectl apply -f ./gitlab-yaml/redis-svc.yaml
3.3 查看服务
查看已部署的服务
kubectl get svc -n gitlab-dev redis-svc
八、GitLab部署
gitlab
1. 持久化配置
gitlab-pvc.yaml
1.1 文件创建
创建文件gitlab-pvc.yaml
vim ./gitlab-yaml/gitlab-pvc.yaml
将以下内容复制粘贴到文件中
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gitlab-pvc
namespace: gitlab-dev
spec:
accessModes:
- ReadWriteOnce
storageClassName: openebs-hostpath
resources:
requests:
storage: 5Gi
查看文件内容
cat ./gitlab-yaml/gitlab-pvc.yaml
1.2 部署命令
部署服务
kubectl apply -f ./gitlab-yaml/gitlab-pvc.yaml
1.3 查看服务
查看已部署的服务
kubectl get pvc -n gitlab-dev gitlab-pvc
2. 部署配置
gitlab-dplm.yaml
本篇以gitlab-ce-15.6.0-ce.0为例
版本多次尝试结果如下:
可用版本(成功启动pod并成功访问)
gitlab-ce-14.0.0-ce.0
gitlab-ce-15.6.0-ce.0
不可用版本(不一定准确,只是自己跑了一遍未成功启动,也可能时间太久了懒得等,可自行尝试以辨真伪)
gitlab-ce-15.7.0-ce.0
gitlab-ce-15.8.0-ce.0
gitlab-ce-15.9.0-ce.0
gitlab-ce-16.0.0-ce.0
gitlab-ce-16.1.6-ce.0
gitlab-ce-16.2.0-ce.0
gitlab-ce-16.3.0-ce.0
gitlab-ce-16.4.0-ce.0
gitlab-ce-16.5.0-ce.0
gitlab-ce-16.6.0-ce.0
gitlab-ce-16.7.0-ce.0
gitlab-ce-16.8.0-ce.0
2.1 文件创建
创建文件gitlab-dplm.yaml
vim ./gitlab-yaml/gitlab-dplm.yaml
讲一下内容复制粘贴到文件中
apiVersion: apps/v1
kind: Deployment
metadata:
name: gitlab
namespace: gitlab-dev
labels:
name: gitlab
spec:
replicas: 1
selector:
matchLabels:
name: gitlab
template:
metadata:
name: gitlab
labels:
name: gitlab
spec:
#nodeSelector:
#key: gitlab-dev
containers:
- name: gitlab
# image: sameersbn/gitlab:12.1.6
image: gitlab/gitlab-ce:15.6.0-ce.0
# command: ["/bin/bash","-ce","tail -f /dev/null"]
imagePullPolicy: IfNotPresent
env:
- name: TZ
value: Asia/Shanghai
- name: GITLAB_TIMEZONE
value: Beijing
- name: GITLAB_SECRETS_DB_KEY_BASE
value: long-and-random-alpha-numeric-string
- name: GITLAB_SECRETS_SECRET_KEY_BASE
value: long-and-random-alpha-numeric-string
- name: GITLAB_SECRETS_OTP_KEY_BASE
value: long-and-random-alpha-numeric-string
- name: GITLAB_ROOT_PASSWORD
#value: admin321
valueFrom:
secretKeyRef:
name: git-user-pass
key: password
- name: GITLAB_ROOT_EMAIL
value: hslb@163.com
- name: GITLAB_HOST
value: gitlab.hslb.com
- name: GITLAB_PORT
value: "30021"
- name: GITLAB_SSH_PORT
value: "30022"
- name: GITLAB_NOTIFY_ON_BROKEN_BUILDS
value: "true"
- name: GITLAB_NOTIFY_PUSHER
value: "false"
- name: GITLAB_BACKUP_SCHEDULE
value: daily
- name: GITLAB_BACKUP_TIME
value: 01:00
- name: DB_TYPE
value: postgres
- name: DB_HOST
value: postgresql
- name: DB_PORT
value: "5432"
- name: DB_USER
value: gitlab
- name: DB_PASS
value: passw0rd
- name: DB_NAME
value: gitlab_production
- name: REDIS_HOST
value: redis
- name: REDIS_PORT
value: "6379"
ports:
- name: http
containerPort: 80
- name: ssh
containerPort: 22
volumeMounts:
#- mountPath: /home/git/data
- mountPath: /etc/gitlab
- mountPath: /var/opt/gitlab
name: data
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 180
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 180
timeoutSeconds: 5
volumes:
- name: data
persistentVolumeClaim:
claimName: gitlab-pvc
GITLAB_ROOT_PASSWORD
密码部分,可以直接将值设为密码,这里从第二章中设置的密码文件中读取
GITLAB_ROOT_EMAIL
邮箱部分,自定义即可
GITLAB_HOST
主机地址,可自定义
查看文件内容
cat ./gitlab-yaml/gitlab-dplm.yaml
图为后补的,工具窗口不同了,不用在意
2.2 部署命令
部署服务
kubectl apply -f ./gitlab-yaml/gitlab-dplm.yaml
2.3 查看服务
查看已部署的服务
kubectl get pod -n gitlab-dev
此时遇到的问题是gitlab这个pod一直启动不成功,解决方法请看:gitlab启动失败后一直重启问题解决
问题解决后,正常如下图
kubectl get pod -n gitlab-dev -o wide
3. 服务配置
gitlab-svc.yaml
3.1 文件创建
创建文件gitlab-svc.yaml
vim ./gitlab-yaml/gitlab-svc.yaml
将以下内容复制粘贴到文件中
apiVersion: v1
kind: Service
metadata:
name: gitlab
namespace: gitlab-dev
labels:
name: gitlab
spec:
ports:
- name: http
port: 80
targetPort: http
nodePort: 30021
- name: ssh
port: 22
targetPort: ssh
nodePort: 30022
selector:
name: gitlab
type: NodePort
查看文件内容
cat ./gitlab-yaml/gitlab-svc.yaml
3.2 部署命令
部署服务
kubectl apply -f ./gitlab-yaml/gitlab-svc.yaml
3.3 查看服务
查看已部署的服务
kubectl get svc -n gitlab-dev
以上就是redis、postgresql、gitlab三个部分的部署
九、命令总结
如果出现问题需要删除创建的服务,可参考以下命令
1. 部署pvc
kubectl apply -f ./gitlab-yaml/pgs-pvc.yaml
kubectl apply -f ./gitlab-yaml/redis-pvc.yaml
kubectl apply -f ./gitlab-yaml/gitlab-pvc.yaml
2. 查看pvc
kubectl get pvc -n gitlab-dev
3. 删除指定pvc
kubectl delete pvc pgs-pvc -n gitlab-dev
4. 部署pod
kubectl apply -f ./gitlab-yaml/pgs-dplm.yaml
kubectl apply -f ./gitlab-yaml/redis-dplm.yaml
kubectl apply -f ./gitlab-yaml/gitlab-dplm.yaml
5. 查看pod
kubectl get pod -n gitlab-dev
6. 删除pod
删除无副本设置的pod
kubectl delete pod postgresql -n gitlab-dev
删除设置副本的pod
kubectl delete deployment postgresql -n gitlab-dev
7. 部署svc
kubectl apply -f ./gitlab-yaml/pgs-svc.yaml
kubectl apply -f ./gitlab-yaml/redis-svc.yaml
kubectl apply -f ./gitlab-yaml/gitlab-svc.yaml
8. 查看svc
kubectl get svc -n gitlab-dev
9. 删除指定svc
kubectl delete svc postgresql -n gitlab-dev
注:此注释可无视,由于操作是在阿里云服务器的运维管理浏览器窗口操作,复制粘贴功能有瑕疵导致内容格式会错乱,故安装了ossutil工具,在本地创建了文件后上传到oss然后再拉取到服务器指定位置(gitlab-yaml文件夹),如有需要可参考linux服务器中oss工具安装和上传下载文件
十、访问GitLab
访问已经部署好的gitlab服务
1. 访问地址
首先根据自己的服务查看服务所在节点
然后使用节点ip+端口即可访问
查看gitlab的pod部署在哪个节点
kubectl get pod -n gitlab-dev -o wide
如图,部署在k8s-worker2节点
查看gitlab服务映射的端口
kubectl get svc -n gitlab-dev -o wide
如图,映射的端口为30021
故,gitlab访问地址为worker2节点ip+端口号30021
gitlab服务所在节点ip:30021
2. 访问gitlab
访问网址gitlab服务所在节点ip:30021
注意,账号为root
密码为之前设置的gitlab.123
这里有个地方有点无语,我之前设置的账号为gitlab-admin
使用这个账号登录不进去,必须换成root
登录成功后界面如下
3. 修改地址参数(这一步好像有点多余,做了好像没啥反应,仅供参考吧)
正常情况下我们使用搭建的gitlab服务创建项目后,可复制克隆地址,但是我们得到的是这样的
前缀不是ip也不是域名,这个是我们gitlab在k8s集群中的pod名称
x先查看gitlab容器名称
kubectl get pod -n gitlab-dev -o wide
进入gitlab容器
kubectl exec -it gitlab-c78cfd94c-7nrjl -n gitlab-dev -- /bin/bash
复制内容,ip为gitlab服务所在节点的ip
external_url 'http://ip:30021'
将内容添加到rb文件中,由于容器中没有装vim故只能用vi
vi /etc/gitlab/gitlab.rb
添加后退出容器
exit
删除gitlab的pod
kubectl delete pod gitlab -n gitlab-dev
我们在配置文件中设置了副本,所以删除后会自动重启新的
等待重启,等到gitlab的新pod准备好以后,去访问进行查看
(前提,我们之前配置了service中的targetPort端口映射,这里的30021就是http对应的容器端口80)
记住,这里重启的新的gitlab的pod之后,账号密码就变成了原来初始化的,之前创建的项目及修改的内容都会重置
4. 创建项目
登录后的界面如下,直接创建一个新项目New project
如果不是这个界面也没关系,找到创建项目界面,左上角Menu–Projects–View all projects会跳转到上面这个界面
创建新项目
为项目起名,然后选择root,其他默认
创建后会提示添加SSH key,下一步进行
5. SSH KEY配置
为了可以正常使用ssh推送拉取项目代码,需添加sshkey
查看sshkey的内容如下
正常文件在~/.ssh/id_rsa.pub中
cat ~/.ssh/id_rsa.pub
将ssh-rsa开头的内容复制,包含ssh-rsa,结尾到root前的空格,不包含空格
可在提示中选择Add SSH key进行添加
如果没有这一项可直接进行查找sshkey位置:右上角呼出Edit profile—>SSH Keys
如图位置
将内容粘贴
确认(应该是第一次需要确认,后续删除再加就不需要了)
添加完成后如下
接下来就可以正常使用ssh进行代码的拉取推送
6. 克隆项目到本地
这里需要注意的是,在我们创建的项目界面,克隆地址如下
这里的地址不是ip而是我们gitlab服务在k8s集群中的pod名称
我们使用http地址,点右侧复制按钮先复制下来
(当然这个地址可以同等替换为ip+端口号的形式,即http://ip:30021/root/test-project.git)
接下来我们尝试克隆项目到本地
在本地创建一个空文件夹,名称为k8s-gitlab-test
前提是系统安装了GIT工具
打开文件夹后右键打开git bash here窗口
首先git init命令创建本地的git仓库
然后使用git clone命令将克隆地址粘贴过来进行克隆
会跳转到用户名密码窗口进行登录
账号root
密码gitlab.123
在本地的文件夹中,我们发现了一个新的项目文件夹
7. 本地项目推送到gitlab仓库中
7.1 本地项目创建
在本地创建一个文件夹k8s-gitlab-demo
在文件夹中创建一个文本文件test123.txt
7.2 远程项目创建
像之前test-project一样在gitlab仓库中创建一个项目,名称为k8s-gitlab-demo
7.3 远程仓库克隆地址
同样的将项目的克隆地址http那个复制下来
到本地的k8s-gitlab-demo文件夹中右键git bash here打开git窗口
这里发现一个问题,就是远程仓库默认的分支为main,而后续提交推送到远程仓库的命令中分支使用main却提交不成功,必须使用master才能提交成功,但是这样就会出现两个分支,master是提交时创建的
猜测:这里可能我安装的本地GIT工具版本过旧没更新,所以使用的还是master作为默认分支故使用main提交失败
如果你已经习惯了master,本文最后也附上了一个链接地址,将创建项目的主分支main修改为master,这样后续创建的项目的主分支名称默认为master
7.4 初始化本地仓库
git init
7.5 绑定远程与本地git仓库连接
git remote add origin 远程仓库地址(该地址就是刚刚复制的http克隆地址)
7.6 远程拉取到本地
此时建立了连接,我们可以先把远程拉取到本地
git pull origin master
7.7 提交本地所有文件到仓库
git add .
7.8 提交并注释信息
双引号中为提交的注释信息
git commit -m "commit info"
7.9 推送到远程仓库
git push -u origin master
注:这里可以看到,我们开始使用main节点推送失败了,但是main是默认的分支
然后我们使用master推送成功,但是到了远程仓库中看到master是新建的,也就是推送命令执行时新建了一个master分支出来,此时远程仓库中有两个分支存在,这个点很疑惑,不过暂时没发现使用有什么影响,文末附修改默认分支为master的方法可供参考
网上介绍说gitlab是从14版本后开始使用默认main,gitlab-ce:14的版本之前也包括14都是用的master,如果影响使用可参考文末连接修改默认分支名为master,后续创建项目都会以master为默认主分支
如未进行pull拉取远程到本地操作可能会遇到如下报错,可执行7.6命令
推送成功后到gitlab界面
7.11 查看远程仓库
刷新远程项目在main分支并没有新上传的test123.txt
我们到master分支查看
可以看到文件在master节点出现了
如下为使用gitlab-ce:14.0.0-ce.0版本执行相同操作后的界面,这里默认就是master分支且可以直接看到文件上传到该分支
7.10 命令参考
每次创建一个项目后,在项目下面都会有命令汇总帮助我们使用命令如下
仅供参考,有些亲测好像不能用,可自行尝试
Command line instructions
You can also upload existing files from your computer using the instructions below.
Git global setup
git config --global user.name "Administrator"
git config --global user.email "hslb@163.com"
Create a new repository
git clone git@gitlab-69cb4d6cf9-2qhlk:root/k8s-gitlab-demo.git
cd k8s-gitlab-demo
git switch -c main
touch README.md
git add README.md
git commit -m "add README"
git push -u origin main
Push an existing folder
cd existing_folder
git init --initial-branch=main
git remote add origin git@gitlab-69cb4d6cf9-2qhlk:root/k8s-gitlab-demo.git
git add .
git commit -m "Initial commit"
git push -u origin main
Push an existing Git repository
cd existing_repo
git remote rename origin old-origin
git remote add origin git@gitlab-69cb4d6cf9-2qhlk:root/k8s-gitlab-demo.git
git push -u origin --all
git push -u origin --tags
8. 密码修改
默认配置的密码并不是长久密码,按照如下操作修改后可获得长久密码
同样右上角呼出Edit profile
左侧找到Password
填写当前密码以及新密码保存设置即可
修改密码
原始密码gitlab.123
新密码gitlab.111
新密码gitlab.111
然后重新登录即可
9. 修改默认主分支
参考链接将默认主分支修改为master:gitlab默认主分支main修改为master
感谢阅读,祝君暴富!