Kubernetes에 Mattermost 배포#

팀 커뮤니케이션 요구사항을 위한 확장 가능하고 견고한 인프라를 제공하는 Mattermost 서버는 다양한 Kubernetes 플랫폼에 배포할 수 있습니다. 이 가이드는 주요 클라우드 제공업체와 일반 Kubernetes 설치에 대한 배포 옵션을 다룹니다.

특정 배포 지침을 위해 아래에서 선호하는 플랫폼을 선택하세요:

기존 Azure 인프라에 Mattermost를 설치하기 위해 지원되는 Azure Marketplace Container Offer 를 사용할 수 있습니다.

시작하기 전에

배포하기 전에 다음 사항이 있는지 확인하세요:

  • AKS 클러스터: Application Gateway Ingress Controller (AGIC) add-on 가 활성화되어 있거나 다른 Ingress 컨트롤러가 배포되어 있어야 합니다.

  • PostgreSQL v13.0+ 데이터베이스: Azure Database for PostgreSQL - Flexible Server with Private Access 를 권장합니다. 이 Microsoft 빠른 시작 가이드 를 따라 하나를 배포하세요.

  • 프라이빗 네트워크 연결: AKS 클러스터와 PostgreSQL 데이터베이스 간에 네트워크 연결이 있는지 확인하세요.

  • 유효한 DNS 이름과 TLS 인증서: DNS 영역에 대한 접근 권한이 있어야 하며 Ingress 컨트롤러를 위한 유효한 TLS 키와 인증서를 제공해야 합니다.

  • 노드 용량: 100명 이상의 사용자를 위해 배포할 때 고가용성을 위해 최소 2개의 AKS 노드가 필요합니다.

  • 라이선스 키: 고가용성 및 기타 Enterprise 기능을 테스트하기 위한 평가판 또는 Enterprise 라이선스가 필요합니다.

설치 단계

설치 프로세스에는 Mattermost 배포 및 서버 업데이트가 포함됩니다.

1단계: Mattermost 배포

  1. Azure Marketplace Container Offer 에서 Mattermost를 배포하고 지금 받기 를 선택하세요.

  • 또는 AKS 클러스터의 Extensions + Applications 섹션으로 이동하여 Mattermost 제품을 설치할 수 있습니다. 자세한 내용은 Microsoft 클러스터 확장 문서 를 참조하세요.

  1. 설치된 AKS 및 PostgreSQL 데이터베이스의 리소스 그룹지역 을 선택하세요.

Azure AKS 프로젝트 상세 화면 예시.
  1. AKS 클러스터를 선택하세요.

Azure AKS 클러스터 설정 화면 예시.
  1. PostgreSQL 데이터베이스의 세부 정보를 입력하세요. 지정된 사용자가 전체 접근 권한을 가지고 있는지 확인하세요.

Azure AKS 데이터베이스 설정 화면 예시.
  1. 배포 이름과 배포 크기를 포함한 배포 세부 정보를 지정하세요. Mattermost 인스턴스에 대한 파일스토어 기능을 제공하는 필수 유틸리티인 Minio를 배포하려면 체크박스를 클릭하세요.

Azure AKS 배포 세부 정보 설정 화면 예시.
  1. Mattermost 설치 호스트명과 Ingress 세부 정보를 구성하세요. 다음 예제에서는 필요한 ingress 주석을 보여주기 위해 AGIC 애드온이 사용됩니다.

  1. Kubernetes Ingress와 TLS 종료를 지원하는 한 클러스터의 사전 설치된 Ingress 컨트롤러를 사용할 수 있습니다.

kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/ssl-redirect: "true"
  1. 또한 다음 사항을 고려하는 것을 권장합니다:

  1. 최소 TLS 버전 적용(예: TLS 1.2).

  2. Ingress 컨트롤러가 지원하는 경우 추가 보호를 위해 Web Application Firewall(WAF) 배포.

  3. Kubernetes 네트워크 정책을 사용하여 접근 제한.

Azure AKS 네트워킹 세부 정보 설정 화면 예시.
  1. 모든 것이 실행 중인지 확인하세요. 설정 메뉴 아래의 AKS Extensions + Applications 페이지에서 설치된 플러그인을 확인할 수 있어야 합니다.

  1. 배포가 완료되면 다음 명령을 사용하여 Mattermost 배포의 호스트명 또는 IP 주소를 얻으세요:

kubectl -n mattermost-operator get ingress
  1. ADDRESS 열에서 IP 주소를 사용하여 도메인 등록 서비스에 DNS 레코드를 생성하세요.

  2. DNS 레코드에서 결정한 URL에서 작동하는 Mattermost 설치에 접근하세요.

관리자 가이드 를 방문하여 Mattermost 서버 관리에 대해 자세히 알아보세요.

2단계: AKS 클러스터를 통해 Mattermost 업그레이드

  1. Mattermost가 설치된 AKS 클러스터의 Extensions + Applications 섹션을 방문하세요.

  2. Mattermost 버전을 업데이트하지 않으므로 마이너 버전 자동 업그레이드를 활성화할 수 있습니다.

  3. Configuration Settings 테이블을 확장하고 아래 구성과 설치하려는 버전을 값으로 추가하세요.

 global.azure.mattermost.version

.. image:: /_static/images/global-azure-mattermost-version.png
 :alt: An example of using custom Mattermost version.
  1. 저장 을 선택하고 업그레이드가 완료될 때까지 기다리세요.

중요

Mattermost 서버를 호스팅하기 위해 생성한 모든 인프라와 관련된 Azure 비용은 귀하가 부담하며, Azure 크레딧은 Mattermost 라이선스 구매에 적용할 수 없습니다.

Mattermost Kubernetes Operator를 사용하여 S3 호환 스토리지와 관리형 데이터베이스 서비스를 사용하여 Kubernetes에 Mattermost를 배포할 수 있습니다. 이 Operator는 다양한 구성을 지원하지만, 프로덕션 환경에서는 클라우드 네이티브 접근 방식을 강력히 권장합니다.

사전 요구사항

시작하기 전에 다음 사항이 있는지 확인하세요:

설치 단계

설치 프로세스는 필요한 Operator를 설정한 다음 Mattermost 자체를 배포하는 것을 포함합니다.

1단계: NGINX Ingress Controller 설치

Kubernetes 클러스터에 NGINX ingress controller를 설치하려면 Kubernetes 배포 문서 의 지침을 따르세요. Mattermost는 설치하는 플랫폼에 관계없이 helm을 통해 Nginx Operator를 설치하는 것을 권장합니다.

2단계: Mattermost Operator 설치

Mattermost Kubernetes Operator는 Helm을 사용하여 설치할 수 있습니다.

  1. Helm(버전 3.13.0 이상)을 설치하세요. 설치 지침은 Helm 빠른 시작 문서 를 참조하세요.

  2. Mattermost Helm 저장소를 추가하세요:

helm repo add mattermost https://helm.mattermost.com
  1. config.yaml 파일을 생성하고 Mattermost operator values 파일 의 내용으로 채우세요. 이 파일을 통해 operator를 사용자 정의할 수 있습니다.

  2. Mattermost Operator를 위한 네임스페이스를 생성하세요:

kubectl create ns mattermost-operator
  1. Mattermost Operator를 설치하세요. 버전을 지정하지 않으면 Mattermost Operator의 최신 버전이 설치됩니다.

helm install <your-release-name> mattermost/mattermost-operator -n <namespace_name>

예시:

helm install mattermost-operator mattermost/mattermost-operator -n mattermost-operator

사용자 정의 config.yaml 파일을 사용하려면:

helm install mattermost-operator mattermost/mattermost-operator -n mattermost-operator -f config.yaml

3단계: Mattermost 배포

참고

  • 다중 서버 배포에는 Mattermost Enterprise 라이선스가 필요합니다.

  • Enterprise 라이선스가 없는 단일 서버 배포의 경우, 아래 2단계의 spec 섹션에 Replicas: 1 을 추가하세요. 고가용성 배포에 대한 자세한 내용은 고가용성 문서 를 참조하세요.

  1. (Mattermost Enterprise 전용) Mattermost 라이선스 시크릿을 생성하세요. mattermost-license-secret.yaml 이라는 파일을 생성하고 다음 내용으로 채우되, [LICENSE_FILE_CONTENTS] 를 실제 라이선스로 대체하세요:

apiVersion: v1
kind: Secret
metadata:
  name: my-mattermost-license
type: Opaque
stringData:
  license: <LICENSE_FILE_CONTENTS>
  1. mattermost-installation.yaml 이라는 Mattermost 설치 매니페스트 파일을 생성하세요. 이 가이드의 파일 이름은 제안사항이며, 다른 이름을 사용할 수 있습니다. 다음 템플릿을 사용하고 필요에 따라 값을 조정하세요:

apiVersion: installation.mattermost.com/v1beta1
kind: Mattermost
metadata:
  name: <INSTALLATION_NAME_HERE>        # Example: mm-example-full
spec:
  size: <SIZE_VALUE_HERE>               # Example: 5000users
  ingress:
    enabled: true
    host: <FULL_DOMAIN_NAME_HERE>       # Example: example.mattermost-example.com
    annotations:
      kubernetes.io/ingress.class: nginx
version: <VERSION_HERE>               # Example: 9.3.0
licenseSecret: ""                     # If you created a license secret, put the name here

매니페스트의 주요 필드는 다음과 같습니다:

  • metadata.name: Kubernetes에서의 Mattermost 배포 이름입니다.

  • spec.size: 설치 크기입니다 (예: “100users”, “1000users” 등).

  • spec.ingress.host: Mattermost 설치의 DNS 이름입니다.

  • spec.version: Mattermost 버전입니다. 사용 가능한 버전은 서버 버전 아카이브 를 참조하세요.

  • spec.licenseSecret: 라이선스가 포함된 Kubernetes 시크릿의 이름입니다 (Enterprise에 필요).

구성 가능한 필드의 전체 목록은 예제 매니페스트커스텀 리소스 정의 를 참조하세요.

  1. 데이터베이스 자격 증명을 위한 mattermost-database-secret.yaml 파일을 생성하세요. 이 시크릿은 Mattermost 설치와 동일한 네임스페이스에 있어야 합니다.

apiVersion: v1
data:
  DB_CONNECTION_CHECK_URL: <DB_CONNECTION_CHECK_URL>
  DB_CONNECTION_STRING: <DB_CONNECTION_STRING>
  MM_SQLSETTINGS_DATASOURCEREPLICAS: <MM_SQLSETTINGS_DATASOURCEREPLICAS>
kind: Secret
metadata:
  name: my-postgres-connection
type: Opaque

PostgreSQL이 있는 AWS Aurora 예시:

apiVersion: v1
data:
  DB_CONNECTION_CHECK_URL: cG9zdGdyZXM6Ly91c2VyOnN1cGVyX3NlY3JldF9wYXNzd29yZEBteS1kYXRhYmFzZS5jbHVzdGVyLWFiY2QudXMtZWFzdC0xLnJkcy5hbWF6b25hd3MuY29tOjU0MzIvbWF0dGVybW9zdD9jb25uZWN0X3RpbWVvdXQ9MTAK
  DB_CONNECTION_STRING: cG9zdGdyZXM6Ly91c2VyOnN1cGVyX3NlY3JldF9wYXNzd29yZEBteS1kYXRhYmFzZS5jbHVzdGVyLWFiY2QudXMtZWFzdC0xLnJkcy5hbWF6b25hd3MuY29tOjU0MzIvbWF0dGVybW9zdD9jb25uZWN0X3RpbWVvdXQ9MTAK
  MM_SQLSETTINGS_DATASOURCEREPLICAS: cG9zdGdyZXM6Ly91c2VyOnN1cGVyX3NlY3JldF9wYXNzd29yZEBteS1kYXRhYmFzZS5jbHVzdGVyLXJvLWFiY2QudXMtZWFzdC0xLnJkcy5hbWF6b25hd3MuY29tOjU0MzIvbWF0dGVybW9zdD9jb25uZWN0X3RpbWVvdXQ9MTAK
kind: Secret
metadata:
  name: my-postgres-connection
type: Opaque

4단계: Filestore 시크릿 생성

객체 스토리지 서비스(예: AWS S3, MinIO)의 자격 증명을 저장하기 위해 mattermost-filestore-secret.yaml 파일을 생성하세요. 이 시크릿은 Mattermost를 설치하려는 동일한 네임스페이스에 생성되어야 합니다. 파일은 다음 YAML 구조를 포함해야 합니다:

