일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 오퍼레이터
- blue/green
- nginx ingress
- tekton
- MLflow
- Kubernetes
- Argo
- argocd
- argo rollout
- keda
- CI/CD
- Kopf
- 카오스 엔지니어링
- gitea
- Kubernetes 인증
- gitops
- Kubeflow
- mlops
- operator
- seldon core
- opentelemetry
- CANARY
- serving
- knative
- Litmus
- kubernetes operator
- Pulumi
- Continuous Deployment
- opensearch
- Model Serving
- Today
- Total
Kubernetes 이야기
Kubernetes에서 Gitea 사용하기 본문
형상관리 도구
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/
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/
'Kubernetes > devops' 카테고리의 다른 글
OWASP ZAP 을 Kubernetes 환경에서 사용하기 (0) | 2022.04.02 |
---|---|
code-server로 개발하기 (0) | 2022.03.30 |
(docker) PMD 사용하기 (0) | 2022.03.22 |
Argo workflow 를 활용하여 CI/CD 구축하기 (기본설치) (0) | 2022.03.06 |
Argo Workflow를 사용한 CI/CD 구성 (Kaniko / Trivy) (2) | 2022.03.03 |