Postgre용 외부 Azure 데이터베이스와 함께 Azure Kubernetes 서비스에...

Postgre용 외부 Azure 데이터베이스와 함께 Azure Kubernetes 서비스에...

반응형

가상 머신이나 프로덕션 워크로드를 위한 베어 메탈과 같은 미들웨어를 구축해 본 적이 있다면 이는 완전히 엉터리라는 것을 알 것입니다. Azure DevOps를 통해 가상 머신에 자동으로 구현되었습니다. 괜찮기는 하지만 컨테이너가 더 안정적이고 빠르게 구현됩니다.

인프라 아키텍처를 살펴볼 때 AKS 클러스터 내의 영구 데이터를 방지하고자 했습니다. 기본적으로 FME는 Postgre를 배포합니다.활성 작업 및 기타 데이터를 관리하기 위한 AKS 내의 SQL 서비스. 외부 데이터베이스 프로바이더에 연결하면 까다로운 운영 워크로드를 위한 확장성과 고가용성을 모두 유연하게 수행할 수 있습니다. AKS에 FME를 구축하기 위한 설명서는 좋은 시작이지만, 이 여정을 시작하는 다른 사람들에게 유용할 수 있는 몇 가지 추가 정보를 배웠습니다.

AKS에 FME 배포: Values.yaml

지금까지 발생한 대부분의 배포 문제는 조타 차트에 제공된 값.yaml의 구성과 관련이 있습니다. 이 구성에 대한 문서도 있지만, 상당히 피상적이기 때문에 좀 더 많은 정보가 필요한 사용자를 위해 자세히 설명하겠습니다.

창고의fmeserver.size

이 값은 기본적으로 10Gi이지만 Azure 프리미엄 스토리지 계정의 크기는 100Gi보다 작을 수 없습니다. 이 내용은 Safe 커뮤니티 게시물에 자세히 설명되어 있습니다.

fmeserver.image.tag

위에서 언급한 문서에서는 어떤 이미지 태그를 지정해야 하는지 알아냅니다. 저는 가장 최근의 안정적 릴리스를 원했습니다. 이 것은 2021.1.2입니다. 필드에 무엇을 넣어야 하는지 잘 몰랐습니다. 클릭했을 때, 태그 값으로 2021.1.2-를 넣어야 할 것처럼 보였습니다.

그러나 태그를 이렇게 지정하면 다음 오류가 발생합니다.

컨테이너 이미지는 Safe에 의해 유지 관리되고 RedHat의 quay.io에서 호스팅됩니다. 이미지 저장소를 직접 보고 사용 가능한 실제 태그를 볼 수 있습니다. 두 가지 결과를 보여주는 2021.1.2 태그에 대해 fmeserver-engine을 필터링할 수 있습니다. 태그 부착: 2021.1.2-희망 결과를 저장한다.

Postgre에 Azure 데이터베이스 사용SQL

포털에서 수동으로 클릭하든 ARM 템플릿, Bicep, Terraform 또는 다른 도구를 사용하든 PostgreSQL용 Azure Database(이하 Postgres)를 쉽게 배포할 수 있습니다. 여기서는 이 작업을 수행하는 방법에 대해 설명하지 않겠지만 FME에 대한 구체적인 구성에 대해 설명하겠습니다.

데이터베이스 크기/버전

Postgres의 단일 vCore Basic SKU에는 초기 배포에 충분하지 않은 50개의 연결 제한이 있습니다. 이중 vCore는 배포하기에 충분하지만 워크로드에는 충분하지 않을 수 있으므로 표준 범용 SKU를 사용하는 것이 좋습니다. 여기에서 Azure의 Postgres에 대한 연결 제한에 대한 자세한 정보를 찾을 수 있습니다.

나는 Postgres 버전 11을 사용하여 배치했고 이것은 잘 작동하는 것 같다. 사용 가능한 최신 버전으로 기본 설정입니다.

연결 보안/pg_hba.conf

기본적으로 FME를 배포하는 조타 장치 차트에는 동적 송신 IP가 있으며, 이 IP는 쉽게 표시되지 않습니다. 이 IP는 포드가 Postgres 인스턴스에 연결하는 데 사용되므로 pg_hba.conf에서 구성해야 합니다. 알지 못하는 사용자에게는 기본적으로 데이터베이스에 연결할 수 있는 호스트의 화이트리스트입니다. Azure에서 이 파일은 연결 보안 페이지를 통해 관리됩니다.

