适用于大型环境的 PowerFlex 4.x LDAP 配置
Summary: 通过使用 PowerFlex 管理平台 SSO 后端缩小用户和组 LDAP 搜索筛选器的范围,我们可以缓解已观察到会导致多个 UI 和平台问题的同步问题。
Instructions
背景:
默认情况下,PowerFlex 管理平台 (PFMP) 目录提供程序会导入配置的搜索范围内的所有 LDAP 对象,包括 RBAC 不需要的非用户帐户和其他对象。
在大型环境中,此行为可能会导致 PFMP 管理虚拟机 (MVM)、支持 Postgres 数据库和整个平台的资源利用率很高。
因此,LDAP 同步可能无法在可接受的时间范围内完成,从而导致作业积压、内存泄漏和并发问题。
1.准备
要求:
使用 Active Directory 全局编录
提醒: 在 AD 环境中,我们需要将端口 3268 用于标准 LDAP,或将 3269 端口用于 LDAPS。这允许子域或其他受信任域中的 LDAP 组成员可在 PFMP 中使用。
AD 组,例如:

na.powerflex.lab.dell.com 上面的子域必须可通过 PFMP 的 LDAP 用户联合 Keycloak 看到,并且使用全局目录端口可以访问这些子域。
这也是我们在 PFMP 目录提供程序中使用 objectGUID 的原因,它将帐户与其全局唯一 UUID 相关联。
如果两个子域都列在“信任”选项卡下,则默认情况下子域似乎相互信任。
在 Microsoft Active Directory (AD) 环境中,父域及其子(子)域在层次结构中固有地相互信任。这称为传递信任。
默认情况下,这些信任是双向和可传递的,这意味着父域信任其子域,反之亦然。此传递特性将信任扩展到父子层次结构中的所有域。
从 DNS 条目中查找可用的 LDAP 或 AD GC 服务器
通常,客户提供要使用的 LDAP 地址。 这些设置可以从 PFMP 目录提供程序配置中复制,然后再将其作为本指南后续步骤的一部分删除。
或者,可以从 DNS 检索特定域的可用服务器:
# listing LDAP server
$ host -t srv _ldap._tcp.powerflex.lab.dell.com
Server: nameserver.dell.com
Address: 10.8.8.8
Non-authoritative answer:
_ldap._tcp.powerflex.lab.dell.com service = 0 100 636 hcihopad1.powerflex.lab.dell.com. _ldap._tcp.powerflex.lab.dell.com service = 0 100 389 hcihopad1.powerflex.lab.dell.com. _ldap._tcp.powerflex.lab.dell.com service = 0 100 389 hcick3ad2.powerflex.lab.dell.com. _ldap._tcp.powerflex.lab.dell.com service = 0 100 636 hcick3ad1.powerflex.lab.dell.com. _ldap._tcp.powerflex.lab.dell.com service = 0 100 389 hcihopad3.powerflex.lab.dell.com.
# listing AD GC servers (Active Directory Global Catalog)
host -t srv _gc._tcp.powerflex.lab.dell.com
Server: nameserver.dell.com
Address: 10.8.8.8
Non-authoritative answer:
_gc._tcp.powerflex.lab.dell.com service = 0 100 3268 hcihopad3.powerflex.lab.dell.com.
_gc._tcp.powerflex.lab.dell.com service = 0 100 3268 hcick3ad3.powerflex.lab.dell.com.
_gc._tcp.powerflex.lab.dell.com service = 0 100 3268 hcick3ad2.powerflex.lab.dell.com.
如何查找 OU 或组的 distinguishedName。
首先,我们需要将用户读入 PFMP 的 OU 和组的可分辨名称 (DN)。 这些路径不严格遵循 DNS 命名,并且在我们可以手动提取的 x.500 LDAP 路径中包含 OU。
我们可以根据作系统使用不同的实用程序找到这些 DN,一种简单的方法是使用 curl:
如何在 Linux 上使用curl 实用程序测试 PFMP LDAP 设置。
安装在 MVM 上的较新版本的 curl 可用于查找所需的完整可分辨名称,例如,这会搜索 LabAdmins 组的完整 DN CN:
#Get the DN of your groups for use in the LDAP User filter while also validating your LDAP Group Filter syntax# Set this to the group filter you intend to use in keycloak GROUPFILTER='(CN=LabAdmins)'# Use the LDAP svc bind creds to confirm the user can in fact call LDAP and see the group(s)BINDUSER="user@powerflex.lab.dell.com"# LDAP server URL. For TLS use ldaps:// and port 3269LDAPSERVER='ldap://ldap.powerflex.lab.dell.com:3268'# Use the same search base as you intend for the group path, generally just the DC componentsSEARCHBASE=DC=powerflex,DC=lab,DC=dell,DC=com# Call curl which will request the password of the bind user and return resultscurl -s sub --user "$BINDUSER" "$LDAPSERVER/$SEARCHBASE?distinguishedName?sub?$GROUPFILTER"
Enter host password for user 'jacqup@powerflex.lab.dell.com':
DN:CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com
distinguishedName:CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com
DN: CN=LabAdmins,CN=Users,DC=na,DC=powerflex,DC=lab,DC=dell,DC=com distinguishedName: CN=LabAdmins,CN=Users,DC=na,DC=powerflex,DC=lab,DC=dell,DC=com

