Kubernetes 이야기

Kubernetes에서 Gitea 사용하기 본문

Kubernetes/devops

Kubernetes에서 Gitea 사용하기

kmaster 2022. 3. 23. 23:11
반응형

형상관리 도구

git 이전에 SVN (subversion)을 많이 사용하던 시기가 있었다. 현재는 대부분의 프로젝트가 git 형상관리 툴을 사용하여 진행되고 있다. 보통 github나 bitbucket, gitlab (클라우드형) 를 많이 사용하지만, 사내에 구축형으로는 gitlab이나 gitea가 많이 사용되고 있다.

gitlab을 Kubernetes에 사용해 보았는데 같이 설치되는 패키지가 많고 메모리 사용량이 많다. 그래서 git 기본기능에 충실하고 가벼운 gitea를 설치하여 보려고 한다.

gitea를 사용하면 이슈관리와 위키등을 같이 관리할 수 있기 때문에 별도로 패키지를 설치하지 않아도 프로젝트를 진행하는데 아주 유용하게 사용할 수 있다.

 

Gitea

Gitea는 자체 호스팅 서비스를 할 수 있는 서비스이다. Gitea는 Gogs라는 오픈소스를 포크하여 개발되고 있는 오픈소스 프로젝트이다.

Go언어로 개발되어 있고, 리눅스 및 mac, windows에서 모두 사용가능하다.

 

gitlab이나 gogs와 비교한 자료는 아래의 내용을 참고한다.

https://docs.gitea.io/en-us/comparison/

 

Gitea compared to other Git hosting options - Docs

 

docs.gitea.io

 

Kubernetes에 설치하기

 

gitea는 helm chart로 설치할 수 있다. 하지만, db (mysql, postgresql 등)를 설치해야 하고, 볼륨 등 values 값들 세팅이 필요하기 때문에 이번에는 일반 yaml로 설치해 보도록 하겠다.

 

1) namespace 생성

# kubectl create ns gitea
namespace/gitea created

 

2) Postgresql용 패스워드 생성

# cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Secret
metadata:
  name: postgres-sec
  namespace: gitea
type: Opaque
data:
  POSTGRES_USER: Z2l0ZWE=
  POSTGRES_PASSWORD: Z2l0ZWE=
EOF

secret/postgres-sec created

 

3) PVC 생성

// Gitea 용 PVC
# cat <<EOF | kubectl create -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  namespace: "gitea"
  name: "gitea"
spec:
  storageClassName: "nfs-client"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: "10Gi"
EOF

 

4) Postgres StatefulSet 

# cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: postgres
  name: postgres
  namespace: gitea
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: postgres
  serviceName: postgres-svc
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - env:
        - name: PGDATA
          value: /var/lib/postgresql/data/pgdata
        - name: POSTGRES_USER
          valueFrom:
            secretKeyRef:
              key: POSTGRES_USER
              name: postgres-sec
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              key: POSTGRES_PASSWORD
              name: postgres-sec
        - name: POSTGRES_DB
          value: gitea
        image: postgres:12.4-alpine
        imagePullPolicy: IfNotPresent
        name: postgres
        ports:
        - containerPort: 5432
          protocol: TCP
        volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: postgres-pvc
  volumeClaimTemplates:
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: postgres-pvc
      namespace: gitea
      labels:
        app: postgres
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
      storageClassName: postgres-sc
EOF

 

5) Gitea Deployment

# cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  labels: 
    app: gitea
  name: gitea
  namespace: gitea
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gitea
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: gitea
    spec:
      volumes:
        - name: gitea-volume
          persistentVolumeClaim:
            claimName: gitea
      containers:
        - name: gitea
          image: gitea/gitea:latest
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - mountPath: "/data"
              name: gitea-volume
EOF

 

6) Service 배포

# cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Service
metadata:
  name: gitea-web
  namespace: gitea
  labels: 
    app: gitea
spec:
  selector:
    app: gitea
  type: NodePort
  ports:
    - port: 80
      targetPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: gitea-ssh
  namespace: gitea
spec:
  ports:
  - port: 22
    targetPort: 22
    name: gitea-ssh
  selector:
    app: gitea
  type: NodePort
---
apiVersion: v1
kind: Service
metadata:
  name: gitea-postgres
  namespace: gitea
spec:
  ports:
  - port: 5432
  selector:
    app: postgres
  clusterIP: None
EOF

 

전부 배포가 끝났으면 배포 상태를 확인해 보자.

 

# kubectl get all -n gitea
NAME                        READY   STATUS    RESTARTS   AGE
pod/gitea-8479fd768-xfz2z   1/1     Running   0          54m
pod/postgres-0              1/1     Running   0          2m1s

NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/gitea-postgres   ClusterIP   None            <none>        5432/TCP       72s
service/gitea-ssh        NodePort    10.105.114.50   <none>        22:30076/TCP   53m
service/gitea-web        NodePort    10.98.19.38     <none>        80:32161/TCP   53m

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/gitea   1/1     1            1           54m

NAME                              DESIRED   CURRENT   READY   AGE
replicaset.apps/gitea-8479fd768   1         1         1       54m

NAME                        READY   AGE
statefulset.apps/postgres   1/1     3m54s

 

이제 설정된 NodePort로 접근해 보자. (실제 서비스 시에는 앞단에 Ingress로 TLS 접근이 되도록 설정하는 것을 권장한다.)

 

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: gitea
  namespace: gitea
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: selfsigned-cluster-issuer
spec:
  rules:
  - host: gitea.10.20.200.121.sslip.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: gitea-web
            port:
              number: 80
  tls:
  - hosts:
    - gitea.10.20.200.121.sslip.io
    secretName: gitea-cert

 

 

DB 정보와 기본 URL 정보를 입력하면 아래와 같이 로그인 화면이 나타난다.

 

 

 

회원가입 후 로그인 화면

 

참고문서

https://docs.gitea.io/en-us/install-on-kubernetes/

https://mujisayed.com/kubernetes/learn_by_doing/deploy_gitea/

반응형
Comments