API de servicio de red de proceso de host (HCN) para máquinas virtuales y contenedores

Se aplica a: Windows Server 2022, Windows Server 2019

La API de servicio de red de proceso de host (HCN) es una API de Win32 orientada al público que proporciona acceso de nivel de plataforma para administrar redes virtuales, puntos de conexión de red virtual y directivas asociadas. Esto proporciona conectividad y seguridad para máquinas virtuales (VM) y contenedores que se ejecutan en un host de Windows.

Los desarrolladores usan la API de servicio HCN para administrar las redes de las máquinas virtuales y los contenedores en sus flujos de trabajo de aplicación. La API de HCN se ha diseñado para proporcionar la mejor experiencia para los desarrolladores. Los usuarios finales no interactúan directamente con estas API.

Características de la API del servicio HCN

  • Se implementa como API de C hospedada por el servicio de red de host (HNS) en OnCore/VM.

  • Proporciona la capacidad de crear, modificar, eliminar y enumerar objetos HCN, como redes, puntos de conexión, espacios de nombres y directivas. Las operaciones se realizan en identificadores para los objetos (por ejemplo, un identificador de red) e, internamente, estos identificadores se implementan mediante identificadores de contexto RPC.

  • Basado en esquemas. La mayoría de las funciones de la API definen los parámetros de entrada y salida como cadenas que contienen los argumentos de la llamada de función como documentos JSON. Los documentos JSON se basan en esquemas fuertemente tipados y versionados, estos esquemas forman parte de la documentación pública.

  • Se proporciona una API de suscripción o devolución de llamada para permitir que los clientes se registren para recibir notificaciones de eventos en todo el servicio, como las creaciones y eliminaciones de red.

  • LA API de HCN funciona en aplicaciones de Puente de dispositivo de escritorio (p.ej., Centennial) que se ejecutan en servicios del sistema. La API comprueba la ACL recuperando el token de usuario del autor de la llamada.

Sugerencia

La API del servicio HCN se admite en tareas en segundo plano y ventanas que no son de primer plano.

Terminología: host frente a proceso

El servicio de proceso de host permite a los autores de llamadas crear y administrar máquinas virtuales y contenedores en un único equipo físico. Se denomina para seguir la terminología del sector.

  • Host se usa ampliamente en el sector de la virtualización para hacer referencia al sistema operativo que proporciona recursos virtualizados.

  • Proceso se usa para hacer referencia a los métodos de virtualización que son más amplios que solo las máquinas virtuales. El servicio de red de proceso de host permite a los autores de llamadas crear y administrar redes para máquinas virtuales y contenedores en un único equipo físico.

Documentos de configuración basados en esquemas

Los documentos de configuración basados en esquemas bien definidos son un estándar del sector establecido en el espacio de virtualización. La mayoría de las soluciones de virtualización, como Docker y Kubernetes, proporcionan API basadas en documentos de configuración. Varias iniciativas del sector, con la participación de Microsoft, impulsan un ecosistema para definir y validar estos esquemas, como OpenAPI. Estas iniciativas también impulsan la estandarización de definiciones de esquema específicas para los esquemas usados para contenedores, como Open Container Initiative (OCI).

El lenguaje que se usa para crear documentos de configuración es JSON, que se usa en combinación con:

  • Definiciones de esquema que definen un modelo de objetos para el documento
  • Validación de si un documento JSON se ajusta a un esquema
  • Conversión automatizada de documentos JSON a y desde representaciones nativas de estos esquemas en los lenguajes de programación usados por los autores de llamadas de las API

Las definiciones de esquema usadas con frecuencia son OpenAPI y esquema JSON, lo que le permite especificar las definiciones detalladas de las propiedades de un documento, por ejemplo:

  • Conjunto válido de valores para una propiedad, como 0-100 para una propiedad que representa un porcentaje.
  • Definición de enumeraciones, que se representan como un conjunto de cadenas válidas para una propiedad.
  • Expresión regular para el formato esperado de una cadena.

Como parte de la documentación de las API de HCN, estamos planeando publicar el esquema de nuestros documentos JSON como una especificación de OpenAPI. En función de esta especificación, las representaciones específicas del lenguaje del esquema pueden permitir el uso seguro de tipos de los objetos de esquema en el lenguaje de programación utilizado por el cliente.

Ejemplo

A continuación se muestra un ejemplo de este flujo de trabajo para el objeto que representa un controlador SCSI en el documento de configuración de una máquina virtual.

enum IpamType
{
    [NewIn("2.0")] Static,
    [NewIn("2.0")] Dhcp,
};
class Ipam
{
    // Type : dhcp
    [NewIn("2.0"),OmitEmpty] IpamType   Type;
    [NewIn("2.0"),OmitEmpty] Subnet     Subnets[];
};
class Subnet : HCN.Schema.Common.Base
{
    [NewIn("2.0"),OmitEmpty] string         IpAddressPrefix;
    [NewIn("2.0"),OmitEmpty] SubnetPolicy   Policies[];
    [NewIn("2.0"),OmitEmpty] Route          Routes[];
};
enum SubnetPolicyType
{
    [NewIn("2.0")] VLAN
};
class SubnetPolicy
{
    [NewIn("2.0"),OmitEmpty] SubnetPolicyType                 Type;
    [NewIn("2.0"),OmitEmpty] HCN.Schema.Common.PolicySettings Data;
};
class PolicySettings
{
    [NewIn("2.0"),OmitEmpty]  string      Name;
};
class VlanPolicy : HCN.Schema.Common.PolicySettings
{
    [NewIn("2.0")] uint32 IsolationId;
};
class Route
{
    [NewIn("2.0"),OmitEmpty] string NextHop;
    [NewIn("2.0"),OmitEmpty] string DestinationPrefix;
    [NewIn("2.0"),OmitEmpty] uint16 Metric;
};