Manual examples:
curl -s sub --user "FLEXLAB\jacqup"
"ldap://ldap.powerflex.lab.dell.com:3268/DC=powerflex,DC=lab,DC=dell,DC=com?distinguishedName,objectGUID?sub?(|(CN=FLEXLAB-APP-PROD-SDS-Admin)(CN=LabAdmins)(CN=LabUsers)(CN=EMEALabAdmins))"
Enter host password for user 'FLEXLAB\jacqup':
DN: CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=comdistinguishedName: CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=comDN: CN=LabAdmins,CN=Users,DC=na,DC=powerflex,DC=lab,DC=dell,DC=comdistinguishedName: CN=LabAdmins,CN=Users,DC=na,DC=powerflex,DC=lab,DC=dell,DC=comDN: CN=LabUsers,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=comdistinguishedName: CN=LabUsers,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com
使用过滤器属性查找 LDAP 组的所有成员,然后您可以将这些属性放入 keycloak 后端:
#check for all members of the group with CN=LabAdmins
curl -s sub --user "jacqup@powerflex.lab.dell.com" "ldap://ldap.powerflex.lab.dell.com:3268/DC=powerflex,DC=lab,DC=dell,DC=com?member?sub?(&(objectClass=group)(cn=LabAdmins))"DN:CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=matrixadmin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=matrixadmin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=svc_adfsck3,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=svc_mcp_rw,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=adcertsvc,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=bobthebuilder,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=Ashish Rahangdale,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=Packer Admin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=FDLabAdmins,OU=Foundations,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=Tejas Wadekar,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com
如何在 Linux 上使用ldapsearch 或 curl 实用程序测试 PFMP LDAP 设置。
如果网络上有可用的 Linux 主机,则使用 ldapsearch 实用程序可用于测试和验证 PFMP/Keycloak 中使用的 LDAP 设置。
或者, curl 实用程序也可用于来自其中一个管理虚拟机/MVM 的 LDAP 查询。
快速介绍 (常用选项):
ldapsearch - LDAP search tool
ldapsearch opens a connection to an LDAP server, binds, and performs a search using specified parameters.
usage: ldapsearch [options] [filter
[attributes...]]
where:
filter RFC 4515 compliant LDAP search filter
attributes whitespace-separated list of attribute descriptions
Search options:
-b basedn base dn for search
-LLL print responses in LDIF format without comments and version Common options: -D binddn bind DN -H URI LDAP Uniform Resource Identifier(s) -N do not use reverse DNS to canonicalize SASL host name -w passwd bind password (for simple authentication) -W prompt for bind password -x Simple authentication
检查/安装工具:
$ which ldapsearch
/usr/bin/ldapsearch
#RHEL/CentOS install
sudo yum install openldap-clients
# SLES install
sudo zypper install openldap2-client
从 LDAP 根条目定义 基本 DN (-b):
$ curl "ldap://ldap.powerflex.lab.dell.com:3268/?rootDomainNamingContext"
DN:
rootDomainNamingContext: DC=powerflex,DC=lab,DC=dell,DC=com
# ldapsearch (with simple auth)
$ ldapsearch -LLL -H ldap://ldap.powerflex.lab.dell.com -x -D "FLEXLAB\ck3-user" -W -b "" -s base "dn=" rootDomainNamingContext
dn: rootDomainNamingContext: DC=powerflex,DC=lab,DC=dell,DC=com
根条目提供有关目录服务器的信息。在 AD 上,rootDomainNamingContext 属性提供可用于搜索的顶部基本 DN。
-W -b "
测试 LDAP URI、绑定 DN(具有读取访问权限的用户/密码)和用户搜索设置:
$ ldapsearch -LLL -H ldap://powerflex.lab.dell.com:3268 -x -D "CN=ck3-user,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com" -W \ -b "dc=powerflex,dc=lab,dc=dell,dc=com" "(sAMAccountName=damonl)"
Enter LDAP Password: ********
dn: CN=Luc Damon,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com
objectClass: person
cn: Luc Damon memberOf: CN=EMEALabAdmins,OU=LabAdmins,DC=powerflex,DC=lab,DC=dell,DC=com memberOf: CN=LabUsers,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com memberOf: CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com objectGUID:: 6Z359eP5vky4P0Ye8iFp8g== sAMAccountName: damonl
# equivalent curl command:
$ curl -u 'CN=ck3-user,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com' \
"ldap://ldap.powerflex.lab.dell.com:3268/DC=powerflex,DC=lab,DC=dell,DC=com??sub?(sAMAccountName=damonl)"
# OR (with attributes selection)
$ curl -u 'FLEXLAB\ck3-user' \
"ldap://ldap.powerflex.lab.dell.com:3268/DC=powerflex,DC=lab,DC=dell,DC=com?cn,objectClass,memberOf,objectGUID,sAMAccountName?sub?(sAMAccountName=damonl)"
在此示例中,我们将使用 sAMAccountName 属性查询现有用户帐户的 LDAP (输出已被截断,仅显示我们需要的属性)。
PFMP UI 中的相应设置:
地址 (-H): ldap://active.directory.domain.address.com:3268
绑定 DN (-D):“CN=ck3-user,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com”#(“FLEXLAB\ck3-user”或“ck3-user@powerflex.lab.dell.com”是等效的)
(简单身份验证需要 -x,以避免默认的 SASL 模式)
Bind DN Password (-W):提示输入密码(或使用 –w '***' 在命令中提供密码)
The output of the command validates the following PFMP User Search Settings:
Username LDAP Attribute: sAMAccountName
ID 属性: objectGUID
项目等级: person
Search Path (-b):“dc = powerflex,dc = lab,dc = dell,dc = com”
测试 组搜索设置:
$ ldapsearch -LLL -H ldap://powerflex.lab.dell.com:3268 -x -D "FLEXLAB\ck3-user" -W \ -b "dc=powerflex,dc=lab,dc=dell,dc=com" "(&(objectClass=group)(|(cn=FLEXLAB-APP-PROD-SDS-Admin)(cn=EMEALabAdmins)))" cn
dn: CN=EMEALabAdmins,OU=LabAdmins,DC=powerflex,DC=lab,DC=dell,DC=com
sAMAccountName: Administrator
member: CN=ck3-builder,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com
sAMAccountName: jacqup member: CN=Luc Damon,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com sAMAccountName: damonl member: CN=Patrick Jacques,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com sAMAccountName: bobthebuilder
$ curl -u 'FLEXLAB\ck3-user' "ldap://ldap.powerflex.lab.dell.com:3268/DC=powerflex,DC=lab,DC=dell,DC=com?member?sub?(&(objectClass=group)(cn=EMEALabAdmins))"
In this example, we are querying LDAP for an existing group (objectClass) using its cn attribute and requesting member value(s).
It permits to validate following PFMP settings:
Group Member Attribute: member
Group ID Attribute: cn
Group Object Class: group
Group Search Path: "dc=powerflex,dc=lab,dc=dell,dc=com"
测试 组 LDAP 筛选器:
$ ldapsearch -LLL -H ldap://powerflex.lab.dell.com:3268 -x -D "FLEXLAB\ck3-user" -W \ -b "dc=powerflex,dc=lab,dc=dell,dc=com" "(&(objectClass=group)(|(cn=FLEXLAB-APP-PROD-SDS-Admin)(cn=EMEALabAdmins)))" cn dn:
CN=EMEALabAdmins,OU=LabAdmins,DC=powerflex,DC=lab,DC=dell,DC=com
cn:EMEALabAdmins
dn:CN=FLEXLAB-APP-PROD-SDS-Admin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com
cn:FLEXLAB-APP-PROD-SDS-Admin
$ curl -u 'FLEXLAB\ck3-user' "ldap://ldap.powerflex.lab.dell.com:3268/DC=powerflex,DC=lab,DC=dell,DC=com?cn?sub?(&(objectClass=group)(|(cn=FLEXLAB-APP-PROD-SDS-Admin)(cn=EMEALabAdmins)))"
测试 用户 LDAP 筛选器:
$ ldapsearch -LLL -H ldap://powerflex.lab.dell.com:3268 -x -D "FLEXLAB\ck3-user" -W -b "dc=powerflex,dc=lab,dc=dell,dc=com" \dn: CN=Administrator,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com"(&(objectCategory=Person)(sAMAccountName=*)(|(memberOf=CN=FLEXLAB-APP-PROD-SDS-Admin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)\(memberOf=CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)))" sAMAccountNamesAMAccountName:Administratordn: CN=Patrick Jacques,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com sAMAccountName:jacqup dn: CN=Luc Damon,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com sAMAccountName: damonl dn: CN=bobthebuilder,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com sAMAccountName: bobthebuilder
$ curl -u 'FLEXLAB\ck3-user' "ldap://ldap.powerflex.lab.dell.com:3268/DC=powerflex,DC=lab,DC=dell,DC=com?sAMAccountName?sub?(&(objectCategory=Person)(sAMAccountName=*)(|(memberOf=CN=FLEXLAB-APP-PROD-SDS-Admin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)(memberOf=CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)))"
Windows
启动 Active Directory 用户和计算机。单击查看,然后选择高级功能。
DN 是唯一标识目录中条目的名称。DN 的第一个组件称为相对可分辨名称 (RDN)。
DN 由属性 = 值对组成,以逗号分隔,例如:
CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
将它们视为“LDAP 的 FQDN”,即完整的 x500 地址“URL”。
AD 用户和计算机可用于确定 DN 和其他属性:

