Azure

Azure Container Instances でHAProxyをサイドカーで実装する

はじめに

Azure Container InstancesでHAProxyをサイドカーとして実装する手順を説明します。

HAProxyをサイドカーして実装すると以下のような機能をContainer Instancesに実装することが可能です。

  • リバースプロキシ
  • ロードバランシング
  • SSLオフロード
  • ヘッダー書き換え
  • HTTP圧縮
  • ロギング
  • トラフィック制御

などなどHAProxyの機能に準じます。

本稿ではリバースプロキシ、SSLオフロード機能を実装し、Container InstancesのHello Worldを表示します。

手順は大きく以下のようになります。

  • HAProxyのイメージ作成
  • デプロイ

HAProxyはvolumeMountsで /usr/local/etc/haproxy をマウントできないのバグなのか仕様なのか不明ですが現状はConfigを含んだイメージを作成する必要があります。

やり方しってたら教えてください。

下記を参考した応用になります。

サイドカー コンテナーで TLS を有効にする - Azure Container Instances | Microsoft Learn
サイドカー コンテナーで TLS を有効にする - Azure Container Instances | Microsoft Learn

サイドカー コンテナーで Nginx を実行することで、Azure Container Instances 内で実行されるコンテナー グループに対して SSL または TLS エンドポイントを作成しま ...

learn.microsoft.com

 

HAProxyを単体で実装したい場合には下記を参考にしてください。ただしこれは仮想ネットワークを利用しているため外部からのアクセスを利用できません。

リバースプロキシとしてAzure Container InstancesにHaproxyを導入してみる - 技術的な何か。
リバースプロキシとしてAzure Container InstancesにHaproxyを導入してみる - 技術的な何か。

はじめに インターナルのLoad Balancer の代わりにHaproxyを導入したい、だけれども仮想マシンのメンテナンスしたくないので他に方法はないのかということでAzure Container

level69.net

 

HAProxyイメージの作成

HAProxyのイメージを作成します。/usr/local/etc/haproxy/pem/haproxy.pemに自己証明書を配置します。

バックエンドは127.0.0.1を指定します。

haproxy.cfg

defaults
  mode http
  timeout client 10s
  timeout connect 5s
  timeout server 10s
  timeout http-request 10s

frontend myfrontend
  bind *:443 ssl crt /usr/local/etc/haproxy/pem/haproxy.pem
  option forwardfor
  default_backend myservers

backend myservers
  server server1 127.0.0.1:80

Dockerfileを作成します。ここではバージョンに注意する必要があります。2.3以外だと動作を確認できませんでした。latestでは起動できませんでした。

FROM haproxy:2.3
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg

 

ビルドします。

docker build -t haproxysample4 .

タグとつけます。

docker tag 7d1c749ada91 jkudo/haproxysample4

Pushします。

docker push jkudo/haproxysample4

以上でイメージの作成は完了です。

Container Instances へのデプロイ

ACIへのデプロイはAzure CLIでyamlを利用したデプロイです。

自己署名証明書を作成し、Base64でエンコードする必要があります。エンコードしたものをyamlに書き込みContainer内に配置しましす。

openssl req -new -newkey rsa:2048 -nodes -keyout ssl.key -out ssl.csr
openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt
cat ssl.crt ssl.key > ssl.pem

base64にエンコードします。

cat ssl.pem | base64 > base64-ssl.pem

改行が邪魔なのでsedで改行削除します。

sed -z 's/\n//g' base64-ssl.pem

出力された文字列を控えておきます。yaml内に書き込みます。 yamlを作成します。

deploy-aci.yaml

