Oracle 身份云服务

深入剖析系列:利用 Docker 和 Windows 容器实现 AD Bridge 高可用性配置

作者:Ricardo Gutierrez

2017 年 10 月

概述

在本系列的上一篇文章中,我们介绍了 Oracle 身份云服务 (IDCS),并介绍了实现多租户供应、使用自定义应用模板实现联合一次性登录以及使用 Salesforce 和 ServiceNow 应用实现即时供应的方法。我们还介绍了一种集成 Oracle Identity Manager (OIM) 的混合方案以及集成这两种解决方案的固有协同效应。在本文中,我们将继续探讨混合方案,这次重点介绍与 Microsoft Active Directory 这个存在于大多数组织中的内部部署基础设施的集成。

与 Microsoft Active Directory 集成

逐步向云迁移的组织通常需要能够利用现有基础设施;例如,需要与 Active Directory (AD) 之类的企业目录集成。Microsoft Active Directory Bridge (AD Bridge) 是一个可以内部部署的 IDCS 组件,通过允许组织将 AD 身份与 IDCS 身份存储同步来促进与 AD 的集成。

此类集成将为您带来以下好处:

  • 便于将现有 AD 身份导入 IDCS
  • 与联合结合使用,为用户迁移到云提供一条无缝路径,因为他们在访问云端和内部部署的应用的同时可以继续使用现有的 AD 凭证
  • 自动同步 AD 用户和组与 IDCS

图 1 描述了一个典型部署方案,其中使用 AD Bridge 代理促进与内部部署 AD 的集成。

gutierrez-idcs-docker-fig01

图 1.IDCS 与 Active Directory 集成

AD Bridge 代理

AD Bridge 代理是一个使用 .NET Framework 构建的 IDCS 组件,作为 Windows 服务部署在 AD 域的计算机成员中。如上所述,其主要任务是将 AD 用户身份和组与 IDCS 身份存储同步。

AD Bridge 代理可从 IDCS 租户服务下载,并使用图形模式 (GUI) 或静默安装进行安装。AD Bridge 代理目前具有以下特性:

  • 计划或按需同步
  • 可配置的待同步属性映射列表
  • 支持多个域,每个域至少需要一个 AD Bridge 实例
  • 集中配置模式;一旦 AD Bridge 代理部署在目标计算机上,即可通过 IDCS 控制台完成其配置和管理
  • 同步来自一个或多个组织单位 (OU) 的用户和组

关于 Docker Swarm 和 Windows 容器

Swarm 是 Docker 引擎(自 1.12 版起)中内嵌的原生集群系统;它提供了具备容错和自我修复功能的分散架构。Swarm 中的节点是在物理或虚拟机中运行的 Docker 实例。服务的概念是指节点中执行的任务定义;例如,数据库、应用或 Web 服务器。一个任务含有一个 Docker 容器和要在容器中运行的命令,因此可以假设,每次创建一个服务时,就在 Swarm 中的一个或多个节点上部署一个或多个容器。

Docker Swarm 中存在两种类型的节点:管理节点和工作节点。管理节点将任务分派给工作节点,并执行维持 Swarm 的期望状态所需的编排和管理功能。工作节点接收和执行管理节点分派的任务。

Docker 建议部署奇数个节点;例如,一个三管理节点的 Swarm 至多容许损失一个管理节点,而一个五管理节点的 Swarm 容许同时损失两个管理节点。Docker 推荐的一个 Swarm 中能拥有的最大管理节点数是七。

包含一个管理节点的 Swarm 仍然可以通过工作节点和服务提供高可用性功能,但没有容错功能(也就是说,如果管理节点故障,服务将继续正常工作,但失去该管理节点就需要新建一个 Swarm 才能恢复)。

图 2 中的示意图介绍了由至少一个管理节点和一个或多个工作节点组成的 Docker Swarm 的概念。

gutierrez-idcs-docker-fig02

图 2.Docker Swarm — 概念视图

Windows 容器