导航并右键单击要读取用户的 OU,然后选择属性。

在“OU 属性”中,选择“属性编辑器”选项卡。
单击distinguishedName以突出显示它,然后单击View。
右键单击突出显示的值,然后选择Copy。
单击 Cancel,然后单击 OK 以关闭 Attribute Editor 和 OU Properties 窗口。

窄范围 LDAP 用户筛选器示例:
(&(objectCategory=Person)(sAMAccountName=*)(|(memberOf=CN=FLEXLAB-APP-PROD-SDS-Admin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)(memberOf=CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)))
视觉说明:

绑定用户要求。
此绑定用户必须至少具有查询 LDAP 服务器中定义的用户和组的权限,以允许存储系统对这些用户进行身份验证。
默认情况下,将用户添加到 Active Directory 用户和计算机中顶级域的安全选项卡时,将为其提供 PFMP 中 LDAP 身份验证所需的默认只读要求。例如



仅供参考:我们不需要 LDAP 绑定用户实际“在”我们必须在目录中读取的 AD 组中,我们需要“读取”的“安全”选项卡权限。

PFMP LDAP 提供程序一般要求
地址: ldaps://ad.ldap.domain:3269 (SSL) 或 ldap://ad.ldap.domain:3268 (PLAIN)
绑定 DN:ADNTDOMAIN\serviceaccount 或绑定 DN 可分辨名称。
Bind DN Password:服务帐户密码
Timeout 30000
Username LDAP attribute: sAMAccountName
ID 属性:objectGUID
Object Class: Person
Search Path:(最高级别,可以查询所有组,例如仅查询域组件/DC:DC = powerflex,dc = lab,dc = dell,dc = com)
Group Member Attribute: member
Group ID Attribute: cn
Group Object Class: group
Group Search Path:(Same as User Search Path 或更精细的选项(如果需要)。 由于我们将使用窄过滤器,因此我们的范围可以很宽,而不会影响性能。)
#The 以下条目至少向 LDAP 组筛选器 (PFMP 4.6.x+) 提供了一个组,以便 keycloak 不会从整个目录中搜索所有组:
Group LDAP Filter: (CN=GROUP1)
#Given 此字段中仅针对 PFMP UI 的 64 个字符的限制,如果我们想添加更多字符(例如 3 个不同的组),我们必须使用 keycloak 来解决它:
Group LDAP Filter: (|(CN=GROUP1)(CN=GROUP2)(CN=GROUP3))
测试连接,如果成功,请单击 Submit。
例如