기본적으로 Azure에서 Postgres를 배포하는 방법에 따라 Dbinit 컨테이너가 Postgres에 의해 인증되지 않은 것으로 거부되어 재시도 루프에 갇히게 됩니다. 이 문제를 해결하기 위한 몇 가지 방법이 있습니다.

Azure 서비스에 대한 액세스 허용을 예로 변경합니다. 이렇게 하면 사용자가 제어할 수 없는 호스트를 포함하여 Azure의 모든 호스트가 데이터베이스에 연결할 수 있습니다. 즉, 사용자 이름과 암호만 Azure의 다른 호스트에 대해 데이터베이스를 보호하지만 서비스는 연결할 수 있습니다.

Azure 서비스에 대한 액세스 허용을 예로 변경하고, dbinit 컨테이너가 연결하여 클라이언트 IP를 찾을 수 있도록 허용한 후 연결 보안 페이지에서 특정 방화벽 규칙으로 추가합니다. 이제 주의할 점은, 제 경험으로 볼 때, 이런 상황은 별로, 적어도 자주 바뀌지는 않는 것 같습니다. 하지만 저는 이것이 변화의 대상이 아니라고 장담할 수 없습니다. 따라서 예기치 않게 FME 서비스를 중단시키게 됩니다.

이 문제를 해결하는 가장 안전한 방법은 AKS 클러스터에 Azure 로드 밸런서와 함께 정적 송신 IP를 추가하는 것입니다. 이 방법은 더 복잡하지만 방화벽 규칙에 추가하기 위해 변경되지 않는 IP를 제공합니다. Microsoft는 여기에 그 방법에 대한 페이지가 있습니다.

Values.yaml: fmeserver.데이터베이스

Safe에는 제공되는 기본 YAML을 구성하는 방법에 대한 몇 가지 지침이 있습니다. 그 정보는 좋은 출발점이지만, 내가 시작했으면 하는 모든 정보나 어떤 예도 포함하고 있지 않다.

YAML의 fmeserver.Database 노드에 대한 기본 구성은 다음과 같습니다.

database: host: port: '5432' name: fmeserver user: fmeserver password: 4fmmsgrz09 passwordSecret: passwordSecretKey: fmeserver-db-password # require ssl on the connection ssl: false # set to true if using Azure Postgresql to make sure connection strings are formatted correctly azure: false # This user and password must be a database user that can create databases and users in the postgresql database adminUser: postgres adminPasswordSecret: adminPasswordSecretKey: postgresql-password adminDatabase: postgres

우선 기본 암호를 사용하지 마십시오. 특히 모든 Azure 서비스를 Postgres 인스턴스에 연결할 수 있도록 허용할 경우 더욱 그러합니다. 기본적으로 모든 사용자가 데이터베이스에 액세스할 수 있습니다.

이 모든 것들이 무엇을 하는지 설명하기 위해, 예를 들어, 한 줄 한 줄 한 줄씩 살펴봅시다.

호스트: testserverfme.postgres.database.azure.com

데이터베이스 서버의 정규화된 이름입니다. 서버 이름만으로는 작동하지 않습니다.

좌현: 5432

Azure 서비스는 이 설정을 변경할 수 있는 옵션을 제공하지 않으며 기본값은 올바릅니다. 기본값으로 이 값을 값.yaml에서 생략할 수 있습니다.

다음 부분을 고장내겠습니다.

adminUser: postgres adminPasswordSecret: adminPasswordSecretKey: postgresql-password adminDatabase: postgres

adminUser는 생성 시 지정한 슈퍼유저이지만 Azure Postgres 인스턴스의 서버 이름과 일치해야 합니다. 예를 들어 postgres@testserverfme입니다. 데이터베이스를 만든 후 데이터베이스를 다르게 구성하지 않는 한 adminDatabase도 "postgres"가 되지만, 기본적으로 Azure가 제공하는 수준을 벗어납니다.

AKS 비밀 추가

AKS 비밀 및 비밀 키에 익숙하지 않은 사용자에게는 비밀 또는 비밀 데이터를 저장하고 클러스터에서 액세스할 수 있는 편리한 방법입니다. 외부 데이터베이스 지침에서는 아래의 YAML을 사용하여 adminUser 암호를 포함하는 암호를 추가하는 것에 대해 설명합니다.

apiVersion: v1 kind: Secret metadata: name: fmeserversecret type: Opaque data: password: Zm15473ja3M

Safe에서는 base64에서 암호를 수동으로 인코딩해야 한다는 메모를 추가했지만, 데이터 속성 대신 문자열Data를 사용하여 암호를 인코딩하지 않도록 할 수 있습니다.