Windows 容器是 Microsoft 的原生容器技术(在 Windows Server 2016 和 Windows 10 中可用),有助于将 Docker 引擎与 Docker 客户端(如 Composer、Swarm 和其他工具)一起移植到 Windows 上。根据隔离级别,有两种 Windows 容器类型:

  • Windows Server 容器(Windows Server 2016 中的默认容器技术)共享 Windows 内核,提供标准隔离和快速启动。
  • Hyper-V 容器 拥有自己的 Windows 内核副本(提供更高的隔离和安全性),托管 Windows 服务器容器,是 Windows 10 中的默认容器技术。请注意,Hyper-V 容器不是 VM:它们是专门针对容器实例化的精简版 Hyper-V VM。

目前,可以在 Windows 容器中部署两种 Windows 操作系统映像:

  • Windows Server Core,Windows Server 紧凑版(无 GUI),可运行大多数 Windows Server 应用(如 IIS、SQL Server 和兼容的 .NET Framework 应用)
  • Nano Server,Windows Server 极简版,可以基于新的 .NET Core 框架运行 IIS 和应用。图 3 中的示意图描述了 Windows 容器的概念和 Windows Server 2016 中提供的 Docker 引擎。
gutierrez-idcs-docker-fig03

图 3.Windows Server 容器和 Hyper-V 容器

利用 Docker 和 Windows 容器实现高可用性的方法

本节将演示如何利用 Docker Swarm 和 Windows 容器实现 AD Bridge 代理的高可用性 (HA) 部署。如上所述,AD Bridge 代理是一个作为 Windows 服务部署的 .NET 应用,可以轻松安装在 Windows Server Core 实例中。因此,利用 Windows Server 2016 中提供的 Docker 引擎,可以将 AD Bridge 代理托管在运行于两个或多个 Docker 节点上的 Windows 容器中,这些节点形成一个集群,代表一个虚拟系统,最终代表 IDCS 中的一个代理实例。

注:本文描述的方法属于概念验证 (PoC),仅用于演示容器技术的工作原理。IDCS 不支持此方法/解决方案。

解决方案概述

图 4 中的示意图展示了用于测试解决方案的环境:Microsoft Active Directory 域(左)显示要与 IDCS 租户服务(右)集成的目标目录。中间代表由三个节点组成的 AD Bridge 集群,每个节点托管一个 Windows 容器。在此 Swarm 配置中,一个节点担任管理节点的角色,另两个充当工作节点。

这些节点可以是物理机或虚拟机,可托管任意数量的容器,仅受可用资源的限制。每个容器至少可以有一个 AD Bridge 代理,在我们的配置中,每个节点上部署了一个容器,每个容器运行一个代理,总共有三个代理。虽然 IDCS 和 AD Bridge 逻辑并不知道集群的存在,但是在发生节点或服务故障时,我们完全依靠 Docker Swarm 功能为 AD Bridge 代理提供高可用性。

这个解决方案还可以方便地在代理中添加逻辑以增加额外的特性,例如,在各节点间分配负载,这在有许多用户和组要同步的域中很有用。

gutierrez-idcs-docker-fig04

图 4.解决方案概述

假设和前提条件

  • 本解决方案中的配置假设有一个内部部署 Active Directory 2012 域,以及三台安装有 Windows Server 2016 的成员服务器。还提供了 IDCS 租户服务用于集成。
  • 这些说明将涵盖在 Windows Server 2016 上安装 Docker、在 Windows 容器中部署 Windows Server Core 映像、在 IDCS 中安装和配置 AD Bridge 代理,以及配置和测试 Docker Swarm 集群。
  • 为了使用 AD Bridge 代理演示高可用性,我们在域中预先填充了 1000 个用户,这样,同步期间就有时间模拟节点和容器的故障和恢复事件了。
  • 所有参与的服务器均可通过其 DNS 名称访问,这很重要,这样其中运行的容器和服务才能访问 IDCS 租户服务和 AD 域。

配置步骤摘要

配置 Docker 和 AD Bridge
  1. 在 Windows Server 2016 上安装 Docker
  2. 创建组托管服务帐户
  3. 下载 Windows Server Core 映像
  4. 在 Windows 容器中部署 Windows Server Core 和 AD Bridge
  5. 配置 Docker Swarm
测试 AD Bridge 高可用性配置
  1. 使用一个节点和两个 AD Bridge 实例同步用户
  2. 使用三个节点和三个 AD Bridge 实例同步用户

配置 Docker 和 AD Bridge

