[KT Cloud] K2P Standard Container Devops 이해 및 응용 #2

CD 작업은

- CI 에 의한 Docker Image 변경 시 Argo CD (auto sync : apply yaml to kubernetes)

- k8s configuration file 변경시 K8s configuration manager (yaml file push ) -> argo cd (auto sync : apply yaml to kubernetes)

 

 

- Sync Policy
   ✓ Auto Sync : 주기별 동기화 체크 후 불 일치시 반영
   ✓ Manual Sync : 주기별 동기화 체크

 

 

- Argo CD 배치
   ✓ 개발/운영이 분리된 경우
       ▷ 개발 환경에 만 Argo CD 구성 
           개발 Argo CD에서 원격으로 운영 환경에 반영 (Auto Sync or Manual Sync) 
       ▷ 개발 / 운영 환경 별로 Argo CD 구성 
   ✓ 개발/운영이 통합된 경우
       ▷ 하나의 Argo CD 구성, 개발/운영 환경운 K8s의 Namespace로 분리

 

- Jenkins Docker images rebuild 시 배포 
-  Argo CD follows the GitOps model of deployment, where desired configuration changes are first pushed to Git, and the cluster state then syncs to the desired state in git.
- 즉 Argo CD는 Kubernetes manifest 변경을 체크하지만, manifest에서 참조하고 있는 Docker image 변경을 체크 하지 않음 
- Jenkins pipeline에서 Docker image 빌드 후 Kubernetes manifest (Image tag 정보)를 변경하고 push 하면 Argo CD에서 인지 할 수 있음

 

Kustomize

쿠버네티스 manifest 를 보다 쉽게 변경할 수 있게..

 

ArgoCD 

gitlab 에 config 파일을 올려서, 배포될 수 있게 함

이때 config 에 담긴 배포 이미지는 nexus 링크겠지

 

 

지금 해야할 작업

0. nexus 에 테스트 이미지 올리기 

1. argoCD 에 띄울 config 파일 만들기

2. config 파일을 gitlab 에 올리기 & gitlab 과 argoCD 연결하기

3. jenkins pipeline 을 이용해서 백엔드 CI작업을 통해 docker image 가 변경 -> 이 변경을 하면서  k8s manifest 의 image tag 를 변경하고, 다시 gitlab 에 push 하면 argoCD 가 인식

 

 

0. nexus 에 테스트 이미지 올리기

1) nexus docker login

- docker login 넥서스ip -u 유저이름 -p 비밀번호

- https://www.leafcats.com/200 : 트러블 슈팅

- docker tag <LOCAL_IMAGE_NAME> <NEXUS_URL>/<REPOSITORY_NAME>/<IMAGE_NAME>:<TAG>

- docker push <NEXUS_URL>/<REPOSITORY_NAME>/<IMAGE_NAME>:<TAG>

 

음 잘 올라감

 

 

 

 

 

1. argoCD 에 띄울 config 파일 만들기 

namespace : develop

image : backend 1

image : backend 2

image : backend 3

 

그냥 각각 replicaset 2개씩 deployment 3개 띄우면 될듯

pv 는 하나 해서 공유하기

경로만 다르게 ㄱㄱ

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-back1
  labels:
    app: app-back1
spec:
  replicas: 2
  selector:
    matchLabels:
      app: app-back1
  template:
    metadata:
      labels:
        app: app-back1
    spec:
      containers:
      - name: app-back1
        image: IP:32349/<image>:<tag> 
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
      imagePullSecrets:
      - name: nexus
      
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-back2
  labels:
    app: app-back2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: app-back2
  template:
    metadata:
      labels:
        app: app-back2
    spec:
      containers:
      - name: app-back2
        image: 이미지이름
        ports:
        - containerPort: 8080
      imagePullSecrets:
      - name: 시크릿 이름
      
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-back3
  labels:
    app: app-back3
spec:
  replicas: 2
  selector:
    matchLabels:
      app: app-back3
  template:
    metadata:
      labels:
        app: app-back3
    spec:
      containers:
      - name: app-back3
        image: 이미지이름
        ports:
        - containerPort: 8080
      imagePullSecrets:
      - name: 시크릿 이름

 

 

