> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ale.run/llms.txt
> Use this file to discover all available pages before exploring further.

# TLS 인증서 및 Ingress 적용

> Cert Manager를 활용한 SSL/TLS 인증서 적용 가이드입니다.

<Note>
  `ale`에서 배포된 서비스의 프리뷰 URL 및 커스텀 도메인에 TLS 인증서가 자동으로 적용됩니다.
</Note>

***

## 클러스터 인증서 생성기 설치 및 인증서 발급

<Steps>
  <Step title="인증서 생성 스크립트에서 사용되는 값을 환경변수로 설정하세요.">
    ```bash theme={null}
    export CLOUDFLARE_DOMAIN=<Cloudflare 도메인>
    export CLOUDFLARE_EMAIL=<Cloudflare 계정 이메일>
    export CLOUDFLARE_API_TOKEN=<Cloudflare API 토큰>
    export ACME_EMAIL=<인증서 발급 이메일>
    ```

    <Info>
      Cloudflare API 토큰은 DNS Edit 권한이 부여되어 있어야 합니다.
    </Info>
  </Step>

  <Step title="다음의 명령어를 실행하여 인증서 생성기를 설치하세요.">
    ```bash theme={null}
    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: cloudflare-api-token-secret
      namespace: cert-manager
    type: Opaque
    stringData:
      api-token: $CLOUDFLARE_API_TOKEN
    ---
    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      name: ale-issuer
      namespace: cert-manager
    spec:
      acme:
        email: $ACME_EMAIL
        server: https://acme-v02.api.letsencrypt.org/directory
        privateKeySecretRef:
          name: ale-issuer
        solvers:
          - http01:
              ingress:
                class: nginx
          - dns01:
              cloudflare:
                email: $CLOUDFLARE_EMAIL
                apiTokenSecretRef:
                  name: cloudflare-api-token-secret
                  key: api-token
            selector:
              dnsZones:
                - $CLOUDFLARE_DOMAIN
    EOF
    ```
  </Step>

  <Step title="다음의 명령어를 실행하여 인증서를 발급합니다.">
    ```bash theme={null}
    cat <<EOF | kubectl apply -f -
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: ale-app-tls
      namespace: cert-manager
    spec:
      dnsNames:
        - "*.$CLOUDFLARE_DOMAIN"
      issuerRef:
        kind: ClusterIssuer
        name: ale-issuer
      secretName: ale-app-tls
    EOF
    ```
  </Step>
</Steps>

## Ingress 생성

<Steps>
  <Step title="다음의 명령어로 클러스터 인증서 생성기 및 Ingress를 설치합니다.">
    ```bash theme={null}
    cat <<EOF | kubectl apply -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ale
      namespace: ale
      annotations:
        nginx.ingress.kubernetes.io/whitelist-source-range: 0.0.0.0/0
        cert-manager.io/cluster-issuer: ale-issuer
    spec:
      ingressClassName: nginx
      tls:
        - hosts:
            - app.$CLOUDFLARE_DOMAIN
          secretName: ale-controller-tls
      rules:
        - host: app.$CLOUDFLARE_DOMAIN
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: ale-controller
                    port:
                      number: 9001
    EOF
    ```
  </Step>

  <Step title="다음의 명령어로 인증서가 생성 및 반영되었는지 확인할 수 있습니다. 정상적으로 생성되었다면 STATE 항목이 valid 상태여야 합니다.">
    ```bash theme={null}
    kubectl get order -n ale \
      | awk '/ale-/{print $1}' \
      | xargs kubectl get order -n ale
    ```

    ```bash theme={null}
    NAME                              STATE   AGE
    ale-controller-tls-1-1997619857   valid   103s
    ```
  </Step>

  <Step title="다음의 URL로 접속이 되면, 인증서가 정상적으로 반영된 것입니다. 만약 접속이 정상적으로 되지 않는다면 Cert Manager pod나 Cluster Issuer의 상태를 점검해야 합니다.">
    ```bash theme={null}
    https://app.[Cloudflare 도메인]
    ```
  </Step>

  <Step title="관리자 계정을 생성하고 설치를 완료해주세요.">
    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/setup/ec2/images/en/04_22.png" />
    </Frame>

    <Note>
      프리뷰 도메인 필드에는 연결한 루트 도메인을 입력합니다.
    </Note>
  </Step>
</Steps>

## 클러스터 네트워크 설정

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/setup/ec2/images/04_23.png" />
</Frame>

> 운영시스템 클러스터 페이지의 설정 탭에서 네트워크 항목에 아래의 값을 입력하세요.

* **프리뷰 도메인**: Route53의 루트 도메인
* **HTTPS 사용**
  * **체크**: 인터넷 환경
  * **체크 해제**: 인트라넷/폐쇄망 환경
* **인증서 시크릿 이름**: ale-app-tls
* **인증서 시크릿 네임스페이스**: cert-manager
* **인증서 발급기**: ale-issuer
* **인그레스 클래스**: nginx
* **인그레스 IP**: 공란(자동인식)
* **로드밸런서 유형**
  * 로드밸런서
  * 노드포트
* **인그레스/이그레스 대역폭**: Mbps 단위로 입력

<Info>
  대시보드 좌측 상단의 스페이스 이름을 클릭한 후 운영시스템을 선택하면 운영시스템에 접속할 수 있습니다.

  <Frame>
    <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/setup/ec2/images/04_24.png" />
  </Frame>
</Info>

<Note>
  운영시스템 메뉴는, 운영시스템 접속권한을 부여받은 계정에서만 표시됩니다.
</Note>