1.在 Windows Server 2016 上安装 Docker

  • 开始安装任何组件之前,请在命令提示符窗口内运行 sconfig 命令,确保您的 Windows Servers 2016 是新版本。

    以本地或域管理员身份登录并运行以下命令:

    sconfig
    

    从菜单中选择 6) Download and Install Updates 选项,更新您的 Windows Server 2016。对其余服务器重复此步骤。

  • 在 Windows Server 2016 中,您有两个安装 Docker 引擎的选项:适用于 Windows Server 2016 的 Docker 企业版 (Docker EE) 和 Docker 社区版 (Docker CE)。主要差别在于 Docker EE 是 Microsoft 支持的稳定版 Docker 引擎,而 Docker CE 是社区版,通常包含新的实验特性,这些特性预计将在稍后的企业版中加入。为了实现我们的解决方案,我们将使用适用于 Windows Server 2016 的社区版(称为 Docker for Windows Server 2016 Edge 版),其中包含一个当前企业版中不可用的特性。
  • 以本地或域管理员的身份登录到第一个 Windows Server 2016。注:为了运行 Docker,用户必须是 docker-users 组的成员。
  • 下载 Docker for Windows Server 2016 Edge 版。将可执行文件保存在一个临时文件夹中。
  • 开始安装。

    从 Windows 资源管理器中启动安装程序:

    C:\temp\Docker for Windows Installer.exe
    

    按照安装向导的指示完成安装。

  • 安装完成后,切换到 Windows Containers(否则 Docker 不会启动)为此,右键单击任务栏上的小鲸鱼图标(参见图 5)打开上下文菜单,然后选择 Switch to Windows Containers... 选项。Docker 将启用此特性并重新启动计算机。注:还必须启用 Hyper-V 和容器特性。
  • 通过检查安装的版本来验证安装。

    检查客户端和服务器版本的一种方法是在命令提示符窗口中运行以下命令:

    docker version
    

    您的输出必须类似以下文本所示:

    C:\>docker version Client: Version: 17.06.0-ce-rc2 API version: 1.30 Go version:
    go1.8.1 Git commit: 402dd4a Built: Wed Jun 7 10:01:32 2017 OS/Arch: windows/amd64
    Server: Version: 17.06.0-ce-rc2 API version: 1.30 (minimum version 1.24) Go version:
    go1.8.3 Git commit: 402dd4a Built: Wed Jun 7 10:03:57 2017 OS/Arch: windows/amd64
    Experimental: true
  • 您还可以通过右键单击任务栏中的小鲸鱼图标并从菜单中选择 About Docker(图 5)来验证版本号和版本。
    gutierrez-idcs-docker-fig05

    图 5.适用于 Microsoft Windows Server 2016 的 Docker

  • 重复上述步骤在其余服务器上安装 Docker。

2.创建组托管服务帐户

  • 以域管理员身份登录 AD 域控制器,并在 Active Directory 中创建一个组托管服务帐户。Windows Server Core 将使用组托管服务帐户运行 AD Bridge 代理并指定域中的目标服务器。
  • 打开 Active Directory Users & Computers 工具。按以下方式创建一个组:
    Group Name : SRVCOREGROUP Group Type : Security Group
    
  • 将三台 Windows Server 2016 服务器添加为成员,例如:
    ID1-SRVCORE, ID2-SRVCORE and ID3-SRVCORE
    
  • 要创建组托管服务帐户,请打开 Server Manager。转至 Tools → Active Directory Module for Windows PowerShell。在 PowerShell 窗口中运行以下命令:
    Add-KdsRootKey -EffectiveTime ((get-date).addhours(-10)) New-ADServiceAccount -Name
    oracleservice -DNSHostName oracleservice.other.com -
    PrincipalsAllowedToRetrieveManagedPassword SRVCOREGROUP -ServicePrincipalNames
    http/oracleservice.other.com
  • 在第二条命令中,Name 参数指定服务帐户 oracleservice 的名称,参数 DNSHostName 指定服务帐户的 DNS 主机名,PrincipalsAllowedToRetrieveManagedPassword 用于指定包含允许使用组托管服务帐户的目标服务器的组名称,ServicePrincipalNames 用于注册其服务主体名称。
  • 在三台 Windows Server 2016 服务器中安装新的组托管服务帐户。为此,以域管理员身份登录每台服务器。注意:在运行以下命令之前,您可能需要重新启动每台服务器,以便获在取 AD 域中创建的新的托管服务帐户的更改。

    打开一个 PowerShell ISE 窗口,运行以下命令:

    Import-Module ActiveDirectory Get-ADServiceAccount -Filter * Install-ADServiceAccount -
    Identity oracleservice Test-AdServiceAccount oracleservice

    最后一条命令应返回 True,表明帐户已成功安装。

  • 下载 CredentialSpecs 脚本,生成凭证文件。该文件将传递到 Windows 容器,以便可以使用组托管服务帐户运行 AD Bridge 代理。

    将脚本下载到临时文件夹中后,打开一个 PowerShell ISE 窗口,运行以下命令:

    Add-WindowsFeature RSAT-AD-PowerShell Import-Module ActiveDirectory Import-Module
    C:\TEMP\CredentialSpec.psm1 New-CredentialSpec -Name oracleservice -AccountName
    oracleservice

    运行以下命令来验证结果:

    Get-CredentialSpec 
    

    输出应类似以下文本所示

    Name Path ------------- ---------------- oracleservice
    C:\ProgramData\Docker\CredentialSpecs\oracleservice.json

