9.6. HTTP/2 리스너를 사용하여 TLS 종료 로드 밸런서 생성
TLS 종료 HTTPS 로드 밸런서를 사용하면 CPU 집약적인 암호화 작업을 로드 밸런서에 오프로드하고 로드 밸런서에서 계층 7 검사와 같은 고급 기능을 사용하도록 허용합니다. HTTP/2 리스너를 추가하면 HTTP/2 프로토콜을 활용하여 페이지를 더 빠르게 로드하여 성능을 향상시킬 수 있습니다. 로드 밸런서는 ALPN(Application-Layer Protocol Negotiation) TLS 확장을 사용하여 HTTP/2를 클라이언트와 협상합니다.
로드 밸런싱 서비스(octavia)는 엔드 투 엔드 HTTP/2 트래픽을 지원하므로 요청이 로드 밸런서에서 응답이 반환될 때까지 요청이 리스너에 도달하는 지점에서 HAProxy에서 HTTP2 트래픽을 번역하지 않습니다. 엔드 투 엔드 HTTP/2 트래픽을 달성하려면 백엔드 재암호화가 있는 HTTP 풀: HTTPS 트래픽을 위해 구성된 보안 포트 및 웹 애플리케이션에서 수신 대기하는 풀 멤버가 있어야 합니다.
백엔드 재암호화 없이 HTTP/2 트래픽을 HTTP 풀로 보낼 수 있습니다. 이 경우 HAProxy는 풀에 도달하기 전에 트래픽을 변환하고, 응답이 로드 밸런서에서 반환되기 전에 HTTP/2로 다시 변환됩니다.
백엔드 멤버를 계속 사용할 수 있도록 상태 모니터를 생성하는 것이 좋습니다.
현재 로드 밸런싱 서비스는 HTTP/2 리스너를 사용하는 TLS 종료 로드 밸런서에 대한 상태 모니터링을 지원하지 않습니다.
사전 요구 사항
TLS 공개 키 암호화는 다음과 같은 특성으로 구성됩니다.
-
TLS 인증서, 키 및 중간 인증서 체인은 로드 밸런서 VIP 주소에 할당된 DNS 이름의 외부 CA(인증 기관)에서 가져옵니다(예:
www.example.com). - 인증서, 키 및 중간 인증서 체인은 현재 디렉터리에 별도의 파일에 있습니다.
- 키와 인증서는 PEM으로 인코딩됩니다.
- 중간 인증서 체인에는 PEM 인코딩 및 연결된 여러 인증서가 포함되어 있습니다.
-
TLS 인증서, 키 및 중간 인증서 체인은 로드 밸런서 VIP 주소에 할당된 DNS 이름의 외부 CA(인증 기관)에서 가져옵니다(예:
- 키 관리자 서비스(barbican)를 사용하도록 로드 밸런싱 서비스(octavia)를 구성해야 합니다. 자세한 내용은 키 관리자 서비스 가이드를 사용하여 시크릿 관리를 참조하십시오.
절차
키(
server.key), 인증서(server.crt) 및 중간 인증서 체인(ca-chain.crt)을 단일 PKCS12 파일(server.p12)로 결합합니다.참고controlPlane 내부의 값은 이 절차의 예제 명령에 사용되는 샘플 값입니다. 이러한 샘플 값을 사이트에 적합한 값으로 바꿉니다.
중요PKCS12 파일을 생성할 때 암호를 사용하지 마십시오.
- 예제
이 예에서는 PKCS12 파일이 암호 없이 생성됩니다.
$ openssl pkcs12 -export -inkey server.key -in server.crt \ -certfile ca-chain.crt -passout pass: -out server.p12
자격 증명 파일을 가져옵니다.
- 예제
$ source ~/overcloudrc
Key Manager 서비스를 사용하여 PKCS12 파일의 시크릿 리소스(
tls_secret1)를 생성합니다.- 예제
$ openstack secret store --name='tls_secret1' \ -t 'application/octet-stream' -e 'base64' \ --payload="$(base64 < server.p12)"
공용 서브넷(
public_subnet)에 로드 밸런서(lb1)를 만듭니다.- 예제
$ openstack loadbalancer create --name lb1 --vip-subnet-id \ public_subnet --wait
TERMINATED_HTTPS리스너(listener1)를 생성하고 다음을 수행합니다.-
시크릿 리소스(
tls_secret1)를 리스너의 기본 TLS 컨테이너로 참조합니다. -
ALPN 프로토콜(
h2)을 설정합니다. 클라이언트가 HTTP/2(
http/1.1)를 지원하지 않는 경우 대체 프로토콜을 설정합니다.- 예제
$ openstack loadbalancer listener create --name listener1 \ --protocol-port 443 --protocol TERMINATED_HTTPS --alpn-protocol h2 \ --alpn-protocol http/1.1 --default-tls-container=\ $(openstack secret list | awk '/ tls_secret1 / {print $2}') lb1 --wait
-
시크릿 리소스(
풀(
pool1)을 만들고 리스너의 기본 풀로 설정합니다.- 예제
이 예제의 명령은 TCP 포트 80에서 웹 애플리케이션으로 구성된 HTTP 애플리케이션을 호스팅하는 백엔드 서버를 포함하는 HTTP 풀을 생성합니다.
$ openstack loadbalancer pool create --name pool1 \ --lb-algorithm ROUND_ROBIN --listener listener1 --protocol HTTP --wait
백엔드 서버에 연결하는 풀(
pool1)에 상태 모니터(healthmon1) 유형을 만듭니다.상태 점검이 권장되지만 필수는 아닙니다. 상태 모니터가 정의되지 않은 경우 멤버 서버는
ONLINE으로 간주됩니다.- 예제
$ openstack loadbalancer healthmonitor create --name healthmon1 \ --delay 15 --max-retries 4 --timeout 10 --type TCP pool1 --wait
프라이빗 서브넷(
private_subnet)의 HTTP 백엔드 서버(를 풀에 추가합니다.192.0.2.10및 192.0.2.11)- 예제
이 예에서 백엔드 서버
192.0.2.10및192.0.2.11은 각각member1및member2로 이름이 지정됩니다.$ openstack loadbalancer member create --name member1 --subnet-id \ private_subnet --address 192.0.2.10 --protocol-port 80 pool1 --wait $ openstack loadbalancer member create --name member2 --subnet-id \ private_subnet --address 192.0.2.11 --protocol-port 80 pool1 --wait
검증
로드 밸런서(
lb1) 설정을 보고 확인합니다.- 예제
$ openstack loadbalancer status show lb1- 샘플 출력
{ "loadbalancer": { "id": "936dad29-4c3f-4f24-84a8-c0e6f10ed810", "name": "lb1", "operating_status": "ONLINE", "provisioning_status": "ACTIVE", "listeners": [ { "id": "708b82c6-8a6b-4ec1-ae53-e619769821d4", "name": "listener1", "operating_status": "ONLINE", "provisioning_status": "ACTIVE", "pools": [ { "id": "5ad7c678-23af-4422-8edb-ac3880bd888b", "name": "pool1", "provisioning_status": "ACTIVE", "operating_status": "ONLINE", "health_monitor": { "id": "4ad786ef-6661-4e31-a325-eca07b2b3dd1", "name": "healthmon1", "type": "TCP", "provisioning_status": "ACTIVE", "operating_status": "ONLINE" }, "members": [ { "id": "facca0d3-61a7-4b46-85e8-da6994883647", "name": "member1", "operating_status": "ONLINE", "provisioning_status": "ACTIVE", "address": "192.0.2.10", "protocol_port": 80 }, { "id": "2b0d9e0b-8e0c-48b8-aa57-90b2fde2eae2", "name": "member2", "operating_status": "ONLINE", "provisioning_status": "ACTIVE", "address": "192.0.2.11", "protocol_port": 80 } ...
상태 모니터가 존재하고 제대로 작동하는 경우 각 멤버의 상태를 확인할 수 있습니다.
- 예제
$ openstack loadbalancer member show pool1 member1- 샘플 출력
작업 멤버(
member1)에는operating_status에 대한ONLINE값이 있습니다.+---------------------+--------------------------------------+ | Field | Value | +---------------------+--------------------------------------+ | address | 192.0.2.10 | | admin_state_up | True | | created_at | 2023-11-16T20:08:01 | | id | facca0d3-61a7-4b46-85e8-da6994883647 | | name | member1 | | operating_status | ONLINE | | project_id | 9b29c91f67314bd09eda9018616851cf | | protocol_port | 80 | | provisioning_status | ACTIVE | | subnet_id | 3b459c95-64d2-4cfa-b348-01aacc4b3fa9 | | updated_at | 2023-11-16T20:08:42 | | weight | 1 | | monitor_port | None | | monitor_address | None | | backup | False | | tags | | +---------------------+--------------------------------------+