apiVersion: v1
kind: Secret
metadata:
  name: <secret-name>  # Choose a descriptive name (e.g., my-s3-credentials)
type: Opaque
data:
  accesskey: <base64-encoded-access-key>
  secretkey: <base64-encoded-secret-key>

설명

필수

accesskey

스토리지 서비스의 Base64로 인코딩된 액세스 키입니다.

secretkey

스토리지 서비스의 Base64로 인코딩된 시크릿 키입니다.

metadata.name

Kubernetes 시크릿의 이름입니다.

중요

accesskey``와 ``secretkey 값은 base64로 인코딩 되어야 합니다. 원시 키를 직접 입력하지 마세요. base64 문자열을 생성하려면 명령줄 도구나 온라인 인코더를 사용하세요.

예시 (AWS S3):

apiVersion: v1
kind: Secret
metadata:
  name: my-s3-credentials
type: Opaque
data:
  accesskey: QUNDRVNTX0tFWQo=  # Example: Replace with your actual encoded key
  secretkey: U1VQRVJfU0VDUkVUX0tFWQo=  # Example: Replace with your actual encoded key

5단계: Mattermost 설치 매니페스트 구성

  1. mattermost-installation.yaml 파일(2단계에서 생성)을 수정하여 Mattermost를 외부 데이터베이스와 객체 스토리지에 연결하세요. YAML 구조 내에서 이러한 구성을 추가할 위치에 대한 지침은 지원되는 필드를 참조하세요.

  2. 데이터베이스에 연결:

  1. 매니페스트의 spec 섹션에 다음을 추가하세요:

spec:
  database:
    external:
      secret: <database-secret-name>  # The name of the database secret (e.g., my-postgres-connection)
  1. 객체 스토리지에 연결:

  1. 매니페스트의 spec 섹션에 다음을 추가하세요:

spec:
  fileStore:
    external:
      url: <storage-service-url>  # The URL of your storage service (e.g., s3.amazonaws.com)
      bucket: <bucket-name>      # The name of your storage bucket
      secret: <filestore-secret-name> # The name of the filestore secret (e.g., my-s3-credentials)
  1. Amazon S3를 사용하는 경우 서버 측 암호화(SSE)와 SSL을 활성화하는 것이 좋습니다. mattermostEnv 섹션에 다음 환경 변수를 추가하세요:

spec:
  mattermostEnv:
    MM_FILESETTINGS_AMAZONS3SSL: true
    MM_FILESETTINGS_AMAZONS3SSE: true

Mattermost 리소스 상태 검토

Operator로 Mattermost 설치가 생성된 후에는 다음을 사용하여 상태를 검토할 수 있습니다:

kubectl -n [namespace] get mattermost

Mattermost 서버 파드에 대한 자세한 정보를 얻기 위해 kubectl describe 명령어를 사용할 수 있습니다:

kubectl -n [namespace] describe pod

로그 추적

다음 명령어를 사용하여 모든 Kubernetes 파드의 로그를 추적할 수 있습니다:

kubectl -n [namespace] logs -f [pod name]

-n [namespace] 를 생략하면 현재 컨텍스트의 기본 네임스페이스가 사용됩니다. 배포에 따라 네임스페이스를 지정하는 것을 권장합니다.

이 명령어를 사용하여 필요에 따라 Mattermost Operator 또는 Mattermost 서버 로그를 검토할 수 있습니다.