3.下载 Windows Server Core 映像

  • 在第一个 Windows Server 2016(已经安装了 Docker 引擎)中,将 Windows Server Core 映像下载到本地 Docker 信息库。
  • 以本地或域管理员的身份登录到第一个 Windows Server 2016,下载 Windows Server Core 映像。

    打开一个命令提示符窗口,运行以下命令:

    docker pull microsoft/windowsservercore 
    

    此命令将从 Microsoft 信息库下载映像,并将其提供给本地 Docker 信息库。Windows Server Core 的平均映像大小为 10 GB。

    运行以下命令列出本地信息库中的映像:

    docker images
    

    您的输出应类似以下文本所示:

    REPOSITORY TAG IMAGE ID CREATED SIZE microsoft/windowsservercore latest 4f222178c921 2 weeks ago
    10.2 GB

4.在 Windows 容器中部署 Windows Server Core 和 AD Bridge

  • 以管理员身份登录 IDCS 租户服务,定义新的 AD Bridge。
  • 转至 Settings → Directory Integrations,然后单击 Add 新建一个定义。

    记下 IDCS 生成的信息:

    Cloud Service URL : https://mydemotenant1.idcs.internal.oracle.com:8943 Cliend ID :
    e7c04e28bc12415190ea37f0e2fdf325 Client Secret : 71d6b308-a21e-47ef-9dc1-f5ee907ce2e3

    接下来,单击 Download 按钮下载 AD Bridge 安装程序。将文件保存到安装了 Docker 引擎的 Windows Server 2016 中的临时文件夹。

  • 在 Windows 容器中部署 Windows Server Core 映像。

    打开一个命令提示符窗口,运行以下命令:

    docker run -it --name id1-docker --hostname id1-docker --security-opt
    "credentialspec=file://oracleservice.json" microsoft/windowsservercore cmd

    此命令在 Windows 容易中部署映像 microsoft/windowsservercore,将其命名为 (id1-docker),主机名 (id1-docker),传递上述步骤中生成的凭证文件 (oracleservice.json),运行命令 (cmd) 启动命令提示符界面或命令解释器来执行命令。因为命令提示符是交互式的,容器将一直运行,直到执行 exit 命令或通过 docker stop 命令停止容器。

  • 验证 Windows 容器的状态。

    在命令提示符窗口中,运行以下命令:

    docker ps
    

    您的输出应类似以下文本所示:

    C:\>docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3950c998bc94
    microsoft/windowsservercore:latest "cmd" 2 hours ago Up 2 hours id1-docker
  • 验证容器内运行的 Window Server Core 映像是否可以访问 AD 域。

    连接容器内的映像:

    docker exec -it 3950c998bc94 cmd 
    

    此命令连接一个运行中的容器,并在该容器内打开一个命令提示符窗口。运行以下命令:

    nltest.exe /parentdomain 
    

    如果成功,则返回域名,类似以下输出:

    C:\>nltest.exe /parentdomain other.com. (1) The command completed successfully
    

    接下来,键入 exit 关闭容器中的命令提示符窗口,返回主机的命令提示符窗口。

  • 将 AD Bridge 安装程序和 IDCS SSL 证书复制到 Windows 容器。

    从命令提示符窗口运行以下命令:

    docker cp C:\TEMP\ad-id-bridge-17.2.2-rel.1314.exe
    3950c998bc94:C:\TEMP\ad-id-bridge.exe docker cp C:\TEMP\idcs.cer 3950c998bc94:C:\TEMP

    这些命令将 AD Bridge 安装程序 ad-id-bridge-17.2.2-rel.1314.exeidcs.cer 文件复制到运行 Windows Server Core 映像的 Windows 容器 3950c998bc94 内的文件夹 C:\TEMP

  • 在 Windows 容器中安装 IDCS SSL 证书和 AD Bridge 代理。

    连接容器内的映像:

    docker exec -it 3950c998bc94 cmd 
    

    启动 PowerShell,运行以下命令:

    C:\powershell cd C:\TEMP $file = (Get-ChildItem -Path C:\Temp\idcs.cer) $file |
    Import-Certificate -CertStoreLocation cert:\LocalMachine\Root

    为了以静默模式安装 AD Bridge 代理,首先需要创建两个输入文件,如下所示:

    a.文件名:SilentInstallData.json

    { "CloudServiceUrl": "https://mydemotenant1.idcs.internal.oracle.com:8943", "ClientID":
    "e7c04e28bc12415190ea37f0e2fdf325", "ClientSecret": "71d6b308-a21e-47ef-9dc1-f5ee907ce2e3",
    "AdUserName": "oracle", "AdUserPassword": "P@ssw0rd", "UseLdapSsl": false }

    使用 IDCS 生成的信息填充 CloudServiceUrlClientIDClientSecret 参数的值。AdUserNameAdUserPassword 对应于 AD Bridge 在同步过程中执行查询操作所使用的 AD 域帐户。确保此帐户具有适当的权限来查询 AD 域中的数据。

    b.文件名:domainDefs.json

    [{ "domain": "other.com", "dc": "zeus.other.com" }] 
    

    domain 和 dc 参数分别代表域控制器的 AD 域名和主机名。创建输入文件之后,在容器中运行以下命令来执行 AD Bridge 的静默安装:

    cd C:\TEMP ad-id-bridge.exe DomainDefs=domainDefs.json ResponseFile=SilentInstallData.json
    /quiet /log idbinstall.log

    最后一条命令结束之后,检查日志文件,验证安装是否完成且无错误。此时,如果您登录 IDCS 租户服务并转至 Settings #→ Directory Integrations,您应该能够看到安装了 AD Bridge 的容器的主机名(图 6)。

    gutierrez-idcs-docker-fig06

    图 6.目录集成 — AD Bridge

  • 现在,我们将正在运行的容器提交到一个新的 Docker 映像中,以便将其复制到其余 Windows Server 2016 服务器中运行的其他 Docker 实例。注意:此特性是采用容器技术的一大优点,因为无需重新部署即可将容器中运行的应用轻松传输到其他主机。

    运行以下命令将正在运行的容器 3950c998bc94 提交到新映像中:

    docker commit -m "AD-BRIDGE" 3950c998bc94 adbridge/winsrvcore2016:1.0
    

    运行以下命令,验证新映像是否在本地信息库中列出:

    docker images 
    

    输出应类似以下文本所示:

    C:\>docker images REPOSITORY TAG IMAGE ID CREATED SIZE adbridge/winsrvcore2016 1.0
    51e3b01191e9 56 minutes ago 10.3 GB microsoft/windowsservercore latest 4f222178c921 3 weeks
    ago 10.2 GB

    此输出显示了两个映像;一个包含基本 Windows Server Core 映像,另一个 (adbridge/winsrvcore2016) 还包含我们的更改,包括 SSL 证书的导入以及安装的 AD Bridge 代理。由于 Docker 中的分层系统,新映像显示为 10.3 GB,但实际上仅使用了 0.5 GB 的物理空间;其余属于基本映像。

  • 保存映像,以便将其传输到其他 Docker 实例。

    运行以下命令将映像保存到压缩文件中:

    docker save --output C:\Temp\idbridge-srvcore.tar 51e3b01191e9
    
  • 由于我们希望在集群中运行 Windows 容器,因此我们将删除当前容器,稍后会在 Docker Swarm 中将其部署为服务。

    运行以下命令,停止并删除当前 Windows 容器:

    docker stop id1-docker docker rm 3950c998bc94
    
  • 将压缩映像复制到其余服务器中的临时文件夹。您也可以将映像复制到共享文件夹。
  • 将映像复制到服务器之后,继续将映像加载到每台服务器上的本地 Docker 信息库中。

    运行以下命令,将映像加载到本地信息库中并做标记:

    docker load --input C:\TEMP\idbridge-srvcore.tar docker tag $(docker images | grep '^<none>' |
    awk '{print $3}') adbridge/srvcore2016:1.0