apiVersion: v1 kind: Secret metadata: name: fmeserversecret type: Opaque stringData: password: Zm15473ja3M

비밀과 키의 이름이 일치하지 않기 때문에 이대로는 작동하지 않을 것입니다. 위와 같이 YAML을 사용하여 비밀을 추가했다면 AKS 클러스터 > 구성 > 비밀에 접속하여 AZure 포털에서 볼 수 있다. 이렇게 생겼을 것입니다.

adminPasswordSecretKey는 비밀의 이름이며, 이 경우 fmeserversecret이며 adminPasswordSecretKey는 "비밀번호"입니다.

"postgresql-password"의 기본 키가 다르므로 혼동되는 기본값에서 벗어나야 합니다.

다음 구성 YAML을 사용해 보겠습니다.

adminUser: postgres@testserverfme adminPasswordSecret: fmeserver-postgresql adminPasswordSecretKey: postgresql-password

이것은 이 비밀 YAML과 일치합니다.

apiVersion: v1 kind: Secret metadata: name: fmeserver-postgresql type: Opaque stringData: postgresql-password: Zm15473ja3M

YAML의 이 부분은 FME가 처음 전개될 때 dbinit 프로세스에 의해 생성될 사용자에 관한 것이다. 기본적으로 이전에 언급한 관리자 자격 증명으로 로그인한 다음 Postgres 사용자를 생성한 다음 해당 사용자에게 권한을 부여하는 데이터베이스를 생성합니다. 이는 대부분의 데이터베이스 연결이 권한 있는 계정을 사용하지 않음을 의미합니다.

name: fmeserver user: fmeserver password: 4fmmsgrz09 passwordSecret: passwordSecretKey: fmeserver-db-password

이름: 속성은 작성될 데이터베이스의 이름입니다. user: 속성은 데이터베이스에 대한 권한으로 생성되는 사용자 계정입니다.

암호 속성을 기본값으로 채우면 이 암호로 권한이 적은 사용자를 만들고 다른 곳에 저장하지 않습니다. 다시 한 번 강조하지만, 기본 암호는 사용하지 마십시오. 조타 장치 배포를 실행하기 전에 위에서 수행한 방법과 유사한 방법으로 이 암호를 만드는 것이 좋습니다.

사용 권한이 적은 사용자에 대한 YAML 값은 다음과 같습니다.

name: fmeserverdb user: fmeserver password: passwordSecret: fmeserver-db-password passwordSecretKey: password

비밀 YAML은 다음과 같습니다.

apiVersion: v1 kind: Secret metadata: name: fmeserver-db-password type: Opaque stringData: password: NonDefaultPassword6

SSL 및 마지막 비트

구성의 마지막 몇 비트를 변경해야 합니다.

ssl: false azure: false

azure 연결 문자열 형식은 azure: true를 설정하여 활성화할 수 있습니다.

Azure Database for Postgres에는 SSL 연결을 강제할 수 있는 옵션이 있습니다. SSL 연결은 제공하는 보안에 그다지 많은 노력을 기울이지 않기 때문입니다. ssl: true를 설정한 다음 Azure에서 적용하면 됩니다.

마지막으로 내부 Postgres 서비스가 배포되지 않도록 해야 합니다. 배포.deployPostgresql: false를 설정하여 헬름 차트에서 배포를 사용하지 않도록 설정하면 이 작업을 수행할 수 있습니다.

디버깅

대부분의 문제는 dbinit 컨테이너와 관련된 것이었고, 이 컨테이너의 로그를 보는 것은 이 모든 문제를 해결하는 데 있어 핵심적인 역할을 했습니다. 여기 Azure CLI와 Kubectl을 사용하여 이를 수행하는 방법이 있습니다.

AKS에 로그인

az aks get-credential --resource-group [yourClusterResourceGroup] --name [yourClusterName]

포드를 실행하려고 할 때 로그를 따를 수 있습니다.

kubectl logs core-0 dbinit -f

백오프 중인 경우 마지막 실행에서 로그를 가져와 다시 시도

kubectl logs core-0 dbinit --previous

pg_hba.conf 이상의 일반적인 연결 오류는 포드가 실행을 시도할 수 있을 만큼 멀리 있는 한 이 로그에 있어야 합니다. 일반적으로 외부 데이터베이스 오류는 여기에 있을 만큼 충분히 늦습니다.

from http://devcloset.tistory.com/395 by ccl(A) rewrite - 2021-09-21 23:26:28