728x90

KPaaS 공모전에 참여하며 KT 클라우드를 사용하게 되었다.

역할 분담을 통해, 팀원이 K2P 환경에 옵션으로 사용가능한 

Container Devops 를 세팅해주었다.

 

· 쿠버네티스 노드의 생성부터 Ingress/Route, Service, PV 등 필요한 오브젝트 자동으로 구성합니다.
· Container Application CICD에 필요한 Gitlab, Nexus, Jenkins 를 자동으로 설치 및 설정합니다.

 

 

이용 메뉴얼 링크

 

 


K2P Standard 이용을 위한 kubectl config 설정

필자의 OS 는 윈도우기 때문에, 환경변수 설정이 어렵고,, 여타의 이슈가 발생할 우려가 있어 가상머신을 띄우기로 했다.

curl -LO https://dl.k8s.io/release/v1.27.0/bin/linux/amd64/kubectl

 

이외의 과정은 docs 따라하면 됨 (링크)

 

준비된 config 파일을 환경변수로 설정해두면 됨

sudo mkdir ~/.kube
sudo cp config.yaml ~/.kube/config
export KUBE_CONFIG="${HOME}/.kube/config

 


Nexus, Gitlab, Jenkins 

일단 매뉴얼을 봤음 

Gitlab : 말그대로 코드 저장소

Jenkins : CI 도구

Nexus : 이미지 저장소

그럼 CD 작업은 따로 거쳐줘야 하는것같음

 

Nexus 에 이미지 push 할 때 다음과 같이 해줌

Docker Login - [클러스터 공인IP]:Port -u [ID] -p [Password]

 

Nexus 에 저장된 이미지를 deploy 하는 도구로 argo CD 를 사용해보려고 한다.

 

CI/CD with Gitlab, Jenkins, nexus, ArgoCD

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

대충 이런느낌이다. 대충이 아니라 그냥 이거임

여기서 kustomize 와 helm 은 딥다이브 하기에는 머리 터질것같으니 일단 수작업으로 yaml 을 관리하겠다.

 

 

CI 쪽은 다른 팀원이 하기때문에, CD 부분을 위주로 다뤄보겠다.

CI/CD 흐름 (참고 : https://1week.tistory.com/38 )

더보기

c. CI/CD 흐름
- CI
   ✓ Developer (Source push)  
       ▷ GitLab (Merge Request ‣ Merge) 
       ▷ Jenkins (Pipeline: test ‣ code analysis ‣ build image ‣ push image to nexus ‣ change YAML  ‣ push YAML to GitLab)
- 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)

d. Argo CD 관련 고려 사항 
- Sync Policy
   ✓ Auto Sync : 주기별 동기화 체크 후 불 일치시 반영
   ✓ Manual Sync : 주기별 동기화 체크

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

 

ArgoCD 구축

설치는 다음 docs 와 블로그를 참고해주면 된다.

https://devocean.sk.com/blog/techBoardDetail.do?ID=164752&boardType=techBlog

https://argo-cd.readthedocs.io/en/stable/getting_started/

 

 

argoCD 를 설치하면서,.. 외부접속을 위해선 external IP 를 설정해줘야 하는데, pending 이 발생했다.

svc 타입을 LB 로 설정해뒀고, KT 내에서 확인해보면 LB 서비스가 띄워져있는걸 볼 수 있다.

 

 

 

 

K2P 기본 구성을 살펴보면, LB 도 붙어있는 것 같은데,, 

 

 

https://manual.cloud.kt.com/kt/k2p-std-ingress

 

Cloud 매뉴얼

 

manual.cloud.kt.com

이걸 좀 봐야할 것 같다.

 

 

즉, KT 자체의 LB -> ingress -> nodeport 로 트래픽이 처리되는 과정이 이미 구축되어있고, 

나는 ingress 만 만들어주면 argoCD 를 외부접속이 가능하게 할 수 있는 것이다.

 

argoCD-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-argocd
  namespace: argocd
spec:
  ingressClassName: nginx
  rules:
  - host: argocd.*****.nip.io    # 도메인명 일부 내용 비식별 처리 
    http:
      paths:
      - backend:
          service:
            name: argocd-server
            port:
              name: http
        path: /
        pathType: Prefix

 