5.配置 Docker Swarm

  • 以本地或域管理员的身份登录到第一个 Windows Server 2016,初始化 Docker Swarm。

    运行以下命令:

    docker swarm init --advertise-addr 192.168.0.204 
    

    此命令初始化 Docker Swarm,将当前服务器添加为第一个节点。advertise-addr 参数指定服务器(本例中为第一个 Windows Server 2016)的 IP 地址,此地址将发布给其他 Swarm 成员,用于 API 访问和覆盖网络。

    运行以下命令列出 Swarm 中的可用节点:

    docker node ls
    

    输出应类似以下文本所示:

    ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 3sbj6rsvuewvaw78307keunxr * ID1-SRVCORE Ready
    Active Leader

    由于这是加入 Swarm 的第一个节点,因此它将自动承担管理节点的角色 (Leader)

  • 创建 Swarm 服务。

    运行以下命令:

    docker service create -t --name adbridge --detach=false --hostname id1-docker --credential-
    spec="file://oracleservice.json" --replicas 1 adbridge/srvcore2016:1.0 cmd

    此命令指示 Swarm 使用 adbridge/srvcore2016:1.0 映像创建一个新服务。replica 参数指定复制服务的副本任务数。默认情况下,管理节点也可以像工作节点一样运行服务;因此,上一条命令将产生一个在管理节点中运行的新 Windows 容器。运行以下命令验证服务是否在 Swarm 中运行:

    docker service ls
    

    输出应类似以下文本所示:

    ID NAME MODE REPLICAS IMAGE PORTS ryawbq164eqz adbridge replicated 1/1
    adbridge/srvcore2016:1.0

    以下命令显示正在运行的容器:

    docker ps
    

    输出应类似以下文本所示:

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca0c41382737 adbridge/srvcore2016:1.0
    "cmd" 2 minutes ago Up About a minute adbridge.1.m2c4yeaexhmunclj5qa6rfa2o
  • 注:此时,我们创建了一个只有一个节点的 Docker Swarm,并部署了一个服务(在 Windows 容器中运行的 AD Bridge)。在接下来的步骤中,我们将增加集群中的服务和节点数,以使 AD Bridge 具有多个实例,并测试发生服务或节点故障时的高可用性。