# app1-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: app1-service
spec:
  selector:
    app: app1
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  type: ClusterIP

---

# app2-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: app2-service
spec:
  selector:
    app: app2
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  type: ClusterIP

---

# app3-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: app3-service
spec:
  selector:
    app: app3
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  type: ClusterIP

 

 

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: your-domain.com
    http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: app1-service
            port:
              number: 8080
      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port:
              number: 8080
      - path: /app3
        pathType: Prefix
        backend:
          service:
            name: app3-service
            port:
              number: 8080

 

 

 

시크릿 생성해야되네..

kubectl create secret docker-registry nexus -ndev \
  --docker-server=넥서스 ip \
  --docker-username=admin \
  --docker-password=비번

 

 

시크릿 생성이 제대로 안되는건지

nexus push / pull IP 의 혼동이 좀 있는 것 같다..

시크릿 생성시 docker-server 의 ip 와, docker image pull 받는 ip 를 제대로 맞춰야 해결될듯.

시크릿 설정을 저렇게 하는지도 다시 찾아보기

이걸 해결해야 제대로 뭘 좀 할텐데..

 

 

-> 찾아본 결과 팀원의 단순 실수였다고.. 

 

 

 

 

블로그를 참고해서 kustomize 구조로도 파일들을 설정해줬다.

kustomize 설치 )

curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"  | bash

 

 

 

도움받은 블로그

1. https://cwal.tistory.com/23?category=951157

2. https://seokbin.tistory.com/entry/Kubernetes-CICD-%EA%B5%AC%EC%B6%95JenkinsNexus#4.%20Kubernetes%20%EB%B0%B0%ED%8F%AC-1

3. https://j-ho.dev/21/

 

2. manifest 파일을 gitlab 에 올리기 & gitlab 과 argoCD 연결하기

gitlab 은 github 과 비슷하지만 다르게..

private 으로 만들어져있기에 ssh key gen 을 통해만들어진 pub 키를 등록해줘야한다.

그리고, gitlab에서 볼 수 있는 clone 용 dns 는 클러스터 내부에 띄워진 서비스 도메인이기 때문에,

ingress 도메인으로 Push 를 해줘야한다.

 

 

 

중간 트러블 발생)

container devops 가 파드 각각 (레플리카셋도 1임)띄워져있어서

여러 사람이 접속하면 502 가 발생함.....

이건 뭐 레플리카셋을 늘려도 되는지....

 

노드가 자꾸 죽는다 개복치야 뭐야 

 

 

 

2.1)

argoCD 에 레포 add 하기 (안돼..왜안되지?)

아마 위와 같은 문제일것같다. ( gitlab이 private 으로 되어있는경우)

근데 그렇다면 이를 어떻게 연결하느냐..

url 을 ingress 로 하고, personal access token   or   ssh key 로 입력을 해도 연결이안된다. 

 

이유를 알 것같다.

도메인이 http 로 시작해서 그런 것 같다. ㅜㅜ 

생각해보니 예전 프로젝트에서 아르고 담당했던 분이 인증서가 없어서..추가하고있던 기억이 이제야 떠올랐다.

 

 

인증서를 발급받아야 한다.

 

2.2) 인증서 발급받기

 

도메인 발급 -> 내 도메인 한국을 이용함

 

ssl 인증서 -> lets encrypt 이용함

txt 레코드에 등록하고 몇분 좀 기다려줘야댐

 

# cd /etc/letsencrypt/archive

에서 확인 

root@ip-172-31-48-170:/etc/letsencrypt/archive/clpaas.kro.kr# ls
cert1.pem  chain1.pem  fullchain1.pem  privkey1.pem

어..여기에는 루트인증서가 없어서 ...

공식문서를 보니 이렇게 해줘야한다고..

 

일단 CA 파일 다운해봄 

curl -o ISRG_Root_X1.crt https://letsencrypt.org/certs/isrgrootx1.pem

 

 

그 후 pem 키 연결해서 키체인 만들었음

  104  cat chain1.pem >> full_chain.crt
  105  cat cert1.pem >> full_chain.crt
  106  cat ISRG_Root_X1.crt >> full_chain.crt

 