2.LDAP 提供程序删除和清理
以管理员用户身份从 PFMP UI 中删除 LDAP 用户、组和目录提供程序。 请勿尝试以 LDAP 用户身份执行此作,而应仅以管理员身份执行此作。
警告:确保记录来自 PFMP 的“Directory Provider”和“Remote Users/Groups”映射的当前配置(特别是需要恢复以前的角色映射时)。
如果 PFMP 上未显示组/角色映射(已知问题),请遵循以下说明:
# from any mvm
cmo_pri=$(kubectl get pods -n powerflex -l='postgres-operator.crunchydata.com/role=master,postgres-operator.crunchydata.com/instance-set' -o name)
# Group role
kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak -c "SELECT keycloak_group.name AS group_name,keycloak_role.name AS role_name FROM group_role_mapping JOIN keycloak_group ON (group_role_mapping.group_id = keycloak_group.id) JOIN keycloak_role ON (group_role_mapping.role_id = keycloak_role.id);"
# Group attributes
kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak -c "SELECT keycloak_group.name AS group_name,group_attribute.name AS attribute_name, value FROM group_attribute JOIN keycloak_group ON (group_attribute.group_id = keycloak_group.id);"
Example:
mvm01:~
# kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak
keycloak=# SELECT keycloak_group.name AS group_name,keycloak_role.name AS role_name FROM group_role_mapping JOIN keycloak_group ON (group_role_mapping.group_id = keycloak_group.id) JOIN keycloak_role ON (group_role_mapping.role_id = keycloak_role.id);---------------+----------------+---------group_name | role_name---------------+----------------EMEALabAdmins | SuperUserLabAdmins | LifecycleAdminLabUsers | Monitor(3 rows)keycloak=# SELECT keycloak_group.name AS group_name,group_attribute.name AS attribute_name, value FROM group_attribute JOIN keycloak_group ON (group_attribute.group_id = keycloak_group.id);group_name | attribute_name | valueEMEALabAdmins | remote_type | LdapEMEALabAdmins | SuperUser | GLB:GLBEMEALabAdmins | is_remote | trueLabAdmins | remote_type | LdapLabAdmins | LifecycleAdmin | GLB:GLBLabAdmins | is_remote | trueLabUsers | remote_type | LdapLabUsers | Monitor | GLB:GLBLabUsers | is_remote | true(9 rows)keycloak=# \q
如果 Keycloak 数据库中仍保留任何过时的 LDAP 组,则可以使用以下过程手动删除它们:
Keycloak 数据库备份和keycloak_group数据库表清理命令。
提醒:有时不需要手动清理键盘斗篷。
我们应该使用 PFMP UI 删除提供程序(始终首先从 PFMP 中删除),然后使用 /auth/ URL 确认它已从 keycloak 中清除。
如何从任何一个 MVM 检查 keycloak 中的 LDAP 组计数:
# 运行此命令以首先设置变量。
cmo_pri=$(kubectl get pods -n powerflex -l='postgres-operator.crunchydata.com/role=master,postgres-operator.crunchydata.com/instance-set' -o name)
#check count of groups in keycloak
kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak -c "SELECT COUNT (*) FROM keycloak_group;"
# We usually want 0 groups after removing the LDAP provider.
#Backup the current keycloak DB before any edits.
kubectl exec -it -n powerflex $cmo_pri -- bash -c 'pg_dump -U postgres -d keycloak' >/home/delladmin/keycloak.sql
#delete all entries inside of keycloak_group (and related roles and attributes) while preserving its structure
kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak -c "DELETE FROM group_attribute;"
kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak -c "DELETE FROM group_role_mapping;"
kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak -c "DELETE FROM keycloak_group;"
#check that the group count has reduced:
kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak -c "SELECT COUNT (*) FROM keycloak_group;"
仅当提供程序数据保留在后端时,才会在 PFMP UI 中首次删除之后才会出现这种情况。 如果您使用的是PFxM 4.6.0.1,您还可以执行以下方法在Keycloak UI中删除导入的用户:
- 以 keycloak 用户身份使用 /auth/ 登录
- Keycloak 密码对于每次安装都是唯一的,可以使用以下方式在任何 MVM 上找到:
kubectl get secret -n powerflex keycloak-admin-credentials -o jsonpath="{.data.password}" | base64 --decode; echo
3.用户联合 -> LDAP -> 设置,然后在右上角的作下拉列表中选择 删除导入。