이거. .같은 80 포트로 인그레스 될 수 없어서,, argocd 포트를 바꾸거나 

노드포트를 뚫어야 한다.

https://manual.cloud.kt.com/kt/category-edit

 

근데 걍 argocd helm 으로 받아서 포트 수정하는게 빠를듯해서

Helm 설치

https://helm.sh/ko/docs/intro/install/

 

 

ArgoCD Ingress 생성

 

(이게 적용이 제대로 안되어서 values.yaml 바꿔줌 )

 

helm 적용해주니 다음과같은 것들이 떴다.

 

argocd 리소스들을 보면,

 

 

아 진짜 너무 ..모르겠음 이게 이렇게까지 꼬일일이 아닌데, 일단 익숙치가 않은 UI 와 사용법을 가진 KT 라그런가 진짜.. 아오..

 

경우1) 

argocd 의 ingress path 를 /, port 를 80 으로 뒀을때

argocd 의 service ( argocd-server) 의 port 를 80:8080 

안됨

경우2)

argocd 의 ing path 를 /argocd, port 80 

argocd svc port 를 고대로

안됨

경우3)

argocd 의 ing path 를 /argocd,port 8082

argocd svc port 8082:80

 

여튼 무수히 많은 경우를 하다가 문득 생각난 것.. LB 에 https 적용이 안되어있음을 깨달음

argoCD 는 default 접근이 443이기 때문에 

https 적용을 하고 -> ingress 에도 port 를 https 로 하게되면 조금 더 수월하게.. 접근할 수 있을 것 같다.

 

를 하려고 했는데,, 팀원에게 물어본 결과 

내가 여태 다른 ip 로 방화벽 설정을 하고있었다는 것을 깨달았다. (정말..2시간을 날려먹었달까?)

어쩐지 매뉴얼을 아무리 봐도, LB STATIC NAT 가 설정되어있을경우 ( 상단 사진에 보면, IP 가 SN 으로 시작되는 경우), 접속정보(포트포워딩)설정이 안되는데 어떻게 해야할지 감이 안잡힌 상태였다.

결론은 IP가 잘못된거였다는... 

PORTFORWARDING 상태의 인스턴스의 접속정보를 수정해줘야한다.

나머지 보안설정은 매뉴얼대로 하면된다. (argocd 의 nodeport 설정해주면됨)

 

 

그리고 앞서 예상했던것과 같이, 80 포트가 gitlab 과 겹치기 때문에 이 블로그처럼 /argocd 를 path로 해뒀다.

 

말로 하면 와닿지 않으니 파일은 아래와 같다.

ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  labels:
    app.kubernetes.io/component: server
    app.kubernetes.io/instance: argocd
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: argocd-server
    app.kubernetes.io/part-of: argocd
    app.kubernetes.io/version: v2.12.1
    helm.sh/chart: argo-cd-7.4.4
  name: argocd-server
  namespace: argocd
spec:
  ingressClassName: nginx
  rules:
  - host: argocd.[사용자도메인설정]
    http:
      paths:
      - backend:
          service:
            name: argocd-server
            port:
              number: 80
        path: /argocd
        pathType: Prefix
status:
  loadBalancer: {}

 

service.yaml (argocd-server yaml)

apiVersion: v1
kind: Service
metadata:
  name: argocd-server
  namespace: argocd
spec:
  clusterIP: 10.**.**.**
  clusterIPs:
  - 10.**.**.**
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: http
    nodePort: 30718
    port: 80
    protocol: TCP
    targetPort: 8080
  - name: https
    nodePort: 32675
    port: 443
    protocol: TCP
    targetPort: 8080
  selector:
    app.kubernetes.io/instance: argocd
    app.kubernetes.io/name: argocd-server
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

 

하.. 힘들다 

 

http://[사용자설정ingress도메인]/argocd 

로 접속하니 잘 된다.

 

password 는 argocd 처음 설치했을때 보여준 다음 명령어 이용

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

 

다음 게시물에 이어서 argocd 를 이용해 CD 작업을 하는 과정을 보이겠다.

 

CICD 참고 : https://1week.tistory.com/40

kustomize 참고 : https://malwareanalysis.tistory.com/399

728x90
리촬리