测试 AD Bridge 高可用性配置

1.使用一个节点和两个 AD Bridge 实例同步用户

  • 在这一步中,我们将使用一个运行两个 AD Bridge 服务或实例的节点测试用户同步;每个实例将在自己的容器上运行。为此,我们将服务数从 1 增加到 2。

    运行以下命令:

    docker service scale adbridge=2 
    

    上面一条命令指示将 Swarm 服务数增加到 2;基本上,这意味着的另一个 AD Bridge 实例将开始在新容器中运行。

    运行以下命令显示服务状态:

    docker service ls 
    

    输出应类似以下文本所示(注意,现在副本数是两个):

    ID NAME MODE REPLICAS IMAGE PORTS ryawbq164eqz adbridge replicated 2/2
    adbridge/srvcore2016:1.0

    以下命令将显示正在运行的容器:

    docker ps
    

    输出应类似以下文本所示:

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca0c41382737 adbridge/srvcore2016:1.0
    "cmd" About a minute ago Up About a minute adbridge.2.sew9xkw74tgrzjh68ewws55be 9931a440fb8f
    adbridge/srvcore2016:1.0 "cmd" 5 minutes ago Up 5 minutes adbridge.1.m2c4yeaexhmunclj5qa6rfa2o
  • 启动并运行两个实例之后,我们将开始导入过程。以管理员身份登录 IDCS 租户服务。
  • 转至 Settings → Directory Integrations。单击 AD Bridge 代理,配置要同步的用户和组。在本例中,我们选择 OU Other Users,在我们的域中包含想要导入 IDCS 的测试用户。
  • 依次单击 Import 选项卡和 Import 按钮,启动此过程。您也可以使用 Refresh 按钮监视状态。
  • 导入过程开始运行之后,其中一个 AD Bridge 实例将开始处理来自 AD 域的用户数据,将其导入 IDCS 身份存储库。
  • 在该过程结束之前,我们将停止服务,然后从 Swarm 中删除容器,以此来模拟一次实例故障。

    运行以下命令访问容器,确定容器内运行的 AD Bridge 实例是否是处理导入过程的实例。

    docker exec -it <container_id> cmd type C:\ProgramData\Oracle\IDBridge\logs\IDBridge.log 
    

    第二条命令将显示日志文件的内容,帮助确定该实例是否正在处理用户数据导入。否则,我们将在第二个容器中运行相同的命令。如果该实例正在处理导入,以下命令将停止该实例:

    Powershell Stop-Service -name IDBridge exit 
    

    最后一条命令退出容器并返回到主机服务器。然后,我们将使用以下命令停止并删除该容器:

    docker stop <container_id> docker rm <container_id>
    
  • 上一条命令执行后不久,Swarm 将检测到缺少的容器,并自动在新的容器中启动一个新的 AD Bridge 实例,以符合 Swarm 中定义的服务数。

    运行以下命令:

    docker ps
    

    输出显示已经添加了一个新的容器:

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3155e78cb2e5 adbridge/srvcore2016:1.0
    "cmd" 14 minutes ago Up 14 minutes adbridge.2.pxk7bfu66lbvgkm7iz7zgewsz 9931a440fb8f
    adbridge/srvcore2016:1.0 "cmd" About an hour ago Up About an hour
    adbridge.1.60vcbqp4w4ctb5c9tg8gfdxp0
  • 等待导入过程完成,然后验证 OU 中的用户数据是否都已成功导入 IDCS 身份存储库。图 7 显示了 IDCS 中的结果。

    gutierrez-idcs-docker-fig07

    图 7.目录集成 — 导入过程

  • 此时,我们已经成功测试了用户数据同步,即使是在运行过程的 AD Bridge 实例关闭之后,用户数据同步仍能成功。