그 후 등록해줌

cert pem > private pem >위에서 만든 full chain 순임

 

 

 

근데 ? 안됨 

오류남

원인을 ? 알수없음 

 

그래서 ACM 에 등록해봄

근데? 됨

 

 

뭐지? 왤까?

진짜 모르겠음 

 

여튼 그래서 ACM 인증서를 받아서 등록할 셈이다.

기다리다 지쳐서 다음편에이어서 올리겠다.

 

 

 

해야할것 ) 

- kustomize 로 label 다 app -> dev 로 변경 ( app label 은 option 노드만 쓰게 하려고)

- jenkins pipeline 을 이용해서 백엔드 CI작업을 통해 docker image 가 변경 -> 이 변경을 하면서  k8s manifest 의 image tag 를 변경하고, 다시 gitlab 에 push 하면 argoCD 가 인식

 


https://jennifersoft.com/ko/blog/kubernetes/2023-08-30-jennifer-kubernetes-3/

 

3. Argo-CD를 이용한 GitOps 시스템 구축

이번 장은 ArgoCD를 이용하여 GitOps(이하 깃옵스) 시스템을 구축하는 방법을 알아보겠습니다. 1. GitOps와 단일 진실 원천(SSOT) 정의 먼저, 깃옵스의 정의를 알아보겠습니다. 앞에서 코드로 선언하는

jennifersoft.com

https://velog.io/@sororiri/k8s-argoCD-%EC%84%A4%EC%B9%98-%EB%B0%8F-argoCD-%EB%8C%80%EC%8B%9C%EB%B3%B4%EB%93%9C-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0

 

[k8s] argoCD 설치 및 argoCD 대시보드 접근하기

argoCD 를 설치하고 argoCD 의 사이트에 로그인하는 방법을 공유하려 한다.해당 실습은 argoCD 공식 홈페이지(https://argo-cd.readthedocs.io/en/stable/getting_started/기본적으로 k8s 가 설치되어 있어야

velog.io

https://1week.tistory.com/38

https://velog.io/@lopahn2/%EC%98%A8%ED%94%84%EB%A0%88%EB%AF%B8%EC%8A%A4-K8S-Argo-CD%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-GitOps-%EA%B5%AC%EC%B6%95

 

[온프레미스-K8S] Argo-CD를 사용한 GitOps 구축

프로그램 소스, Kubernetes 리소스 그리고 심지어 인프라까지 코드로 구현될 수 있다. 여러 환경에 흩어져 있는 코드들을 Git을 사용해 한 곳에 보관하고, 현재 운영중인 상태 (Ops) 와 동일하게 맞추

velog.io

https://devocean.sk.com/blog/techBoardDetail.do?ID=164784

 

AKS로 쿠버네티스 시작하기 : argocd툴에 ingress 통해 접속

 

devocean.sk.com

https://karla.tistory.com/468

 

[CICD] Jenkins + ArgoCD + k8s | CI, 젠킨스 파이프라인, Jenkinsfile, MSA

GitHub - Guts-Gun/KITe_backendContribute to Guts-Gun/KITe_backend development by creating an account on GitHub.github.com 구축 순서1. Jenkins Pipeline & Github webhook 설정2. Jenkinsfile 작성3. ArgoCD 구축 Jenkins PipelineJob들을 순차적

karla.tistory.com

https://1week.tistory.com/40

 

CI/CD 적용 가이드 #3 (CD-Gitops 편)

2021.04.06 1. CD (Continuous Deployment) & Gitops - CD ✓ 개발자의 변경 사항을 레포지토리에서 개발/프로덕션 환경으로 자동으로 릴리스 ✓ 지속적 배포가 제대로 이루어지려면 테스트 자동화가 제대로 설

1week.tistory.com

https://sosoeasy.tistory.com/667

 

[jenkins] credential등록하기

젠킨스 credential등록하기 git repository, aws ec2등과 연결을 위한 credential 등록 manage credential 들어가기 1. jenkins 관리 / manage credentials 2. system 클릭 3. global credential 4. add credential ssh key 등록 1. 정보입력

sosoeasy.tistory.com

 

728x90