api-version: 2019-12-01
location: eastus
name: app-with-ssl
properties:
  containers:
  - name: haproxy
    properties:
      image: jkudo/haproxysample4:latest
      ports:
      - port: 443
        protocol: TCP
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
      volumeMounts:
      - name: haproxy-config
        mountPath: /usr/local/etc/haproxy/pem
  - name: my-app
    properties:
      image: mcr.microsoft.com/azuredocs/aci-helloworld
      ports:
      - port: 80
        protocol: TCP
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
  volumes:
  - secret:
      haproxy.pem: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFVENDQWZrQ0ZFb2tFaXNmdFo2Z3lPZER5RXdPTUV4NGlENHlNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1FVXgKQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbApjbTVsZENCWGFXUm5hWFJ6SUZCMGVTQk1kR1F3SGhjTk1qTXdNakEwTVRFME56RTFXaGNOTWpRd01qQTBNVEUwCk56RTFXakJGTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHQTFVRUNBd0tVMjl0WlMxVGRHRjBaVEVoTUI4R0ExVUUKQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwY3lCUWRIa2dUSFJrTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQwpBUThBTUlJQkNnS0NBUUVBd3h6VGhVK24rZm11dkRTakdxZEl6TjFVY1plT2lHTUZpcWw1VXJVcWRwYmNuOEI2CkUrSm5qdDZ0b1JYZGJZbUdwWGlrcTJCZlptUkVuN3g5ek5ya0NNcTdybFh5ZXluQk92NHlCZnFSMmdMK0VHTGUKaFBUVDR3WWQxWGNEM2tMS0RLY1lNanBFVmkyak5tV1M5VWxBVFRiTE5IUEs4V3Y1V0FBMzVUazRCNVlsVDE0dgpDREJiV04vaGhuenZUMkVaeFhhclE4RXFtTG5jdW9QREsxZkNtWU90K2Q1S0dmREdOUklQck9aRUlHNTRVTDVaCmUxTUpvMnljd2VCakxHaW9jKzR4bkRZbk5DMTlhZDc1SXRBby9JQm5PU1ZoemVpSVZkUjVSOW5xaXMzSDNaSWQKQTVlOTRnN0JlSTIxRlBQb0Urd1dCa3dFWWhZMlR5alZtemtrYndJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQ3dVQQpBNElCQVFCd1dqL2h6N1FmRmZtMEdWZGhVQzZHREFvc0JXYTRYU1JJSzQ3YkRYUFhCbW0xemJxdEFqdi9jQWVTCm1tUFZ0OEJqV2lIcklxNDRWT1V2bmRwUjJPUHlWZ013TFdRU2xXZXU5UDhYd1FOY2NGcW85OVNFN3ZRd1BmTG0Kb2lsZ2lnQzFYMVo0YnI3TFgxM2xqSDRXeXh5clJzTi8wREU4QUdZaUJhckhIaWpzZS91RHN3czl3aHBDOFkwbwpWUm5nM0NoSXpuWlVhU0FXbE9ySDBlOURiNHpJWlZxTzFmdzZEM08rb3FjZXJuWVdqVkJUN0llSDZtNFNTUWlyCk52Zzl2bk1kYUZwMm9NVFJQcXBDdGVpclZvU2FUZFhKNmRqOW8vbFhTYkpERkwvQmF1Smg0dmpxOHRZd2FTWkkKcE0ya1J6aEhYZVdwTjMzdWVHcUg3U0ZuZDVBRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLQpNSUlFdlFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLY3dnZ1NqQWdFQUFvSUJBUURESE5PRlQ2ZjUrYTY4Ck5LTWFwMGpNM1ZSeGw0NklZd1dLcVhsU3RTcDJsdHlmd0hvVDRtZU8zcTJoRmQxdGlZYWxlS1NyWUY5bVpFU2YKdkgzTTJ1UUl5cnV1VmZKN0tjRTYvaklGK3BIYUF2NFFZdDZFOU5QakJoM1Zkd1BlUXNvTXB4Z3lPa1JXTGFNMgpaWkwxU1VCTk5zczBjOHJ4YS9sWUFEZmxPVGdIbGlWUFhpOElNRnRZMytHR2ZPOVBZUm5GZHF0RHdTcVl1ZHk2Cmc4TXJWOEtaZzYzNTNrb1o4TVkxRWcrczVrUWdibmhRdmxsN1V3bWpiSnpCNEdNc2FLaHo3akdjTmljMExYMXAKM3ZraTBDajhnR2M1SldITjZJaFYxSGxIMmVxS3pjZmRraDBEbDczaURzRjRqYlVVOCtnVDdCWUdUQVJpRmpaUApLTldiT1NSdkFnTUJBQUVDZ2dFQVlHS0NIMjROUmhEUkFBcGt0SXNGREtjZHl3dWFqc2VUK2o3a1B6WmQ1cjE1CitiVUUyWVBUc3FGUVZxNU5kNG9qcU9TalBFSGNmdUZ6Z1JHRmQ4aCtNOVdxeDJHUDZzWGl2ZmpLejJkTDI4MzAKb2pXbFJUc0kzVEt0VkVGNStMYzN4dTVZcHA5Z0dNNXN2VGVLVkgrK015YXBWWjBLR1I5RXl2TTRxWlVObDdqMgpvOVl5NlRmeGpUY3lpMzdoTmRpZERvWDVYT1lSMGZWY0ZlM2ptT0lLWDhFMERNYkMrbDV6Snp5UzBKbVVia3pXCmgwNisxckh6dmFTdkJJZXFVTGg3TGpwekhGempieW1kaVdpbi8wR2pHYnQ3MzRCcVNMR0ZseEhtdVlQVXZyNDUKZ3gyTG4vUDJ1K09ySDhITVhMYUNBU1V3eDdFVnB5ci9JZ3VON2JXcXdRS0JnUUQvaGIvaytUNkpkRTFOSlNtSgpYa0VORlBGS0ZmbWVGajBzZm9kSTVMMzVHeTkvQzhrQlA1ckVCOFJ5NzlMRDBsV2JaMHZSTlFPb0pTekljdVNuCjV4S3Myb1Awdjd4dFBodEFNbXFOUWlxQ01pTEQ5cjEwK0x1MXJkdWxNVHRxTUtRZnBuQzRJS1gzM3REQ3oxenEKd242eWRXdUNvZmFXSWNqcFB4cjRBbDUzendLQmdRRERlaXl4eXBwSGs1Um9lU0dqd1hZTzlUWTRYTGJKbkFhKwpBN2ZFUWpVRm1VZkhPNzRacVM0N0FHWktaL0ZUVURMRzBWSG56cjZ5WlhUYnpaRUQ3YVVtM3RvcjJxSVNQUUh2Cnc1cFZlQVVsUmZmMzVFaGNXVmtGeTgzY2s5bmtMWUtlMmJKb3BYM3E3TjUvYmJKSHFFRGppekxyRytORkRVMXEKMFZQbXJqY1JZUUtCZ1FDL1pLNmMwdmk5dXFpZ0xVTFVpdzRNdjNBUXZ5OE84N2QwbVgyNTR1Uk5MOGkrejlRSwpwRnJIbE0zWURiMEFRbzh1N1F1RU04Sitjd0g5VHRub3poTlYrQU01RTFrUE5xTHd6aEt6cGlqekJweTF6aDZRCi9ES1YzaGtVdmpDejFLVktzNy9nbTB2VncwYjVkSnN6bU9XUHhKWDM3bHNtanozUFFCNXlRRXdFVHdLQmdCRFkKcHFGcjVIL21xQk9ZM04xUC91eXJGVkVtTEZxVHA4RVljTzNwQnNqRXZQcmVtek42OFJFRXA4d2h5UnAwL3V0RApmdHVMWmNQYUdvZ1czemlIY29RM0VIWlhFVUNoSVZtWWNlU0x3MlhDOGV2Yk1LRkUwZmM5NlMvcFRnM3NIaVd5CmZUMm5oWUtKaDJOVUFObE1Gc3VGWTQzL2lVYWFMdUhWeUhWSTdsWUJBb0dBYVRCMVpBR1k2dnRSczljOTJFcXIKSVZGWHo2TWozd1pvYlNUQXExYXhXRVZKMjZFZGk1Z2pVenJ6T1JWWGV2RXVlcUVFNm14ek5FVlVmdkxzSHk4WQpEUE1tR1A0MTB0azJCU1VIekMrMzIrejlIdkxHZHZRamdWcGNLd05jSXFDNnNoRS9jRWxBaFdyRGZ4NFlXZUxuCnJUb2V3VzE5VGx6d1NQZTNCYUhYYlNRPQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg==
    name: haproxy-config
  ipAddress:
    ports:
    - port: 443
      protocol: TCP
    type: Public
  osType: Linux
tags: null
type: Microsoft.ContainerInstance/containerGroups

 

デプロイします。

az container create --resource-group app-with-ssl --file deploy-aci.yaml

 

あとはアクセスします。自己署名証明書なので警告になっていますが、問題なくSSLでつながっていることがわかります。

 

まとめ

HAProxyをサイドカーとして実装することで、ACI内部での取り回しが楽になるのではないでしょうか。

-Azure
-,