2.使用三个节点和三个 AD Bridge 实例同步用户

  • 在最后一步中,我们将使用三个 AD Bridge 实例测试用户同步,分布在 Swarm 集群中的三个节点上。此配置将允许实现 AD Bridge 的高可用性,这样当其中一个节点不可用时,AD Bridge 仍将继续运行。
  • 将其他两台服务器加入 Swarm 集群。

    在第一个服务器或管理节点上运行以下命令:

    docker swarm join-token worker
    

    此命令将显示将其他节点加入集群所需的令牌字符串。输出类似以下文本所示:

    To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1
    -05zmd77r7fla384zx8dus28zpsv0n5rus38gugns2fe3o97f2u-5a9zp4mbpp3qolloa48gitog9
    192.168.0.204:2377

    在第二个和第三个服务器上运行以下命令:

    docker swarm join --token SWMTKN-1-05zmd77r7fla384zx8dus28zpsv0n5rus38gugns2fe3o97f2u-
    5a9zp4mbpp3qolloa48gitog9 192.168.0.204:2377

    在第一个服务器或管理节点中运行以下命令,列出 Swarm 中的可用节点:

    docker node ls 
    

    输出应类似以下文本所示:

    ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS hdnactidu3kb8z00f47hwq0f5 ID3-SRVCORE Ready
    Active juehq3q313dazsxllhtbn0il2 * ID1-SRVCORE Ready Active Leader m9fih9k6p882z39w8yghrphl8
    ID2-SRVCORE Ready Active
  • 现在,我们将服务扩展到三个副本。

    在第一个服务器或管理节点上运行以下命令:

    docker service scale adbridge=3 
    

    上述命令指示 Swarm 将 adbridge 服务的副本数增加到 3。由于集群中现在有三个可用节点,因此它将在其余每个服务器上启动一个 Windows 容器,共计三个容器。

    运行以下命令显示服务状态:

    docker service ls 
    

    输出应类似以下文本所示(注意副本数现在是三个):

    ID NAME MODE REPLICAS IMAGE PORTS 2jtgntraysn1 adbridge replicated 3/3
    adbridge/srvcore2016:1.0

    以下命令显示 Swarm 集群中服务 adbridge 的其他详细信息:

    docker service ps adbridge
    

    输出应类似以下文本所示:

    ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS h4nhqmckt96j adbridge.1
    adbridge/srvcore2016:1.0 ID3-SRVCORE Running Running about a minute ago im8ypfbp9xlk
    adbridge.2 adbridge/srvcore2016:1.0 ID1-SRVCORE Running Running 2 minutes ago 82b1iqhsm0sd
    adbridge.3 adbridge/srvcore2016:1.0 ID2-SRVCORE Running Running about a minute ago
  • 启动并运行三个实例之后,我们将开始导入过程。以管理员身份登录 IDCS 租户服务。
  • 转至 Settings →= Directory Integrations。单击 AD Bridge 代理,配置要同步的用户和组。在本例中,我们选择 OU Other Users,在我们的域中包含想要导入 IDCS 的测试用户。
  • 依次单击 Import 选项卡和 Import 按钮,启动此过程。您也可以使用 Refresh 按钮监视状态。
  • 导入过程开始运行之后,其中一个 AD Bridge 实例将开始处理来自 AD 域的用户数据,将其导入 IDCS 身份存储库。
  • 在该过程结束之前,我们将关闭正在运行实例的节点,以此来模拟一次实例故障。

    在每个节点上运行以下命令访问容器,确定容器内运行的 AD Bridge 实例是否是处理导入过程的实例:

    docker exec -it <container_id> cmd type C:\ProgramData\Oracle\IDBridge\logs\IDBridge.log
    

    第二条命令将显示日志文件的内容,帮助确定该实例是否正在处理用户数据导入。如果正在处理,我们将关闭正在运行实例的节点。

  • 节点关闭后不久,Swarm 将检测到缺少的节点,并自动在其余节点之一中启动一个新的 AD Bridge 实例,以符合 Swarm 中定义的服务数。

    运行以下命令查看服务详细信息:

    docker service ps adbridge
    

    输出反映其中一个节点已关闭,同时还显示现在第一个节点上有两个服务在运行。这样做是为了补偿第二个节点的损失,并保持运行中的服务数为 3:

    ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS h4nhqmckt96j adbridge.1
    adbridge/srvcore2016:1.0 ID3-SRVCORE Running Running 19 minutes ago im8ypfbp9xlk adbridge.2
    adbridge/srvcore2016:1.0 ID1-SRVCORE Running Running 19 minutes ago 93mn9x7q1loe adbridge.3
    adbridge/srvcore2016:1.0 ID1-SRVCORE Running Running about a minute ago 82b1iqhsm0sd \_
    adbridge.3 adbridge/srvcore2016:1.0 ID2-SRVCORE Shutdown Running 19 minutes ago
  • 我们等待导入过程完成,然后验证 OU 中的所有用户数据是否已成功导入 IDCS 身份存储库。结果如图 7 所示。
  • 此时,我们已经成功测试用户数据同步,即使是在运行 AD Bridge 实例的节点之一关闭它之后,用具数据同步仍能成功。

总结

Docker 得到广泛采纳的原因之一是它能够让应用的打包和发送变得非常轻松。在 Docker 引擎中包含 Swarm 是其功能扩展过程中的重大进步,也是集群技术的入口点,和加入 Kubernetes 和 Mesos 等是一个道理。

在本文中,我们探讨了在 AD Bridge(与 Microsoft Active Directory 集成时所使用的 IDCS 组件)中实现高可用性的方法。

有关本文中提及的产品和特性的其他参考资料,请参见以下链接:

关于作者

Ricardo Gutierrez 是 Oracle 的资深 IT 顾问,致力于 IDaaS、CASB、身份和访问管理、身份分析、身份治理、企业 SSO、联合、特权帐户管理、数据库和应用安全。Ricardo 拥有超过 25 年的经验,过去 13 年从事 IBM、Microsoft 和 Oracle 的全套安全产品的工作。他还是 PMP、CCSP 和 VMware 认证专业人员,发表了多种有关安全和云计算的白皮书、文章和培训材料。

SaveSaveSave