清理并删除组和目录提供程序后,重新启动三个 MVM 节点。
-注意:仅当环境较大且 LDAP 查询重复叠加时,才需要这样做,如本例中的日志中所示。
- 如果环境没有因同步问题而过载,并且 UI 稳定,则通常可以跳过 MVM 重新启动。不过,总的来说,这是一个很好的衡量标准。
重新启动知识库 https://www.dell.com/support/kbdoc/en-us/000225550
MVM 正常重新启动(一次必须运行一个节点)在验证数据库是否报告同步待机之前,请勿移至下一个节点。
#As 最佳实践,请确定作为当前 Postgres 领导者的节点,最后重新启动此节点。
在任何 MVM 上 #Run 以下命令,以列出关联的数据库状态和数据库名称。
kubectl exec -n powerflex -c database $(kubectl get pods -n powerflex -l='postgres-operator.crunchydata.com/role=master, postgres-operator.crunchydata.com/instance-set' | grep Running | cut -d' ' -f1) -- sh -c 'patronictl list'
#Run 此命令以确定哪个 MVM 节点托管 postgres 数据库 pod。
for x in `kubectl get pods -n powerflex | grep "postgres-ha-cmo" |awk '{print $1}'` ; do echo $x; kubectl get pods -n powerflex $x -o json | grep '"nodeName"' | cut -d ':' -f2 ; echo " "; done
#On 作为 Postgres Leader pod 实例的 MVM。 运行“watch kubectl get nodes”以监视重新启动的状态。此 MVM 必须是将重新启动的最后一个节点。
#如果 pfmp-mgmt-1 是 Postgres 领导者,则重新启动顺序示例。根据哪个 MVM 是 Postgres Leader,调整以下命令的顺序。
打开连接到第三个 MVM 的终端并运行前两个命令。
kubectl label
node pfmp-mgmt-3 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-3 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When 节点从重新启动中恢复。运行以下命令。
kubectl uncordon pfmp-mgmt-3 ; kubectl label node pfmp-mgmt-3 cmo.maintenance.mode-
#Run 以下命令,直到与 MVM3 关联的数据库报告同步待机。此时,您可以转到下一个 MVM。
kubectl exec -n powerflex -c database $(kubectl get pods -n powerflex -l='postgres-operator.crunchydata.com/role=master, postgres-operator.crunchydata.com/instance-set' | grep Running | cut -d' ' -f1) -- sh -c 'patronictl list'
打开连接到第二个 MVM 的终端并运行前两个命令。
kubectl label node pfmp-mgmt-2 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-2 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When 节点从重新启动中恢复。 运行以下命令。
kubectl uncordon pfmp-mgmt-2 ; kubectl label node pfmp-mgmt-2 cmo.maintenance.mode-
#Run 以下命令,直到与 MVM2 关联的数据库报告同步待机。此时,您可以转到下一个 MVM。
kubectl exec -n powerflex -c database $(kubectl get pods -n powerflex -l='postgres-operator.crunchydata.com/role=master, postgres-operator.crunchydata.com/instance-set' | grep Running | cut -d' ' -f1) -- sh -c 'patronictl list'
#Run 以下命令以使用此 MVM 作为监视 MVM 的节点状态。
'watch kubectl get nodes'
转到连接到第一个运行“watch kubectl get nodes”的 MVM 的终端。 按 ctrl+c 返回终端并运行前两个命令。
kubectl label
node pfmp-mgmt-1 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-1 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When 节点从重新启动中恢复。 运行以下命令。
kubectl uncordon pfmp-mgmt-1 ; kubectl label node pfmp-mgmt-1 cmo.maintenance.mode-
#Run 以下命令,直到与 MVM1 关联的数据库报告同步待机。 此 MVM 是领导者,但当 MVM1 耗尽时,新的领导者将接管。
kubectl exec -n powerflex -c database $(kubectl get pods -n powerflex -l='postgres-operator.crunchydata.com/role=master, postgres-operator.crunchydata.com/instance-set' | grep Running | cut -d' ' -f1) -- sh -c 'patronictl list'
结束 MVM 正常重新启动过程
重新启动并恢复 PFMP 的 UI 后,以管理员身份登录,并使用以下步骤添加 Settings -> Directory Provider :
3.LDAP 提供程序重建
如准备部分所述,如果要在 PFMP 中使用的任何组中存在子 AD 域或 AD 域信任帐户,则应使用全局目录 (GC) LDAP 端口 3268(普通)和 3269 (SSL)。
例如
ldaps://ad.ldap.corporate.domain.com:3269Users DN: DC=powerflex,DC=lab,DC=dell,DC=com Bind DN:DOMAIN\svc_ldapbindaccountUsername LDAP attribute: sAMAccountName UUID LDAP attribute: objectGUID User Object Classes: Person This field has a 64 character limit in PFMP UI only. You can put one group in to prevent 'full' directory sync, then use the keycloak UI to refine and add on to the group filter. Group LDAP Filter: (|(CN=FLEXLAB-APP-PROD-SDS-Admin)(CN=LabAdmins)) Timeout 22222
4.窄 LDAP 用户和组范围应用程序
以 keycloak 用户身份使用 /auth/ 登录
用户筛选器:
# PFMP UI 中缺少用户 LDAP 过滤器,因此我们需要使用以下命令进行更改。
必须在 Keycloak PowerFlex 领域中应用 #This 筛选器(PowerFlex --> 用户联合 --> 用户 LDAP 筛选器)
用户 LDAP 筛选器:
(&(objectCategory=Person)(sAMAccountName=*)(|(memberOf=CN=FLEXLAB-APP-PROD-SDS-Admin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)(memberOf=CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)(memberOf=CN=LabUsers,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)))
保存 更改。
此窄筛选器的说明:
objectCategory 等于 Person。
和
sAMAccountName 已存在
和
memberOf equals CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
或
memberOf equals CN=FLEX-STOR-MON,OU=15G,OU=FLEXLAB,DC=powerflex,DC=lab,DC=dell,DC=com
从 <https://ldap-builder.powerflex.lab.dell.com/>
用户联合 -> LDAP -> 设置,然后在右上角的作下拉列表中选择删除导入。

4.6.x+ UI 用于删除组映射的方法。

在“Membership User LDAP Attribute”的 LDAP 组映射设置中,我们还需要确保在 keycloak UI 中以“cn”形式发送且无法在 PFMP UI 中更改为 DN 的正确值。

在组 LDAP 筛选器中,我们可以列出“非此即彼”运算符 | 以及每组的 CN,例如
(|(CN=FLEXLAB-APP-PROD-SDS-Admin)(CN=CN=PRV_US_SA_SRV_SVS))