前言
本来想直接通过 helm
安装 gitlab
的,但是刚刚看了官网的 issue 发现目前 gitlab
的 chart
还没有支持到 k8s v1.16
,而我们之前装的正是 1.16
,所以这里我们还是自己写配置文件来安装。
这次安装的 gitlab
是 omnibus
版本也就是俗称的 all in one
版本。我们的目的是通过自己写的配置文件,将 gitlab
omnibus
版本的 docker 镜像
安装到 k8s
中。通过查看官方文档,发现这个镜像需要在三个地方持久化数据,这里我们就新建 k8s
的 local volume
来做持久化(大厂一般都是使用是网络文件系统 nfs
,当然还有其他的文件系统,大家可以 google
一下)。关于 omnibus
镜像的使用,文档在这里
开始安装
我们这次把所有文件先准备好,然后一起盘。
持久化
我们先创建本地存储:
# storage.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage # 供下面的pv和pvc使用
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-gitlab-storage
spec:
capacity:
storage: 10Gi # 容量
# volumeMode field requires BlockVolume Alpha feature gate to be enabled.
volumeMode: Filesystem
accessModes:
- ReadWriteOnce # 只允许一个节点读写
persistentVolumeReclaimPolicy: Retain # 回收策略 不回收, 保留 Volume
storageClassName: local-storage # 使用上面的StorageClass的名称,pv绑定到StorageClass然后pvc也绑定到StorageClass,这样pv和pvc就能动态绑定了,用码农的话来讲,就是解耦
local:
path: /gitlab # 我们设置的这个卷在服务器上的路径,要事先在服务器上建立这个目录
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions: # 匹配规则,这个pv是通过匹配规则来选择合适的服务器,这里我们把匹配规则写死,固定到一台服务器上。
- key: kubernetes.io/hostname
operator: In # 写死,只在哪台服务器上
values:
- no2 # 服务器的hostname,所以上面/gitlab目录要在no2上面创建
上面的配置是由两个配置组合而成的,一个是叫做 local-storage
的 StorageClass
,另一个则是叫做 local-gitlab-storage
的 pv
。关于StorageClass、pv、pvc(pvc在之后的deployment配置中)我们这里不作过多介绍(因为太多了,根本没办法简单讲),不过从上面的注释中也可以大概看出有什么用。
创建命名空间
# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: gitlab
namespace.yaml
文件用于创建一个叫做 gitlab
的 namespace
, 作用就是把 gitlab
相关的组件隔离到 gitlab
这个 namespace
下面,避免与其他项目混淆。
创建ServiceAccount
# rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: gitlab
rules:
- apiGroups: [""]
resources: ["pods", "nodes", "pods/exec", "pods/portforward"]
verbs: ["get", "watch", "list", "create", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: gitlab-rbac
subjects:
- kind: ServiceAccount
name: default
namespace: gitlab
roleRef:
kind: ClusterRole
name: gitlab
apiGroup: rbac.authorization.k8s.io
gitlab
能感知到自己是在 k8s
中,他需要一些 k8s
权限来感知 runner
等,具体没有详细研究过,不过没有这些权限会报错是真的。
deployment
deployment.yaml
文件合并了pvc、deployment等配置:
# deployment.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: gitlab
namespace: gitlab
spec:
accessModes:
- ReadWriteOnce # 这里要与上面一致,不然无法动态绑定上
resources:
requests:
storage: 10Gi # 这里也要一致
storageClassName: local-storage # 这里使用上面StorageClass的名称
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: gitlab
name: gitlab
labels:
app: gitlab
spec:
replicas: 1
selector:
matchLabels:
app: gitlab
template:
metadata:
labels:
name: gitlab
app: gitlab
spec:
volumes:
- name: gitlab # 卷的名称
persistentVolumeClaim:
claimName: gitlab # 上面pvc的名称
containers:
- name: gitlab
image: gitlab/gitlab-ce:latest
imagePullPolicy: Always # 这里希望每次重启的时候更新到最新的gitlab,如果你希望保持gitlab的版本,请设置为IfNotPresent
env:
- name: "GITLAB_OMNIBUS_CONFIG"
value: "external_url 'https://gitlab.localhost.com';gitlab_rails['smtp_enable'] = false;gitlab_rails['smtp_address'] = \"smtp.exmail.qq.com\";gitlab_rails['smtp_port'] = 465;gitlab_rails['smtp_user_name'] = \"noreply@scorpii.net\";gitlab_rails['smtp_password'] = \"123456\";gitlab_rails['smtp_domain'] = \"smtp.exmail.qq.com\";gitlab_rails['smtp_authentication'] = \"login\";gitlab_rails['smtp_enable_starttls_auto'] = true;gitlab_rails['smtp_tls'] = true;gitlab_rails['gitlab_email_from'] = 'noreply@scorpii.net';gitlab_rails['gitlab_email_display_name'] = 'jx科技有限公司';nginx['listen_https'] = false;nginx['listen_port'] = 80" # 这一块是对gitlab的配置,完整的配置请看https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-config-template/gitlab.rb.template
volumeMounts: # gitlab需要持久化的三个目录
- mountPath: "/etc/gitlab" # gitlab容器中的目录
name: gitlab # 卷的名称
subPath: config # 利用subPath可以做到共享一个卷,就不用去配三个卷了
- mountPath: "/var/log/gitlab"
name: gitlab
subPath: log
- mountPath: "/var/opt/gitlab"
name: gitlab
subPath: data
ports:
- containerPort: 80 # web
- containerPort: 22 # registry
这里有必要说明一下上面gitlab的配置。我们可以看看完整的配置文件,然后我们在这里写的配置跟配置文件上的格式一样,不同的是因为这里没有换行,我们需要使用分号(;)来间隔每个配置。
-
external_url
必填,就是你的gitlab
的域名。 -
listen_https
必填,并且固定false
,因为是通过traefik
代理,这里没有必要(有没有必要时相对的,要看你所在的网络是否安全)使用tls
。 -
listen_port
必填,告诉gitlab
端监听80端口。 -
smtp_
相关选填,不填就直接删除,这个配置gitlab
的发邮件(比如在邀请别人注册的时候)用的邮箱账号,没有就不发邮件。 -
gitlab_email_
相关选填,不填就直接删除,配置发邮件时候的发信人信息。
上面2、3点是踩坑后的解决方案,要重视。见这个issue
service && ingress
# service.yaml
kind: Service
apiVersion: v1
metadata:
name: gitlab
namespace: gitlab
spec:
selector:
app: gitlab
ports:
- name: 'http'
port: 80
targetPort: 80
- name: 'ssh'
port: 22
nodePort: 22
type: LoadBalancer
service
的 type
可以写 LoadBalancer
或者是 NodePort
,就我理解在这里这两个没有区别,都可以在 port
里面给 nodePort
配置项。最后是ingress:
# ingress.yaml
# 这个是http
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: simpleingressroute
namespace: gitlab
spec:
entryPoints:
- web # 也就是traefik的80端口
routes:
- match: Host(`gitlab.localhost.com`) # 里面填你的域名,match还有其他函数(我们姑且就叫函数吧),可以参考文档
kind: Rule
services:
- name: gitlab # 填服务的名字
port: 80
---
# 这个是https
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ingressroutetls
namespace: gitlab
spec:
entryPoints:
- websecure # 也就是traefik的443端口
routes:
- match: Host(`gitlab.localhost.com`) # 里面填你的域名
kind: Rule
services:
- name: gitlab # 填服务的名字
port: 80
tls:
certResolver: default
这里只让 traefik
代理 80
端口, 22
端口因为使用 nodeport
配置已经暴露在服务器上了。
好了,文件都准备好了,开始盘:
盘等了一段时间,pod跑起来了:
pod现在访问,可能会发现是404或者502,别着急,看看gitlab的日志
kubectl -n gitlab logs gitlab-685c9f689-clsxw -f
原来还在安装中:
log机器不行,再等等。。。。。
五百年后可以访问了。
500年500年2
我们测试一下建仓库和提交代码:
提交没问题 网页上面也没问题
网友评论