참고

  • Kubernetes가 처음이거나 관리형 솔루션을 선호하는 경우 Amazon EKS, Azure Kubernetes Service, Google Kubernetes Engine, 또는 DigitalOcean Kubernetes 와 같은 서비스를 고려해보세요. 이 가이드는 데이터베이스와 파일 스토리지를 위해 외부 관리형 서비스를 사용하는 데 중점을 두고 있지만, Mattermost Operator는 다른 솔루션을 사용할 수 있는 유연성을 제공합니다. 예를 들어, CloudNative PG operator를 사용하여 Kubernetes 클러스터 내에 PostgreSQL 데이터베이스를 배포하거나(또는 원하는 대로 외부에 배포), 객체 스토리지를 위해 자체 호스팅 MinIO 인스턴스를 사용할 수 있습니다.

  • 관리형 클라우드 서비스를 사용하는 것이 일반적으로 유지 관리가 더 간단하고 프로덕션 배포를 위한 권장 접근 방식이지만, 스토리지를 위한 MinIO와 PostgreSQL을 위한 CloudNative PG와 같은 자체 관리형 서비스도 관리할 전문 지식이 있다면 유효한 옵션입니다.

  • 자체 관리형 구성 요소를 사용하기로 선택한 경우, 내부 서비스를 가리키도록 지침을 그에 맞게 조정해야 합니다.

  • 프로덕션 배포를 사용자 정의하려면 구성 설정 문서 를 참조하세요.

  • 배포 중 문제가 발생하면 배포 문제 해결 가이드 를 참조하세요.

Mattermost 배포 보안 설정#

Kubernetes 환경에서 Mattermost를 배포하면 확장성, 보안 및 관리 용이성을 위한 Kubernetes 네이티브 기능을 활용할 수 있습니다. Ingress 리소스와 ingress 컨트롤러를 함께 사용하면 라우팅과 TLS 인증서를 효과적으로 관리하면서 Mattermost에 대한 안전한 HTTPS 접근을 활성화할 수 있습니다.

  1. Kubernetes 클러스터에 NGINX Ingress Controller 와 같은 ingress 컨트롤러를 배포하세요.

  2. 외부 트래픽을 Mattermost 서비스로 라우팅하기 위한 Ingress 리소스를 정의하세요. 아래는 Ingress 매니페스트 예시입니다:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: mattermost-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: "10m"  # Customize client body size limit
    nginx.ingress.kubernetes.io/proxy-read-timeout: "60" # Customize request timeout
spec:
  tls:
  - secretName: mattermost-tls # Reference to the TLS secret
  rules:
  - host: <your-domain.com>
    http:
      paths:
      - path: /
        pathType: ImplementationSpecific
        backend:
          service:
            name: mattermost-service # Name of your Mattermost service
            port:
              number: 80
  1. TLS 인증서를 사용하여 HTTPS 접근을 보안하세요. 다음 중 하나를 선택할 수 있습니다:

  • 자체 TLS 인증서와 개인 키를 제공하세요.

  • cert-manager 를 사용하여 TLS 인증서 발급 및 관리를 자동화하세요. 자체 TLS 인증서를 제공하는 경우, 이를 저장할 Kubernetes secret을 생성하세요.

  • Ingress 리소스의 tls 섹션에서 secret 이름(mattermost-tls)을 참조하도록 하세요.

  1. Ingress와 TLS YAML 매니페스트를 파일(예: ingress.yamltls.yaml)로 저장하고 Kubernetes 명령줄 도구를 사용하여 클러스터에 적용하세요.

  2. 도메인 이름 your-domain.com 이 클러스터 또는 ingress 컨트롤러의 외부 IP 주소를 올바르게 가리키도록 DNS를 구성하세요. nslookup이나 dig와 같은 도구를 사용하여 이를 확인할 수 있습니다.

  3. Ingress를 적용한 후, 웹 브라우저에서 도메인(예: https://your-domain.com)으로 이동하여 HTTPS 접근을 확인하세요. 문제가 발생하면 ingress 컨트롤러 로그(kubectl logs -n <namespace> <ingress-controller-pod-name>), DNS 레코드, TLS 구성을 확인하세요.

  4. Ingress 주석에서 HSTS 및 추가 보안을 활성화하세요.

추가로 고려할 사항:

  • 최소 TLS 버전 적용(예: TLS 1.2).

  • Ingress 컨트롤러가 지원하는 경우 추가 보호를 위해 Web Application Firewall(WAF) 배포.

  • Kubernetes 네트워크 정책을 사용하여 접근 제한.

이 단계를 따르면 Kubernetes의 Mattermost 배포가 TLS를 사용하여 HTTPS를 통해 안전하게 접근 가능해집니다. NGINX Ingress 컨트롤러가 라우팅과 프록시를 관리하고 적절한 보안 관행이 적용되어 있어 프로덕션 사용을 위한 견고한 설정이 준비됩니다.