Sugerencia

Las anotaciones [NewIn("2.0") forman parte de la compatibilidad de control de versiones con las definiciones de esquema. A partir de esta definición interna, se generan las especificaciones de OpenAPI para el esquema:

{
    "swagger" : "2.0",
    "info" : {
       "version" : "2.1",
       "title" : "HCN API"
    },
    "definitions": {
        "Ipam": {
            "type": "object",
            "properties": {
                "Type": {
                    "type": "string",
                    "enum": [
                        "Static",
                        "Dhcp"
                    ],
                    "description": " Type : dhcp"
                },
                "Subnets": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/Subnet"
                    }
                }
            }
        },
        "Subnet": {
            "type": "object",
            "properties": {
                "ID": {
                    "type": "string",
                    "pattern": "^[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}$"
                },
                "IpAddressPrefix": {
                    "type": "string"
                },
                "Policies": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/SubnetPolicy"
                    }
                },
                "Routes": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/Route"
                    }
                }
            }
        },
        "SubnetPolicy": {
            "type": "object",
            "properties": {
                "Type": {
                    "type": "string",
                    "enum": [
                        "VLAN",
                        "VSID"
                    ]
                },
                "Data": {
                    "$ref": "#/definitions/PolicySettings"
                }
            }
        },
        "PolicySettings": {
            "type": "object",
            "properties": {
                "Name": {
                    "type": "string"
                }
            }
        },
        "VlanPolicy": {
            "type": "object",
            "properties": {
                "Name": {
                    "type": "string"
                },
                "IsolationId": {
                    "type": "integer",
                    "format": "uint32"
                }
            }
        },
        "Route": {
            "type": "object",
            "properties": {
                "NextHop": {
                    "type": "string"
                },
                "DestinationPrefix": {
                    "type": "string"
                },
                "Metric": {
                    "type": "integer",
                    "format": "uint16"
                }
            }
        }
    }
}

Puede utilizar herramientas, como Swagger, para generar representaciones específicas del lenguaje de programación del esquema utilizado por un cliente. Swagger admite una variedad de lenguajes como C#, Go, Javascript y Python).

  • Ejemplo de código de C# generado para el objeto IPAM y subred de nivel superior

  • Ejemplo de código de Go generado para el objeto IPAM y subred de nivel superior. Docker y Kubernetes usan Go, que son dos de los consumidores de las API del servicio de red de proceso de host. Go tiene compatibilidad integrada para serializar tipos de Go hacia y desde documentos JSON.

Además de la generación y validación de código, puede usar herramientas para simplificar el trabajo con documentos JSON, es decir, Visual Studio Code.

Objetos de nivel superior definidos en el esquema HCN

Los objetos de nivel superior son:

class HostComputeNetwork : HCN.Schema.Common.Base
{
    [NewIn("2.0"),OmitEmpty] HCN.Schema.Network.NetworkMode          Type;
    [NewIn("2.0"),OmitEmpty] HCN.Schema.Network.NetworkPolicy        Policies[];
    [NewIn("2.0"),OmitEmpty] HCN.Schema.Network.MacPool              MacPool;
    [NewIn("2.0"),OmitEmpty] HCN.Schema.Network.DNS                  Dns;
    [NewIn("2.0"),OmitEmpty] HCN.Schema.Network.Ipam                 Ipams[];
};
class HostComputeEndpoint : HCN.Schema.Common.Base
{
    [NewIn("2.0"),OmitEmpty] string                                     HostComputeNetwork;
    [NewIn("2.0"),OmitEmpty] HCN.Schema.Network.Endpoint.EndpointPolicy Policies[];
    [NewIn("2.0"),OmitEmpty] HCN.Schema.Network.Endpoint.IpConfig       IpConfigurations[];
    [NewIn("2.0"),OmitEmpty] HCN.Schema.Network.DNS                     Dns;
    [NewIn("2.0"),OmitEmpty] HCN.Schema.Network.Route                   Routes[];
    [NewIn("2.0"),OmitEmpty] string                                     MacAddress;
};
class HostComputeNamespace : HCN.Schema.Common.Base
{
    [NewIn("2.0"),OmitEmpty] uint32                                    NamespaceId;
    [NewIn("2.0"),OmitEmpty] Guid                                      NamespaceGuid;
    [NewIn("2.0"),OmitEmpty] HCN.Schema.Namespace.NamespaceType        Type;
    [NewIn("2.0"),OmitEmpty] HCN.Schema.Namespace.NamespaceResource    Resources[];
};
class HostComputeLoadBalancer : HCN.Schema.Common.Base
{
    [NewIn("2.0"), OmitEmpty] string                                               HostComputeEndpoints[];
    [NewIn("2.0"), OmitEmpty] string                                               VirtualIPs[];
    [NewIn("2.0"), OmitEmpty] HCN.Schema.Network.Endpoint.Policy.PortMappingPolicy PortMappings[];
    [NewIn("2.0"), OmitEmpty] HCN.Schema.LoadBalancer.LoadBalancerPolicy           Policies[];
};

Pasos siguientes