问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

使用sidecar容器部署Azure容器实例

创作时间:
作者:
@小白创作中心

使用sidecar容器部署Azure容器实例

引用
1
来源
1.
https://learn.microsoft.com/zh-cn/training/modules/secure-apps-azure-container-instances-sidecar/4-deploy-sidecar

在Azure容器实例中,如何在不修改原始代码的情况下为应用程序添加HTTPS支持?本文将详细介绍使用sidecar容器模式,通过NGINX实现SSL加密的具体步骤。

在你的客户的当前API中,到应用程序API的流量运行时不加密。你的客户希望应用程序使用HTTPS而不是HTTP。你可以更新应用程序代码以支持HTTPS,但你无权访问原始应用程序。

一种替代方法是使用sidecar容器来增强应用程序,使其具备所需的SSL功能,而无需修改应用程序代码。sidecar模式是基于容器的体系结构中的一个强大概念,可用于将应用程序功能分解为在同一容器组中一起运行的不同容器映像。

在Azure容器实例容器组中,每个容器都可以接管应用程序所需的部分功能。sidecar容器可以使用应用程序容器(甚至不同映像存储库)中的不同容器映像。同一容器组中的容器共享某些属性,例如基础网络堆栈。

注意
容器组的概念相当于Kubernetes中的Pod。

在本单元中,你将部署一个容器组,其中一个容器执行安全套接字层(SSL)加密和解密,另一个容器提供应用程序API功能。要卸载安全套接字层(SSL)功能,请使用开源Web服务器NGINX作为Web应用程序前面的反向代理。加密流量会进入NGINX容器中的Azure容器实例容器组,NGINX会将解密的流量移交给实际的应用程序容器。

下图显示了此拓扑:

创建NGINX配置

首先创建用于数据加密的数字证书,然后创建包含NGINX配置的文件。无需了解配置文件的每个详细信息,但以下方面非常重要:

在Azure门户中的Cloud Shell中,运行以下代码以获取用于数据加密的数字证书。在本单元中,你将使用自签名证书,但在生产环境中,你应使用由证书颁发机构(CA)生成的证书。

# Create self-signed certs
openssl req -new -newkey rsa:2048 -nodes -keyout ssl.key -out ssl.csr -subj "/C=US/ST=WA/L=Redmond/O=AppDev/OU=IT/CN=contoso.com"
openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt

运行以下代码创建NGINX配置文件:

# Create nginx.conf for SSL
nginx_config_file=/tmp/nginx.conf
cat <<EOF > $nginx_config_file
user nginx;
worker_processes auto;
events {
  worker_connections 1024;
}
pid        /var/run/nginx.pid;
http {
    server {
        listen [::]:443 ssl;
        listen 443 ssl;
        server_name localhost;
        ssl_protocols              TLSv1.2;
        ssl_ciphers                ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:AES128:AES256:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK;
        ssl_prefer_server_ciphers  on;
        ssl_session_cache    shared:SSL:10m; # a 1mb cache can hold about 4000 sessions, so you can hold 40000 sessions
        ssl_session_timeout  24h;
        keepalive_timeout 75; # up from 75 secs default
        add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains';
        ssl_certificate      /etc/nginx/ssl.crt;
        ssl_certificate_key  /etc/nginx/ssl.key;
        location / {
            proxy_pass http://127.0.0.1:8080 ;
            proxy_set_header Connection "";
            proxy_set_header Host \$host;
            proxy_set_header X-Real-IP \$remote_addr;
            proxy_set_header X-Forwarded-For \$remote_addr;
            proxy_buffer_size          128k;
            proxy_buffers              4 256k;
            proxy_busy_buffers_size    256k;
        }
    }
}
EOF

运行以下代码收集要以base64编码变量形式传递给NGINX sidecar容器的文件:

# Encode to Base64
nginx_conf=$(cat $nginx_config_file | base64)
ssl_crt=$(cat ssl.crt | base64)
ssl_key=$(cat ssl.key | base64)

使用NGINX sidecar部署容器组

像sidecar这样的复杂配置需要使用YAML而不是Azure CLI。使用YAML定义容器组。

创建一个YAML文件,它通过合并你存储在变量中的所有信息来指定sidecar容器的属性。请注意以下要点:

  • SQL密码作为安全环境变量进行传递,因此在创建容器实例后,它仍保持未公开状态。
  • NGINX容器会将配置卷装载到/etc/nginx/目录中,它需要在其中找到证书。卷内容被指定为机密,这就是你之前对变量进行base64编码的原因。
  • NGINX容器公开端口443,应用程序容器公开端口8080。但是,容器组仅公开端口443,使应用程序只能通过NGINX sidecar容器访问。
# Create YAML
aci_subnet_id=$(az network vnet subnet show -n $aci_subnet_name --vnet-name $vnet_name -g $rg --query id -o tsv)
aci_yaml_file=/tmp/aci_ssl.yaml
cat <<EOF > $aci_yaml_file
apiVersion: '2023-05-01'
location: $location
name: $aci_name
properties:
  subnetIds:
- id: $aci_subnet_id
  containers:
- name: nginx
    properties:
      image: nginx
      ports:
- port: 443
        protocol: TCP
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
      volumeMounts:
- name: nginx-config
        mountPath: /etc/nginx
- name: sqlapi
    properties:
      image: erjosito/yadaapi:1.0
      environmentVariables:
- name: SQL_SERVER_USERNAME
        value: $sql_username
- name: SQL_SERVER_PASSWORD
        secureValue: $sql_password
- name: SQL_SERVER_FQDN
        value: $sql_server_fqdn
      ports:
- port: 8080
        protocol: TCP
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1
  volumes:
- secret:
      ssl.crt: "$ssl_crt"
      ssl.key: "$ssl_key"
      nginx.conf: "$nginx_conf"
    name: nginx-config
  ipAddress:
    ports:
- port: 443
      protocol: TCP
    type: Private
  osType: Linux
tags: null
type: Microsoft.ContainerInstance/containerGroups
EOF

使用所有必需配置创建YAML文件后,请运行以下Azure CLI命令创建容器实例:

# Deploy ACI
az container create -g $rg --file $aci_yaml_file

要测试配置,请提取容器实例的专用IP地址,并从测试VM通过HTTPS访问它。通过curl使用标志-k,这样它会禁用证书验证,因为此单元使用自签名证书。添加的curl标志-s用于减少curl的输出详细程度。

# Test
aci_ip=$(az container show -n $aci_name -g $rg --query 'ipAddress.ip' -o tsv) && echo $aci_ip
ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "curl -ks https://$aci_ip/api/healthcheck"

API的api/healthcheck终结点应返回OK作为响应。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号