CI
- GITEA에서 코드를 수정 시 Jenkins로 웹훅.
- Jenkins는 컨테이너를 빌드하고 이미지를 harbor에 push한다.
- harbor는 argo를 통해 컨테이너 이미지를 업데이트 한다.
CD
- GITEA에 있는 코드를 서비스 배포하기 위해 쿠버네티스의 helm에게 요청한다.
- helm은 CI에서 새로운 컨테이너의 이미지 버전을 install하면 argo에서 배포를 자동으로 해준다.
CI 구성하기
- 가장 먼저 jenkins와 argo를 관리하기 위한 helm을 설치한다.
- 자세한 설치 내용은 아래 링크를 참고.
- https://helm.sh/ko/docs/intro/install/
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
- 위의 명령을 통해 helm을 설치한다.
- 명령창에 "helm" 명령을 했을 때 옵션에 대한 설명이 나오면 잘 설치된 것이다.
jenkins repo 추가
- 헬름이 설치되었다면, jenkins의 repo를 추가한다.
- https://helm.sh/ko/docs/helm/helm_repo_add/
helm repo add jenkins https://charts.jenkins.io
- helm repo list 명령으로 jenkins의 repo가 잘 설치되었는지 확인할 수 있다.
jenkins 설치
- repo에 jenkins를 추가하였기 때문에 jenkins를 설치한다.
helm install jenkins jenkins/jenkins
values.yaml 설정
- 기본 default value 파일을 바꾸기 위해 새로운 value 파일을 생성해준다.
- 나의 경우 loadbalancer를 통해 외부 배포를 할 것이기 때문에 ClusterIP를 LoadBalancer로 바꿔주었다.
controller:
agentListenerPort: 50001
loadBalancerIP: 10.0.27.241
ingress:
apiVersion: "networking.k8s.io/v1"
enabled: true
ingressClassName: nginx
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/proxy-read-timeout: "90"
nginx.ingress.kubernetes.io/proxy-send-timeout: "90"
path: jenkins.haho.io
hostName: jenkins.haho.io # 도메인
paths:
- path: /
pathType: Prefix
backend:
service:
name: jenkins-haho
port:
number: 8080
serviceType: LoadBalancer # or ClusterIP
persistence:
enabled: true
storageClass: nfs-retain
size: "8Gi"
helm upgrade를 통해 새로 작성한 values.yaml 파일을 적용시킨다.
helm upgrade jenkins-haho jenkins/jenkins -f values.yaml
helm values파일은 보통 아래의 명령어를 통해 생성한다.
helm show values jenkins/jenkins > values.yaml
파드, 서비스 상태
- 해당 명령을 통해 전체 조회를 할 수 있다.
k get all
ingress 내용
k edit ing [ingress 이름]
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
meta.helm.sh/release-name: jenkins-haho
meta.helm.sh/release-namespace: haho
nginx.ingress.kubernetes.io/proxy-read-timeout: "90"
nginx.ingress.kubernetes.io/proxy-send-timeout: "90"
nginx.ingress.kubernetes.io/rewrite-target: /
creationTimestamp: "2024-08-12T00:56:26Z"
generation: 1
labels:
app.kubernetes.io/component: jenkins-controller
app.kubernetes.io/instance: jenkins-haho
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: jenkins
helm.sh/chart: jenkins-5.5.4
name: jenkins-haho
namespace: haho
resourceVersion: "4124786"
uid: c3b5b7a9-3d2b-4330-839a-6d47e10c1138
spec:
ingressClassName: nginx
rules:
- host: jenkins.haho.io
http:
paths:
- backend:
service:
name: jenkins-haho
port:
number: 8080
path: /
pathType: Prefix
status:
loadBalancer:
ingress:
- ip: 10.0.27.1
hosts 파일 수정
- jenkins 설정이 완료되었으면, 도메인 설정을 해야한다.
- /etc/hosts로 이동하여 IP와 도메인 이름을 넣어준다.
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
10.0.27.242 jenkins.haho.io
배포 완료
- 기본 사용자 이름은 admin, 비밀번호는 아래 명령어를 통해 확인 가능하다.
- 현재 haho라는 napmespace를 사용하고 있어 아래와 같이 haho를 명시했지만 namespace를 사용하지 않을 경우 default로 바꿔준다.
kubectl exec --namespace default -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/additional/chart-admin-password && echo
ArgoCD 설치
- Argocd의 repo를 추가한다.
helm repo add argo https://argoproj.github.io/argo-helm
- Argocd를 설치한다.
helm install argocd-haho argo/argo-cd
TLS 설정하기
- Argocd는 기본적으로 http로 접근하면 https로 무한 리다이렉션이 되어 tls 설정을 해야한다.
1. 가장 먼저 TLS 인증서와 키를 생성하기 위해 OpenSSl를 사용하여 생성한다.
- 개인 키 생성
openssl genrsa -out argocd-haho.key 2048
- 인증서 서명 요청(CSR) 생성
openssl req -new -key argocd-haho.key -out argocd-haho.csr
- 자체 서명된 인증서 생성 (유효 기간 설정)
openssl x509 -req -in argocd-haho.csr -signkey argocd-haho.key -out argocd-haho.crt -days 365
2. 생성한 인증서와 키를 Kubernetes Secret으로 생성
kubectl create secret tls argocd-haho-tls \
--cert=argocd-haho.crt \
--key=argocd-haho.key \
--namespace haho
도메인을 설정하고, tls를 설정하기 위해 작성한 value.yaml를 적용한다.
helm upgrade argocd-haho argo/argo-cd -f values.yaml
server:
serviceType: LoadBalancer
loadBalancerIp: 10.0.27.241
ingress:
enabled: true
ingressClassName: "nginx"
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_headers "Strict-Transport-Security: max-age=31536000; includeSubDomains; preload";
nginx.ingress.kubernetes.io/proxy-body-size: 10m
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
hostname: argocd.haho.io
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-haho
port:
number: 80
serviceType: LoadBalancer
tls:
- hosts:
- argocd.haho.io
secretName: argocd-haho-tls
- argocd의 ingress 포트가 80, 443인 것을 확인할 수 있다.
argocd ingress 파일
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"networking.k8s.io/v1","kind":"Ingress","metadata":{"annotations":{"nginx.ingress.kubernetes.io/rewrite-target":"/"},"name":"argocd-haho-server","namespace":"haho"},"spec":{"ingressClassName":"nginx","rules":[{"host":"argocd.haho.io","http":{"paths":[{"backend":{"service":{"name":"argocd-haho-server","port":{"number":80}}},"path":"/","pathType":"Prefix"}]}}],"tls":[{"hosts":["argocd.haho.io"],"secretName":"argocd-haho-tls"}]}}
meta.helm.sh/release-name: argocd-haho
meta.helm.sh/release-namespace: haho
nginx.ingress.kubernetes.io/backend-protocol: HTTPS
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_headers "Strict-Transport-Security: max-age=31536000; includeSubDomains; preload";
nginx.ingress.kubernetes.io/proxy-body-size: 10m
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
creationTimestamp: "2024-08-12T06:26:37Z"
generation: 3
labels:
app.kubernetes.io/component: server
app.kubernetes.io/instance: argocd-haho
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: argocd-server
app.kubernetes.io/part-of: argocd
app.kubernetes.io/version: v2.12.0
helm.sh/chart: argo-cd-7.4.2
name: argocd-haho-server
namespace: haho
resourceVersion: "7068246"
uid: 4318b705-6fb9-4f4e-9785-21ef08a34cdb
spec:
ingressClassName: nginx
rules:
- host: argocd.haho.io
http:
paths:
- backend:
service:
name: argocd-haho-server
port:
number: 443
path: /
pathType: Prefix
tls:
- hosts:
- argocd.haho.io
secretName: argocd-server-tls
status:
loadBalancer:
ingress:
- ip: 10.0.27.230
배포 완료
- 기본 username은 admin이고 password는 아래 명령을 통해 확인 가능하다.
- namespace는 본인 namespace로 변경.
kubectl -n haho get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
이어서 jenkin와 gitea 연동하기
728x90
반응형
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] CI/CD구성하기(Jenkins, ArgoCD, Gitea, Harbor) #3 Jenkins, Gitea Webhook 설정 및 Pipeline 구축 (0) | 2024.08.14 |
---|---|
[Kubernetes] CI/CD구성하기(Jenkins, ArgoCD, Gitea, Harbor) #2 Jenkins, Gitea 연동 (0) | 2024.08.13 |
[Kubernetes] kube config를 통해 외부 클러스터를 로컬 클러스터에서 실행하기 (0) | 2024.08.07 |
[Kubernetes] Ingress를 이용하여 Jenkins 구축 (0) | 2024.08.05 |
[Kubernetes] 쿠버네티스 구조 (0) | 2024.07.29 |