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
대충 이런느낌이다. 대충이 아니라 그냥 이거임
여기서 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
이걸 좀 봐야할 것 같다.
즉, 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
'☁️2024 > Cloud' 카테고리의 다른 글
[KT Cloud] K2P Standard Container Devops 이해 및 응용 #3 (2) | 2024.09.29 |
---|---|
[KT Cloud] K2P Standard Container Devops 이해 및 응용 #2 (0) | 2024.09.23 |
CKA 응시 후기 ( 과연 결과는 ?! ) (0) | 2024.05.17 |
CKA 대비 따배씨 공부 정리 (0) | 2024.04.25 |
AWS ECS vs EKS 차이점 알기 ( 그리고 Fargate vs EC2) (2) | 2024.04.17 |