在多節點 AI Data Engine 部署上為 SMB/CIFS 共用區設定 Kerberos
使用 Kerberos 驗證掃描多節點 AI Data Engine (AIDE) 部署中的 SMB/CIFS 共用區,這樣資料來源中就不會儲存任何密碼。每個節點都使用相同的 Kerberos 組態,而且 AI Data Engine 會自動更新 Kerberos 票證。
如果您採用單節點部署,請參閱 "在單節點 AI Data Engine 部署中為 SMB/CIFS 共用區設定 Kerberos"。
開始之前
-
您擁有 AI Data Engine 系統管理員 權限。
-
您擁有所有節點和管理主機的 root 存取權。管理主機是您裝載 NFS 匯出並建立 keytab 的主機。它可以是其中一個節點。
-
您可以 `kubectl`從管理主機以 cluster-admin 權限存取您的 Kubernetes 叢集。如果您使用 kubeconfig 檔案,請將 `KUBECONFIG`環境變數設定為其路徑。
-
您已檢閱 "連網需求" 和 "Kerberos 和 Active Directory 的要求",包括時間同步和 DNS。
-
您已驗證每個節點可透過 TCP 連接埠 2049 存取 NFS 伺服器,透過連接埠 88 存取 KDC,透過連接埠 445 存取檔案伺服器,並透過連接埠 53 存取 DNS 伺服器。
-
您已驗證 NTP 在每個節點上都處於作用中,且每個時鐘都與您的網域控制器同步。若要檢查,請執行
timedatectl。
-
您在 Active Directory 中擁有一個掃描服務帳戶,該帳戶對要掃描的 SMB/CIFS 共用區具有讀取存取權。該帳戶必須支援 AES256 加密。
-
您擁有以下資訊:
項目 說明 範例 KDC IP 位址
充當 Kerberos 金鑰經銷中心(KDC)的網域控制器的 IP 位址
10.0.1.50KDC FQDN
同一網域控制器的完全符合資格的網域名稱 (FQDN)
dc.corp.example.com網域
Active Directory 網域,小寫
corp.example.com領域
Kerberos 領域,即大寫的網域
CORP.EXAMPLE.COM掃描使用者
具有共享讀取存取的服務帳戶
svc-aide掃描密碼
掃描使用者的密碼。僅在建立 keytab 時輸入。
不適用
檔案伺服器 FQDN
託管共享的檔案伺服器的 FQDN。請勿使用 IP 位址。
filer.corp.example.com共用名稱
SMB/CIFS 共用區的名稱
sharename
AI Data Engine 使用的 Kerberos 檔案
您需要在儲存 AI Data Engine 組態的 NFS 匯出中建立以下檔案。在下表中, <export> 是該匯出的根目錄。
| 檔案 | 匯出位置 |
|---|---|
Kerberos 組態 |
|
金鑰表 |
|
主要檔案 |
|
票證快取目錄 |
|
安裝所需的套件
在任何沒有 `cifs-utils`的節點上,對 SMB/CIFS 共用區的 Kerberos 掃描都會失敗。SMB/CIFS 裝載在 AI Data Engine 內部執行,但節點的作業系統會呼叫 `cifs-utils`元件來設定 Kerberos 工作階段。僅在管理主機上安裝套件是不夠的。
| 套件 | 管理主機 | 每個節點 |
|---|---|---|
|
必填 |
無需 |
|
必填 |
必填 |
Kerberos 用戶端工具提供了 ktutil、 kinit 和 klist 命令,用於建立和測試 keytab。
-
在管理主機上,安裝 Kerberos 用戶端工具與
cifs-utils。-
在 Ubuntu 或 Debian 系統上,執行以下命令。
apt-get update -qq apt-get install -y krb5-user cifs-utils -
在 RHEL、CentOS 或 Rocky Linux 上,執行以下命令。
dnf -y install krb5-workstation cifs-utils
-
-
在其他所有節點上安裝
cifs-utils。-
在 Ubuntu 或 Debian 系統上,執行以下命令。
apt-get update -qq apt-get install -y cifs-utils -
在 RHEL、CentOS 或 Rocky Linux 上,執行以下命令。
dnf -y install cifs-utils
-
-
在每個節點上,驗證安裝。
which cifs.upcall
在管理主機上裝載 NFS 匯出
從管理主機存取共享的組態匯出,以便您可以建立每個節點都可以讀取的 Kerberos 檔案。
-
設定 AI Data Engine 運作所在的命名空間,並驗證組態 Volume 宣告是否已綁定。預設命名空間為
aide。export NAMESPACE="<namespace>" kubectl -n "${NAMESPACE}" get pvc aide-config-pvc狀態必須為
Bound。 -
取得 NFS 伺服器和組態 Volume 的匯出路徑。您在部署 AI Data Engine 時指定了這些值。
kubectl get pv aide-config-pv -o jsonpath='NFS server: {.spec.nfs.server}{"\n"}Export path: {.spec.nfs.path}{"\n"}' -
裝載匯出。將
<nfs_server>和<export_path>替換為上一個步驟中的值。命令使用/mnt/aide-config作為安裝點。您可以使用任何空目錄。mkdir -p /mnt/aide-config mount -t nfs <nfs_server>:<export_path> /mnt/aide-config -
建立 Kerberos 目錄。
export AIDE_CONFIG_ROOT="/mnt/aide-config" mkdir -p "${AIDE_CONFIG_ROOT}/kerberos/kerberos_refresher" mkdir -p "${AIDE_CONFIG_ROOT}/kerberos/kerberos_ccache"
建立 Kerberos 檔案
為 AI Data Engine 提供取得掃描服務帳戶 Kerberos 票證所需的組態和憑證。在管理主機上執行下列步驟。
-
設定以下命令使用的變數。將尖括號內的每個值替換為您的值,且不要包含尖括號。輸入大寫的 realm 和小寫的 domain。
export KDC_IP="<kdc_ip>" export KDC_FQDN="<kdc_fqdn>" export AD_DOMAIN="<domain>" export REALM="<REALM>" export SCAN_USER="<scan_user>" export FILE_SERVER_FQDN="<file_server_fqdn>" export SHARE_NAME="<share_name>" export KRB5_CONF_SOURCE="${AIDE_CONFIG_ROOT}/kerberos/krb5.conf" export KRB5_KEYTAB="${AIDE_CONFIG_ROOT}/kerberos/kerberos_refresher/datasense.keytab" export KRB5_CREDS="${AIDE_CONFIG_ROOT}/kerberos/kerberos_refresher/kerberos_creds.env"-
請確認變數已設定。
echo "NAMESPACE=[${NAMESPACE}] AIDE_CONFIG_ROOT=[${AIDE_CONFIG_ROOT}] KDC_IP=[${KDC_IP}] REALM=[${REALM}] SCAN_USER=[${SCAN_USER}]"這些變數僅存在於目前 shell 工作階段中。如果開啟新的 shell,請重新設定它們。
-
-
在 NFS 匯出上建立 Kerberos 組態檔案。AI Data Engine 會從匯出讀取此檔案。請勿在節點上的 `/etc/krb5.conf`中建立它。
tee "${KRB5_CONF_SOURCE}" >/dev/null <<EOF [libdefaults] default_realm = ${REALM} dns_lookup_realm = false dns_lookup_kdc = false rdns = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true [realms] ${REALM} = { kdc = ${KDC_IP}:88 admin_server = ${KDC_IP}:749 } [domain_realm] .${AD_DOMAIN} = ${REALM} ${AD_DOMAIN} = ${REALM} EOF chmod 644 "${KRB5_CONF_SOURCE}"該檔案使用 KDC IP 位址,因此 Kerberos 驗證不依賴 DNS。
-
為掃描服務帳戶建立金鑰表。
-
執行
ktutil。 -
在
ktutil提示符號處,輸入以下命令。將<scan_user>和<REALM>替換為您的值。ktutil提示符號不會使用 shell 變數。addent -password -p <scan_user>@<REALM> -k 1 -e aes256-cts-hmac-sha1-96 -
當
ktutil提示輸入密碼時,請輸入掃描使用者的密碼。 -
在 `ktutil`提示符號處,輸入以下命令。
wkt /tmp/krb5.keytab quit
-
-
測試 keytab。該
KRB5_CONFIG變數將 Kerberos 工具指向匯出上的檔案。export KRB5_CONFIG="${KRB5_CONF_SOURCE}" klist -kt /tmp/krb5.keytab kinit -kt /tmp/krb5.keytab "${SCAN_USER}@${REALM}" klist kdestroy第二個 `klist`命令必須顯示掃描使用者的有效票據。票據確認金鑰表和與金鑰分發中心(KDC)的連線正常。如果 `kinit`失敗,請參閱疑難排解 Kerberos 驗證。
-
安裝 keytab,然後刪除臨時複本。
install -m 640 -g 4321 /tmp/krb5.keytab "${KRB5_KEYTAB}" rm -f /tmp/krb5.keytab -
讓工單快取目錄可供工單重新整理程式寫入。
chown root:4321 "${AIDE_CONFIG_ROOT}/kerberos/kerberos_ccache" chmod 770 "${AIDE_CONFIG_ROOT}/kerberos/kerberos_ccache"票據刷新程式以 root 使用者身分執行,群組 ID 為 4321。它必須能夠讀取 keytab 和 principal 檔案,並且必須能夠寫入票據快取目錄。
-
建立主檔案。該
KRB5_RENEW_INTERVAL_H值是票證更新間隔(以小時為單位)。tee "${KRB5_CREDS}" >/dev/null <<EOF KRB5_USER=${SCAN_USER} KRB5_REALM=${REALM} KRB5_RENEW_INTERVAL_H=3 EOF chmod 640 "${KRB5_CREDS}" chgrp 4321 "${KRB5_CREDS}" -
請確認檔案已就位。
ls -l "${KRB5_CONF_SOURCE}" "${KRB5_KEYTAB}" "${KRB5_CREDS}"
驗證名稱解析
AI Data Engine 透過每個節點的 DNS 設定來解析檔案伺服器和 KDC。首先驗證名稱解析,僅當名稱在節點上無法解析時才變更 DNS 設定。
-
在每個節點上,驗證檔案伺服器和 KDC 是否能透過 FQDN 解析。將值替換為您的檔案伺服器 FQDN 和 KDC FQDN。
nslookup <file_server_fqdn> nslookup <kdc_fqdn> -
查看結果。
-
如果兩個名稱在每個節點上都能解析為正確的 IP 位址,請繼續至 開始首次票證重新整理。
-
如果名稱在任何節點上都無法解析,請完成 修復名稱解析,然後返回此程序。
-
開始首次票證重新整理
AI Data Engine 每三小時重新整理一次掃描服務帳戶的 Kerberos 票證。請啟動首次重新整理,以便您可以立即掃描共享。
|
|
請勿在主機 crontab 中新增 kinit 項目。AI Data Engine 會自動重新整理工單。
|
-
在管理主機上,啟動重新整理作業,等待完成,並顯示其日誌。
JOB="kerberos-refresh-$(date +%s)" kubectl -n "${NAMESPACE}" create job "${JOB}" --from=cronjob/ds-krb5-ticket-refresher kubectl -n "${NAMESPACE}" wait --for=condition=complete "job/${JOB}" --timeout=120s kubectl -n "${NAMESPACE}" logs "job/${JOB}" -
確認共享的票證快取存在且時間戳記較新。
ls -l "${AIDE_CONFIG_ROOT}/kerberos/kerberos_ccache/krb5cc_shared"
作業日誌顯示已為掃描使用者取得票證。
驗證 Kerberos 組態
在新增共享之前,請先驗證 AI Data Engine 是否可以使用 Kerberos 檔案並解析名稱。由於裝載服務可以在多個節點上執行,因此請在每個節點上對 Pod 重複檢查。如果您開啟了新的 shell,請重新設定 NAMESPACE、 FILE_SERVER_FQDN 和 SHARE_NAME 變數。
-
列出裝載服務 pod 及其運作所在的節點。
kubectl -n "${NAMESPACE}" get pods -l app.kubernetes.io/name=ds-mount-server -o wide -
對每個 pod 執行以下命令。將 `<pod_name>`替換為 pod 的名稱。
POD=<pod_name> kubectl -n "${NAMESPACE}" exec "${POD}" -- nslookup "${FILE_SERVER_FQDN}" kubectl -n "${NAMESPACE}" exec "${POD}" -- klist kubectl -n "${NAMESPACE}" exec "${POD}" -- cat /etc/krb5.conf -
(選用)使用 Kerberos 測試共享的裝載。
kubectl -n "${NAMESPACE}" exec "${POD}" -- sh -c "mount -t cifs -o sec=krb5,multiuser //${FILE_SERVER_FQDN}/${SHARE_NAME} /mnt && ls -l /mnt && umount /mnt"
在每個節點上,檔案伺服器會解析為正確的 IP 位址, klist 顯示掃描使用者的票證,而 /etc/krb5.conf 顯示 Kerberos 組態檔案的內容。
新增使用 Kerberos 的 SMB/CIFS 資料來源
將該共享新增為資料來源並開始掃描,以便 AI Data Engine 可以開始分析其資料。
-
在 AI Data Engine 使用者介面中,選擇 組態。
-
在 已掃描系統 標籤上,選擇 新增系統。
-
選取 檔案共享群組。
-
請輸入群組名稱。
-
請以 `<file_server_fqdn>/<share_name>`格式輸入共享路徑。請將預留位置替換為您的值。請勿使用 IP 位址。
-
身分驗證方法請選擇 Kerberos。將使用者名稱和密碼欄位留空。
-
檢閱您的選擇,然後選擇 確認。
-
為新系統選擇 啟用掃描。
如需連接資料來源的詳細資訊,請參閱 "將資料來源連接到 AI Data Engine"。
修復名稱解析
僅當檔案伺服器或 KDC 在節點上無法透過 FQDN 解析時才執行此程序。它會將您的 Active Directory DNS 伺服器設定為每個節點上的唯一名稱伺服器。
|
|
將您的 Active Directory DNS 伺服器設為每個節點上唯一的名稱伺服器。叢集會隨機選擇一個已列出的名稱伺服器,因此無法解析 Active Directory 名稱的名稱伺服器會導致間歇性故障。 |
-
請確認您的 Active Directory DNS 伺服器也能解析外部名稱。
-
執行下列命令。將 `<external_fqdn>`取代為 AI Data Engine 必須存取的網域外名稱。例如,使用"傳出網際網路存取"中列出的端點。
nslookup <external_fqdn> "${KDC_IP}" -
如果命令失敗,請您的 Active Directory 系統管理員啟用 DNS 轉發,然後重複此步驟。
-
-
在每個節點上,備份
/etc/resolv.conf,並將您的 Active Directory DNS 伺服器設定為唯一的名稱伺服器。如果您在節點上開啟新的 shell,請再次設定 `KDC_IP`變數。export KDC_IP="<kdc_ip>" cp /etc/resolv.conf /etc/resolv.conf.bak ORIG_SEARCH=$(grep '^search' /etc/resolv.conf.bak | head -1 | cut -d' ' -f2-) printf 'search %s\nnameserver %s\n' "${ORIG_SEARCH}" "${KDC_IP}" > /etc/resolv.conf -
在每個節點上,防止網路管理程式在重新啟動後覆寫 DNS 設定。
-
在具有 NetworkManager 的 RHEL 上,執行下列命令。
mkdir -p /etc/NetworkManager/conf.d printf '[main]\ndns=none\n' > /etc/NetworkManager/conf.d/90-dns-none.conf systemctl reload NetworkManager -
在安裝了 systemd-resolved 的 Ubuntu 系統上,執行以下命令。將 `<domain>`替換為您的網域。
export AD_DOMAIN="<domain>" mkdir -p /etc/systemd/resolved.conf.d printf '[Resolve]\nDNS=%s\nDomains=%s\n' "${KDC_IP}" "${AD_DOMAIN}" > /etc/systemd/resolved.conf.d/ad-dns.conf systemctl restart systemd-resolved
-
-
從管理主機重新啟動 CoreDNS,以便 AI Data Engine 使用新的 DNS 設定。您只需對叢集執行一次此步驟。CoreDNS 會將叢集外部的名稱查詢轉送至節點的
/etc/resolv.conf檔案中的名稱伺服器,因此必須重新啟動才能套用變更。-
找到 CoreDNS 部署。
kubectl -n kube-system get deployments | grep -i coredns -
重新啟動部署。將 `<coredns_deployment>`替換為上一個命令中的名稱。
kubectl -n kube-system rollout restart deployment <coredns_deployment> kubectl -n kube-system rollout status deployment <coredns_deployment> --timeout=120s
-
-
再次驗證名稱解析。請參閱驗證名稱解析。
更新 Kerberos 組態檔案
如果您在設定後取代 NFS 匯出上的 krb5.conf(例如,透過複製新檔案覆蓋它),AI Data Engine 會繼續使用先前的檔案,直到您重新啟動受影響的服務。
-
在管理主機上,重新啟動裝載服務,並刪除先前的票證重新整理作業。
kubectl -n "${NAMESPACE}" rollout restart daemonset ds-mount-server kubectl -n "${NAMESPACE}" delete job -l app.kubernetes.io/name=ds-krb5-ticket-refresher --ignore-not-found -
開始新的票證重新整理。請參閱 開始首次票證重新整理。
疑難排解 Kerberos 驗證
找出 Kerberos 故障的原因,並還原對 SMB/CIFS 共用區的掃描。
| 症狀 | 可能的原因 | 解決方案 |
|---|---|---|
新增共享時出現錯誤 IP 不允許與 Kerberos 一起使用。 |
共享路徑使用 IP 位址。 |
以 FQDN 輸入共享路徑。 |
|
密碼或網域不正確,網域不是大寫,掃描帳戶不支援 AES256 加密,管理主機或節點無法透過連接埠 88 存取 KDC,或節點上的時鐘與 KDC 的時鐘偏差超過了允許的偏差。 |
驗證密碼和網域,並確認該帳戶支援 AES256 加密。開啟通往 KDC 的連接埠 88,並確認每個節點上的 NTP 已作用中。然後再次建立 keytab。 |
票證重新整理作業失敗,或未建立票證快取。 |
keytab、主體檔案或 |
確認檔案存在於 AI Data Engine 使用的 Kerberos 檔案 所列的位置。確認 keytab 和主體檔案的模式為 640 且群組為 4321。確認票據快取目錄的擁有者為 |
名稱間歇性無法解析,或在節點上可以解析,但在 AI Data Engine 中無法解析。 |
一個節點列出多個名稱伺服器,且其中一個無法解析 Active Directory 名稱,或者在您變更 `/etc/resolv.conf`後未重新啟動 CoreDNS。 |
在每個節點上移除除了 Active Directory DNS 伺服器以外的所有名稱伺服器,然後重新啟動 CoreDNS。請參閱修復名稱解析。 |
設定 Active Directory DNS 伺服器後,外部名稱無法在 AI Data Engine 中解析。 |
Active Directory DNS 伺服器不會轉送外部查詢。 |
驗證 `nslookup <external_fqdn> "${KDC_IP}"`是否回傳結果。如果沒有,請您的 Active Directory 系統管理員啟用 DNS 轉發。 |
Kerberos 掃描在一個節點上可正常運作,但在其他節點上失敗。出現錯誤 裝載 error(2),並且 `dmesg`在節點上顯示 無法使用 Kerberos 建立新的 SMB 工作階段。 |
|
在每個節點上安裝 |
出現錯誤 mount error(126)。 |
AI Data Engine 無法從 NFS 匯出讀取 |
驗證 `<export>/kerberos/krb5.conf`是否存在,且 `kubectl -n "${NAMESPACE}" exec <pod_name> -- cat /etc/krb5.conf`顯示其內容。 |
對 `krb5.conf`的變更不會生效。 |
設定後檔案被替換,且 AI Data Engine 仍然使用先前的檔案。 |
請參閱 更新 Kerberos 組態檔案。 |
找不到 |
管理主機上未安裝 Kerberos 用戶端工具。 |
安裝 Kerberos 用戶端工具。請參閱 安裝所需的套件。 |
節點上的 |
網路管理程式覆寫了該檔案。 |
防止網路管理程式覆寫 DNS 設定。請參閱 修復名稱解析。 |
移除 Kerberos 組態
如果您不再使用 Kerberos 掃描 SMB/CIFS 共享,請移除資料來源和 Kerberos 檔案。
-
從 AI Data Engine UI 刪除使用 Kerberos 的 SMB/CIFS 資料來源。
-
在管理主機上,將 NFS 匯出裝載於
/mnt/aide-config,刪除 Kerberos 檔案。rm -f /mnt/aide-config/kerberos/kerberos_refresher/datasense.keytab rm -f /mnt/aide-config/kerberos/kerberos_refresher/kerberos_creds.env rm -f /mnt/aide-config/kerberos/krb5.conf rm -f /mnt/aide-config/kerberos/kerberos_ccache/krb5cc_shared umount /mnt/aide-config -
如果您變更了 DNS 設定,請還原原始設定。
-
在每個節點上,還原 `/etc/resolv.conf`的備份。
cp /etc/resolv.conf.bak /etc/resolv.conf -
在已新增 NetworkManager 組態的 RHEL 節點上,將其移除。
rm -f /etc/NetworkManager/conf.d/90-dns-none.conf systemctl reload NetworkManager -
在新增了 systemd-resolved 組態的 Ubuntu 節點上,將其移除。
rm -f /etc/systemd/resolved.conf.d/ad-dns.conf systemctl restart systemd-resolved -
從管理主機重新啟動 CoreDNS。將 `<coredns_deployment>`替換為 CoreDNS 部署的名稱。
kubectl -n kube-system rollout restart deployment <coredns_deployment>
-