Kubernetes Tools/ArgoCD

[Ep.45] [Argo CD ์‹ค๋ฌด ์ ์šฉ #3] Argo CD๋ฅผ ํ™œ์šฉํ•œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ์ž์ฒด ๊ด€๋ฆฌ(Self-managed Cluster)

ygtoken 2025. 3. 18. 10:35
728x90

๐Ÿ”น Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ์ž์ฒด ๊ด€๋ฆฌ(Self-managed Cluster)๋ž€?

์ผ๋ฐ˜์ ์œผ๋กœ Argo CD๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์ง€๋งŒ,
์ด๋ฅผ ํ™•์žฅํ•˜์—ฌ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ์ž์ฒด๋ฅผ Argo CD๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฆ‰, ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋„คํŠธ์›Œํฌ, RBAC, ์ธํ”„๋ผ ๋ฆฌ์†Œ์Šค, CRD(Custom Resource Definition) ๋“ฑ์„ GitOps ๋ฐฉ์‹์œผ๋กœ ์šด์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ… Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ์ž์ฒด ๊ด€๋ฆฌ(Self-managed Cluster)์˜ ์žฅ์ 

 

โœ” GitOps ๋ฐฉ์‹์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์„ ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
โœ” ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž๋™ ๋™๊ธฐํ™” ๋ฐ ๋ณต๊ตฌ ๊ฐ€๋Šฅ
โœ” ์šด์˜์ž๊ฐ€ ์ง์ ‘ ๊ฐœ์ž…ํ•˜์ง€ ์•Š์•„๋„ ์ธํ”„๋ผ ๊ตฌ์„ฑ์„ ์ง€์†์ ์œผ๋กœ ์œ ์ง€
โœ” ๋‹ค์ค‘ ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์—์„œ ์ผ๊ด€๋œ ์„ค์ • ์ ์šฉ ๊ฐ€๋Šฅ


๐Ÿ”น 1. Argo CD๋ฅผ ํ™œ์šฉํ•œ ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

Argo CD๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๋„คํŠธ์›Œํฌ ์ •์ฑ…, RBAC ์„ค์ •, CRD ๋“ฑ ๋‹ค์–‘ํ•œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… 1.1 ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฐ ๊ธฐ๋ณธ ๋ฆฌ์†Œ์Šค ์ž๋™ ์ƒ์„ฑ

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: cluster-resources
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo.git
    targetRevision: main
    path: cluster-resources  # ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค ์ •์˜ ๊ฒฝ๋กœ
  destination:
    server: https://kubernetes.default.svc
    namespace: kube-system  # ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค ๋ฐฐํฌ
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

 

โœ… ์„ค๋ช…:
โœ” path: cluster-resources → Git ์ €์žฅ์†Œ ๋‚ด ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค ์ •์˜ ๊ฒฝ๋กœ
โœ” namespace: kube-system → ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค๋Š” kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๊ด€๋ฆฌ
โœ” syncPolicy.automated → GitOps ๋ฐฉ์‹์œผ๋กœ ์ž๋™ ๋™๊ธฐํ™” ๋ฐ ๋ณต๊ตฌ

 

โœ… Argo CD๋ฅผ ํ™œ์šฉํ•œ ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค ๋™๊ธฐํ™” ์‹คํ–‰

argocd app sync cluster-resources

 

โœ… ์ถœ๋ ฅ ์˜ˆ์‹œ:

Application 'cluster-resources' synchronized

๐Ÿ”น 2. Argo CD๋ฅผ ํ™œ์šฉํ•œ RBAC(Role-Based Access Control) ๊ด€๋ฆฌ

Argo CD๋ฅผ ํ™œ์šฉํ•˜์—ฌ Kubernetes RBAC ์ •์ฑ…์„ ์„ ์–ธ์  ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… 2.1 RBAC ์ •์ฑ… ์ •์˜

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: dev-role
  namespace: development
rules:
  - apiGroups: [""]
    resources: ["pods", "services"]
    verbs: ["get", "list", "create", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-rolebinding
  namespace: development
subjects:
  - kind: User
    name: developer@example.com
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: dev-role
  apiGroup: rbac.authorization.k8s.io

 

โœ… ์„ค๋ช…:
โœ” Role → ๊ฐœ๋ฐœ์ž๊ฐ€ pods ๋ฐ services๋ฅผ ์ƒ์„ฑ, ์กฐํšŒ, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •
โœ” RoleBinding → developer@example.com ์‚ฌ์šฉ์ž๋ฅผ dev-role์— ์—ฐ๊ฒฐํ•˜์—ฌ ๊ถŒํ•œ ๋ถ€์—ฌ

 

โœ… RBAC ์ •์ฑ…์„ Argo CD๋กœ ์ž๋™ ๋ฐฐํฌ

argocd app sync cluster-rbac

 

โœ… ์ถœ๋ ฅ ์˜ˆ์‹œ:

Application 'cluster-rbac' synchronized

๐Ÿ”น 3. Argo CD๋ฅผ ํ™œ์šฉํ•œ ๋„คํŠธ์›Œํฌ ์ •์ฑ…(Network Policy) ๊ด€๋ฆฌ

Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋ ค๋ฉด ๋„คํŠธ์›Œํฌ ์ •์ฑ…(NetworkPolicy) ์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Argo CD๋ฅผ ํ™œ์šฉํ•˜๋ฉด GitOps ๋ฐฉ์‹์œผ๋กœ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์„ ์–ธ์  ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… 3.1 ๋„คํŠธ์›Œํฌ ์ •์ฑ… ์ •์˜

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-app-access
  namespace: example
spec:
  podSelector:
    matchLabels:
      app: example-app
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              role: frontend
      ports:
        - protocol: TCP
          port: 80

 

โœ… ์„ค๋ช…:
โœ” podSelector.matchLabels: app: example-app → ๋Œ€์ƒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ ํƒ
โœ” ingress.from.podSelector: role: frontend → ํ”„๋ก ํŠธ์—”๋“œ Pod์—์„œ๋งŒ ์ ‘๊ทผ ํ—ˆ์šฉ
โœ” ports: 80 → 80 ํฌํŠธ(TCP) ํŠธ๋ž˜ํ”ฝ๋งŒ ํ—ˆ์šฉ

 

โœ… ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ Argo CD๋กœ ์ž๋™ ๋ฐฐํฌ

argocd app sync cluster-network-policy

 

โœ… ์ถœ๋ ฅ ์˜ˆ์‹œ:

Application 'cluster-network-policy' synchronized

๐Ÿ”น 4. Argo CD๋ฅผ ํ™œ์šฉํ•œ ํด๋Ÿฌ์Šคํ„ฐ CRD(Custom Resource Definition) ๊ด€๋ฆฌ

Kubernetes์—์„œ CRD(Custom Resource Definition)๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํ™•์žฅํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Argo CD๋ฅผ ํ™œ์šฉํ•˜๋ฉด CRD๋ฅผ ์„ ์–ธ์  ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… 4.1 CRD ์ •์˜ ์˜ˆ์ œ

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: databases.example.com
spec:
  group: example.com
  names:
    kind: Database
    plural: databases
    singular: database
  scope: Namespaced
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                engine:
                  type: string
                version:
                  type: string

 

โœ… ์„ค๋ช…:
โœ” kind: CustomResourceDefinition → ์ƒˆ๋กœ์šด CRD ์ƒ์„ฑ
โœ” names.kind: Database → ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค ์œ ํ˜• ์ถ”๊ฐ€ (Database)
โœ” properties.engine, properties.version → ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„ ๋ฐ ๋ฒ„์ „ ํ•„๋“œ ์ •์˜

 

โœ… CRD๋ฅผ Argo CD๋กœ ์ž๋™ ๋ฐฐํฌ

argocd app sync cluster-crd

 

โœ… ์ถœ๋ ฅ ์˜ˆ์‹œ:

Application 'cluster-crd' synchronized

๐Ÿ”น ๊ฒฐ๋ก : ์ด๋ฒˆ ๊ธ€์—์„œ ๋ฐฐ์šด ํ•ต์‹ฌ ๋‚ด์šฉ ์ •๋ฆฌ

๐ŸŸข Argo CD๋ฅผ ํ™œ์šฉํ•˜์—ฌ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Œ
๐ŸŸข RBAC ๋ฐ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ GitOps ๋ฐฉ์‹์œผ๋กœ ์ ์šฉํ•˜์—ฌ ๋ณด์•ˆ ๊ฐ•ํ™” ๊ฐ€๋Šฅ
๐ŸŸข CRD(Custom Resource Definition)๋ฅผ ํ™œ์šฉํ•˜์—ฌ Kubernetes๋ฅผ ํ™•์žฅ ๊ฐ€๋Šฅ
๐ŸŸข ํด๋Ÿฌ์Šคํ„ฐ ์ž์ฒด๋ฅผ ์ฝ”๋“œ๋กœ ์ •์˜ํ•˜๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ๋ฐ˜์˜ ๊ฐ€๋Šฅ

 

728x90