System Architecture Design
서버 배포 / DevOps 구성

서버 배포 / DevOps 구성

CI/CD 구성

Github를 활용한 tag로 분리하여 배포진행함 Github Action Tag -> Build Dockerimage to Azure ACR with Helm Image -> ArgoCD Deploy for Kubernetes -> Auto update service

GitOps CI/CD 구현

ArgoCD 설치 for CI/CD API server

Argo

ArgoCD 링크 (opens in a new tab) - Azure Login기능 적용 Terraform을 활용하여 인프라 코드로 Helm를 활용한 Kubernetes에 배포하여 관리하고 있습니다. 아래와 같이 helm을 통해서 argocd를 설치하며 기타 OIDC, RBAC, DNS, Ingress를 설정하여 외부에서 접근 가능하도록 설정되어있습니다.

resource "helm_release" "argocd" {
  name       = var.namespace
  repository = "https://argoproj.github.io/argo-helm"
  chart      = "argo-cd"
  version    = "5.46.7" # 원하는 버전 지정
  namespace  = var.namespace
 
  set {
    name  = "server.service.type"
    value = "ClusterIP"
  }
 
  set {
    # Run server without TLS
    name  = "configs.params.server\\.insecure"
    value = true
  }
 
 
  depends_on = [
    kubernetes_namespace.argocd,
    null_resource.add_helm_repo
  ]
}
 
 
resource "azuread_service_principal" "sp" {
  depends_on                   = [azuread_application.app]
  application_id               = azuread_application.app.application_id
  app_role_assignment_required = false
}
 
resource "azuread_application_password" "password" {
  display_name = "argocd-sso"
  depends_on            = [azuread_application.app]
  application_object_id = azuread_application.app.object_id
  end_date_relative     = "8640h" # 예: 1년 후 만료
}
 
resource "kubectl_manifest" "argocd_cm" {
  yaml_body = <<-EOT
  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: ${var.namespace}-cm
    namespace: ${var.namespace}
    labels:
      app.kubernetes.io/component: server
      app.kubernetes.io/instance: ${var.namespace}
      app.kubernetes.io/managed-by: Helm
      app.kubernetes.io/name: ${var.namespace}-cm
      app.kubernetes.io/part-of: ${var.namespace}
      app.kubernetes.io/version: v2.8.3
      helm.sh/chart: argo-cd-5.46.2
    annotations:
      meta.helm.sh/release-name: ${var.namespace}
      meta.helm.sh/release-namespace: ${var.namespace}
  data:
    admin.enabled: "${var.argocd_admin_enabled}"
    application.instanceLabelKey: ${var.namespace}.argoproj.io/instance
    exec.enabled: "false"
    server.rbac.log.enforce.enable: "false"
    timeout.hard.reconciliation: "0s"
    timeout.reconciliation: "180s"
    url: "https://${local.dns_link}"
    dex.config: |
      connectors:
        - type: microsoft
          id: microsoft
          name: Azure AD
          config:
            clientID: "${azuread_application.app.application_id}"
            clientSecret: "${azuread_application_password.password.value}"
            redirectURI: "https://${local.dns_link}/api/dex/callback"
            tenant: "${data.azurerm_client_config.current.tenant_id}"
  EOT
 
  depends_on = [azuread_application.app, azuread_application_password.password]
}
 
 
resource "kubectl_manifest" "argocd_rbac-cm" {
  yaml_body = <<-EOT
  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: ${var.namespace}-rbac-cm
    namespace: ${var.namespace}
    labels:
      app.kubernetes.io/component: server
      app.kubernetes.io/instance: ${var.namespace}
      app.kubernetes.io/managed-by: Helm
      app.kubernetes.io/name: ${var.namespace}-rbac-cm
      app.kubernetes.io/part-of: ${var.namespace}
      app.kubernetes.io/version: v2.8.3
      helm.sh/chart: argo-cd-5.46.2
    annotations:
      meta.helm.sh/release-name: ${var.namespace}
      meta.helm.sh/release-namespace: ${var.namespace}
  data:
    policy.csv: |
      p, role:org-admin, applications, *, */*, allow
      p, role:org-admin, clusters, get, *, allow
      p, role:org-admin, repositories, get, *, allow
      p, role:org-admin, repositories, create, *, allow
      p, role:org-admin, repositories, update, *, allow
      p, role:org-admin, repositories, delete, *, allow
      g, "${data.azuread_group.admin.display_name}", role:org-admin
    policy.default: role:readonly
    scopes: "[openid, profile, email, groups]"
  EOT
 
  depends_on = [azuread_application.app, azuread_application_password.password]
}