| load1 | `sum(node_load1) by (instance) / count(node_cpu_seconds_total{mode="system"}) by (instance)` |
| load5 | `sum(node_load5) by (instance) / count(node_cpu_seconds_total{mode="system"}) by (instance)` |
| load15 | `sum(node_load15) by (instance) / count(node_cpu_seconds_total{mode="system"}) by (instance)` |
| load1 | `sum(node_load1) by (instance) / count(node_cpu_seconds_total{mode="system"})` |
| load5 | `sum(node_load5) by (instance) / count(node_cpu_seconds_total{mode="system"})` |
| load15 | `sum(node_load15) by (instance) / count(node_cpu_seconds_total{mode="system"})` |
| read | `sum(rate(node_disk_read_bytes_total[5m])) by (instance)` |
| written | `sum(rate(node_disk_written_bytes_total[5m])) by (instance)` |
| read | `sum(rate(node_disk_read_bytes_total[5m]))` |
| written | `sum(rate(node_disk_written_bytes_total[5m]))` |
| receive-dropped | sum(rate(node_network_receive_drop_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) by (instance) |
| receive-errs | sum(rate(node_network_receive_errs_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) by (instance) |
| receive-packets | sum(rate(node_network_receive_packets_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) by (instance) |
| transmit-dropped | sum(rate(node_network_transmit_drop_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) by (instance) |
| transmit-errs | sum(rate(node_network_transmit_errs_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) by (instance) |
| transmit-packets | sum(rate(node_network_transmit_packets_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) by (instance) |
| receive-dropped | sum(rate(node_network_receive_drop_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) |
| receive-errs | sum(rate(node_network_receive_errs_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) |
| receive-packets | sum(rate(node_network_receive_packets_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) |
| transmit-dropped | sum(rate(node_network_transmit_drop_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) |
| transmit-errs | sum(rate(node_network_transmit_errs_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) |
| transmit-packets | sum(rate(node_network_transmit_packets_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) |
| receive | sum(rate(node_network_receive_bytes_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) by (instance) |
| transmit | sum(rate(node_network_transmit_bytes_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) by (instance) |
| receive | sum(rate(node_network_receive_bytes_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) |
| transmit | sum(rate(node_network_transmit_bytes_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*"}[5m])) |
| load1 | `sum(node_load1{instance=~"$instance"}) / count(node_cpu_seconds_total{mode="system",instance=~"$instance"})` |
| load5 | `sum(node_load5{instance=~"$instance"}) / count(node_cpu_seconds_total{mode="system",instance=~"$instance"})` |
| load15 | `sum(node_load15{instance=~"$instance"}) / count(node_cpu_seconds_total{mode="system",instance=~"$instance"})` |
| load1 | `sum(node_load1{instance=~"$instance"}) / count(node_cpu_seconds_total{mode="system",instance=~"$instance"})` |
| load5 | `sum(node_load5{instance=~"$instance"}) / count(node_cpu_seconds_total{mode="system",instance=~"$instance"})` |
| load15 | `sum(node_load15{instance=~"$instance"}) / count(node_cpu_seconds_total{mode="system",instance=~"$instance"})` |
| read | `sum(rate(node_disk_read_bytes_total{instance=~"$instance"}[5m]))` |
| written | `sum(rate(node_disk_written_bytes_total{instance=~"$instance"}[5m]))` |
| read | `sum(rate(node_disk_read_bytes_total{instance=~"$instance"}[5m]))` |
| written | `sum(rate(node_disk_written_bytes_total{instance=~"$instance"}[5m]))` |
| receive-dropped | sum(rate(node_network_receive_drop_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) by (device) |
| receive-errs | sum(rate(node_network_receive_errs_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) by (device) |
| receive-packets | sum(rate(node_network_receive_packets_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) by (device) |
| transmit-dropped | sum(rate(node_network_transmit_drop_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) by (device) |
| transmit-errs | sum(rate(node_network_transmit_errs_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) by (device) |
| transmit-packets | sum(rate(node_network_transmit_packets_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) by (device) |
| receive-dropped | sum(rate(node_network_receive_drop_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) |
| receive-errs | sum(rate(node_network_receive_errs_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) |
| receive-packets | sum(rate(node_network_receive_packets_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) |
| transmit-dropped | sum(rate(node_network_transmit_drop_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) |
| transmit-errs | sum(rate(node_network_transmit_errs_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) |
| transmit-packets | sum(rate(node_network_transmit_packets_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) |
| receive | sum(rate(node_network_receive_bytes_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) by (device) |
| transmit | sum(rate(node_network_transmit_bytes_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) by (device) |
| receive | sum(rate(node_network_receive_bytes_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) |
| transmit | sum(rate(node_network_transmit_bytes_total{device!~"lo | veth.* | docker.* | flannel.* | cali.* | cbr.*",instance=~"$instance"}[5m])) |
| in | `sum(rate(etcd_network_client_grpc_received_bytes_total[5m])) by (instance)` |
| out | `sum(rate(etcd_network_client_grpc_sent_bytes_total[5m])) by (instance)` |
| in | `sum(rate(etcd_network_client_grpc_received_bytes_total[5m]))` |
| out | `sum(rate(etcd_network_client_grpc_sent_bytes_total[5m]))` |
| in | `sum(rate(etcd_network_peer_received_bytes_total[5m])) by (instance)` |
| out | `sum(rate(etcd_network_peer_sent_bytes_total[5m])) by (instance)` |
| in | `sum(rate(etcd_network_peer_received_bytes_total[5m]))` |
| out | `sum(rate(etcd_network_peer_sent_bytes_total[5m]))` |
| lease-watch | `sum(grpc_server_started_total{grpc_service="etcdserverpb.Lease",grpc_type="bidi_stream"}) by (instance) - sum(grpc_server_handled_total{grpc_service="etcdserverpb.Lease",grpc_type="bidi_stream"}) by (instance)` |
| watch | `sum(grpc_server_started_total{grpc_service="etcdserverpb.Watch",grpc_type="bidi_stream"}) by (instance) - sum(grpc_server_handled_total{grpc_service="etcdserverpb.Watch",grpc_type="bidi_stream"}) by (instance)` |
| lease-watch | `sum(grpc_server_started_total{grpc_service="etcdserverpb.Lease",grpc_type="bidi_stream"}) - sum(grpc_server_handled_total{grpc_service="etcdserverpb.Lease",grpc_type="bidi_stream"})` |
| watch | `sum(grpc_server_started_total{grpc_service="etcdserverpb.Watch",grpc_type="bidi_stream"}) - sum(grpc_server_handled_total{grpc_service="etcdserverpb.Watch",grpc_type="bidi_stream"})` |
| applied | `sum(increase(etcd_server_proposals_applied_total[5m])) by (instance)` |
| committed | `sum(increase(etcd_server_proposals_committed_total[5m])) by (instance)` |
| pending | `sum(increase(etcd_server_proposals_pending[5m])) by (instance)` |
| failed | `sum(increase(etcd_server_proposals_failed_total[5m])) by (instance)` |
| applied | `sum(increase(etcd_server_proposals_applied_total[5m]))` |
| committed | `sum(increase(etcd_server_proposals_committed_total[5m]))` |
| pending | `sum(increase(etcd_server_proposals_pending[5m]))` |
| failed | `sum(increase(etcd_server_proposals_failed_total[5m]))` |
| total | `sum(rate(grpc_server_started_total{grpc_type="unary"}[5m])) by (instance)` |
| fail | `sum(rate(grpc_server_handled_total{grpc_type="unary",grpc_code!="OK"}[5m])) by (instance)` |
| total | `sum(rate(grpc_server_started_total{grpc_type="unary"}[5m]))` |
| fail | `sum(rate(grpc_server_handled_total{grpc_type="unary",grpc_code!="OK"}[5m]))` |
| commit-called-by-backend | `sum(rate(etcd_disk_backend_commit_duration_seconds_sum[1m])) by (instance)` |
| fsync-called-by-wal | `sum(rate(etcd_disk_wal_fsync_duration_seconds_sum[1m])) by (instance)` |
| commit-called-by-backend | `sum(rate(etcd_disk_backend_commit_duration_seconds_sum[1m]))` |
| fsync-called-by-wal | `sum(rate(etcd_disk_wal_fsync_duration_seconds_sum[1m]))` |
| wal | `histogram_quantile(0.99, sum(rate(etcd_disk_wal_fsync_duration_seconds_bucket[5m])) by (instance, le))` |
| db | `histogram_quantile(0.99, sum(rate(etcd_disk_backend_commit_duration_seconds_bucket[5m])) by (instance, le))` |
| wal | `sum(histogram_quantile(0.99, sum(rate(etcd_disk_wal_fsync_duration_seconds_bucket[5m])) by (instance, le)))` |
| db | `sum(histogram_quantile(0.99, sum(rate(etcd_disk_backend_commit_duration_seconds_bucket[5m])) by (instance, le)))` |
| volumes | `sum(volumes_depth) by instance` |
| deployment | `sum(deployment_depth) by instance` |
| replicaset | `sum(replicaset_depth) by instance` |
| service | `sum(service_depth) by instance` |
| serviceaccount | `sum(serviceaccount_depth) by instance` |
| endpoint | `sum(endpoint_depth) by instance` |
| daemonset | `sum(daemonset_depth) by instance` |
| statefulset | `sum(statefulset_depth) by instance` |
| replicationmanager | `sum(replicationmanager_depth) by instance` |
| volumes | `sum(volumes_depth)` |
| deployment | `sum(deployment_depth)` |
| replicaset | `sum(replicaset_depth)` |
| service | `sum(service_depth)` |
| serviceaccount | `sum(serviceaccount_depth)` |
| endpoint | `sum(endpoint_depth)` |
| daemonset | `sum(daemonset_depth)` |
| statefulset | `sum(statefulset_depth)` |
| replicationmanager | `sum(replicationmanager_depth)` |
| reading | `sum(nginx_ingress_controller_nginx_process_connections{state="reading"}) by (instance)` |
| waiting | `sum(nginx_ingress_controller_nginx_process_connections{state="waiting"}) by (instance)` |
| writing | `sum(nginx_ingress_controller_nginx_process_connections{state="writing"}) by (instance)` |
| accepted | `sum(ceil(increase(nginx_ingress_controller_nginx_process_connections_total{state="accepted"}[5m]))) by (instance)` |
| active | `sum(ceil(increase(nginx_ingress_controller_nginx_process_connections_total{state="active"}[5m]))) by (instance)` |
| handled | `sum(ceil(increase(nginx_ingress_controller_nginx_process_connections_total{state="handled"}[5m]))) by (instance)` |
| reading | `sum(nginx_ingress_controller_nginx_process_connections{state="reading"})` |
| waiting | `sum(nginx_ingress_controller_nginx_process_connections{state="waiting"})` |
| writing | `sum(nginx_ingress_controller_nginx_process_connections{state="writing"})` |
| accepted | `sum(ceil(increase(nginx_ingress_controller_nginx_process_connections_total{state="accepted"}[5m])))` |
| active | `sum(ceil(increase(nginx_ingress_controller_nginx_process_connections_total{state="active"}[5m])))` |
| handled | `sum(ceil(increase(nginx_ingress_controller_nginx_process_connections_total{state="handled"}[5m])))` |
| cfs throttled seconds | `sum(rate(container_cpu_cfs_throttled_seconds_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m])) by (pod_name)` |
| user seconds | `sum(rate(container_cpu_user_seconds_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m])) by (pod_name)` |
| system seconds | `sum(rate(container_cpu_system_seconds_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m])) by (pod_name)` |
| usage seconds | `sum(rate(container_cpu_usage_seconds_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m])) by (pod_name)` |
| cfs throttled seconds | `sum(rate(container_cpu_cfs_throttled_seconds_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m]))` |
| user seconds | `sum(rate(container_cpu_user_seconds_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m]))` |
| system seconds | `sum(rate(container_cpu_system_seconds_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m]))` |
| usage seconds | `sum(rate(container_cpu_usage_seconds_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m]))` |
| receive-packets | `sum(rate(container_network_receive_packets_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m])) by (pod_name)` |
| receive-dropped | `sum(rate(container_network_receive_packets_dropped_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m])) by (pod_name)` |
| receive-errors | `sum(rate(container_network_receive_errors_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m])) by (pod_name)` |
| transmit-packets | `sum(rate(container_network_transmit_packets_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m])) by (pod_name)` |
| transmit-dropped | `sum(rate(container_network_transmit_packets_dropped_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m])) by (pod_name)` |
| transmit-errors | `sum(rate(container_network_transmit_errors_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m])) by (pod_name)` |
| receive-packets | `sum(rate(container_network_receive_packets_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m]))` |
| receive-dropped | `sum(rate(container_network_receive_packets_dropped_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m]))` |
| receive-errors | `sum(rate(container_network_receive_errors_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m]))` |
| transmit-packets | `sum(rate(container_network_transmit_packets_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m]))` |
| transmit-dropped | `sum(rate(container_network_transmit_packets_dropped_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m]))` |
| transmit-errors | `sum(rate(container_network_transmit_errors_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m]))` |
| receive | `sum(rate(container_network_receive_bytes_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m])) by (pod_name)` |
| transmit | `sum(rate(container_network_transmit_bytes_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m])) by (pod_name)` |
| receive | `sum(rate(container_network_receive_bytes_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m]))` |
| transmit | `sum(rate(container_network_transmit_bytes_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m]))` |
| read | `sum(rate(container_fs_reads_bytes_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m])) by (pod_name)` |
| write | `sum(rate(container_fs_writes_bytes_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m])) by (pod_name)` |
| read | `sum(rate(container_fs_reads_bytes_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m]))` |
| write | `sum(rate(container_fs_writes_bytes_total{namespace="$namespace",pod_name=~"$podName",container_name!=""}[5m]))` |
| cfs throttled seconds | `sum(rate(container_cpu_cfs_throttled_seconds_total{container_name!="POD",namespace="$namespace",pod_name="$podName", container_name!=""}[5m])) by (container_name)` |
| usage seconds | `sum(rate(container_cpu_usage_seconds_total{container_name!="POD",namespace="$namespace",pod_name="$podName", container_name!=""}[5m])) by (container_name)` |
| system seconds | `sum(rate(container_cpu_system_seconds_total{container_name!="POD",namespace="$namespace",pod_name="$podName", container_name!=""}[5m])) by (container_name)` |
| user seconds | `sum(rate(container_cpu_user_seconds_total{container_name!="POD",namespace="$namespace",pod_name="$podName", container_name!=""}[5m])) by (container_name)` |
| cfs throttled seconds | `sum(rate(container_cpu_cfs_throttled_seconds_total{container_name!="POD",namespace="$namespace",pod_name="$podName", container_name!=""}[5m]))` |
| usage seconds | `sum(rate(container_cpu_usage_seconds_total{container_name!="POD",namespace="$namespace",pod_name="$podName", container_name!=""}[5m]))` |
| system seconds | `sum(rate(container_cpu_system_seconds_total{container_name!="POD",namespace="$namespace",pod_name="$podName", container_name!=""}[5m]))` |
| user seconds | `sum(rate(container_cpu_user_seconds_total{container_name!="POD",namespace="$namespace",pod_name="$podName", container_name!=""}[5m]))` |
| receive-packets | `sum(rate(container_network_receive_packets_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| receive-dropped | `sum(rate(container_network_receive_packets_dropped_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| receive-errors | `sum(rate(container_network_receive_errors_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| transmit-packets | `sum(rate(container_network_transmit_packets_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| transmit-dropped | `sum(rate(container_network_transmit_packets_dropped_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| transmit-errors | `sum(rate(container_network_transmit_errors_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| receive-packets | `sum(rate(container_network_receive_packets_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| receive-dropped | `sum(rate(container_network_receive_packets_dropped_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| receive-errors | `sum(rate(container_network_receive_errors_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| transmit-packets | `sum(rate(container_network_transmit_packets_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| transmit-dropped | `sum(rate(container_network_transmit_packets_dropped_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| transmit-errors | `sum(rate(container_network_transmit_errors_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| receive | `sum(rate(container_network_receive_bytes_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| transmit | `sum(rate(container_network_transmit_bytes_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| receive | `sum(rate(container_network_receive_bytes_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| transmit | `sum(rate(container_network_transmit_bytes_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| read | `sum(rate(container_fs_reads_bytes_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m])) by (container_name)` |
| write | `sum(rate(container_fs_writes_bytes_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m])) by (container_name)` |
| read | `sum(rate(container_fs_reads_bytes_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
| write | `sum(rate(container_fs_writes_bytes_total{namespace="$namespace",pod_name="$podName",container_name!=""}[5m]))` |
docker ps 命令,显示如何找到 <PRIOR_RANCHER_VERSION> 和 <RANCHER_CONTAINER_NAME>
+
+| 占位符 | 示例 | 描述 |
+| -------------------------- | -------------------------- | ------------------------------------------------------- |
+| `docker ps 命令,显示如何找到 <RANCHER_CONTAINER_TAG> 和 <RANCHER_CONTAINER_NAME>
+
+
+
+| 占位符 | 示例 | 描述 |
+| -------------------------- | -------------------------- | --------------------------------------------------------- |
+| `rancher-data)中,创建一个备份 tar 包(rancher-data-backup-<RANCHER_VERSION>-<DATE>.tar.gz)。
+
+ 如果升级期间出现问题,此压缩包可以用作回滚点。替换占位符来运行以下命令。
+ ```
+ docker run --volumes-from rancher-data -v "$PWD:/backup" --rm busybox tar zcvf /backup/rancher-data-backup-(|(memberOf=CN=group1,CN=Users,DC=testad,DC=rancher,DC=io)(memberOf=CN=group2,CN=Users,DC=testad,DC=rancher,DC=io))。注意:如果搜索筛选器未使用[有效的 AD 搜索语法](https://docs.microsoft.com/en-us/windows/win32/adsi/search-filter-syntax),则用户列表将为空。 |
+| User Enabled Attribute | 该属性是一个整数值,代表用户账号标志的枚举。Rancher 使用此选项来确定用户账号是否已禁用。通常应该将此参数设置为 AD 标准的 `userAccountControl`。 |
+| Disabled Status Bitmask | 指定的禁用用户账号的 `User Enabled Attribute` 的值。通常,你应该将此参数设置为 Microsoft Active Directory Schema 中指定的默认值 2(请参见[此处](https://docs.microsoft.com/en-us/windows/desktop/adschema/a-useraccountcontrol#remarks))。 |
+
+---
+
+#### 组 Schema
+
+下表详细说明了组 Schema 配置的参数。
+
+**表 3:组 Schema 配置参数**
+
+| 参数 | 描述 |
+|:--|:--|
+| Object Class | 域中用于组对象的对象类别名称。如果定义了此参数,则仅指定对象类别的名称 - *请勿*将其放在 LDAP 包装器中,例如 `&(objectClass=xxxx)`。 |
+| Name Attribute | 名称属性的值适合作为显示名称。 |
+| Group Member User Attribute | **用户属性**的名称。它的格式与 `Group Member Mapping Attribute` 中的组成员匹配。 |
+| Group Member Mapping Attribute | 包含组成员的组属性的名称。 |
+| Search Attribute | 在将组添加到集群或项目时,用于构造搜索筛选器的属性。请参见用户 Schema 的 `Search Attribute`。 |
+| Search Filter | 当 Rancher 尝试将组添加到网站访问列表,或将组添加到集群或项目时,此筛选器将应用于搜索的组列表。例如,组搜索筛选器可以是 (|(cn=group1)(cn=group2))。注意:如果搜索筛选器未使用[有效的 AD 搜索语法](https://docs.microsoft.com/en-us/windows/win32/adsi/search-filter-syntax),则组列表将为空。 |
+| Group DN Attribute | 组属性的名称,其格式与描述用户成员身份的用户属性中的值匹配。参见 `User Member Attribute`。 |
+| Nested Group Membership | 此设置定义 Rancher 是否应解析嵌套组成员身份。仅当你的组织使用这些嵌套成员身份时才使用(即你有包含其他组作为成员的组。我们建议尽量避免使用嵌套组,从而避免在存在大量嵌套成员时出现潜在的性能问题)。 |
+
+---
+
+### 测试身份验证
+
+完成配置后,请**使用你的 AD 管理员账户**测试与 AD 服务器的连接。如果测试成功,将启用配置的 Active Directory 身份验证,测试时使用的账号会成为管理员。
+
+:::note
+
+与此步骤中输入的凭证相关的 AD 用户将映射到本地主体账号,并在 Rancher 中分配系统管理员权限。因此,你应该决定使用哪个 AD 账号来执行此步骤。
+
+:::
+
+1. 输入应映射到本地主体账号的 AD 账号的**用户名**和**密码** 。
+2. 点击**启用 Active Directory 认证**来完成设置。
+
+**结果**:
+
+- 已启用 Active Directory 身份验证。
+- 你已使用 AD 凭证以系统管理员身份登录到 Rancher。
+
+:::note
+
+如果 LDAP 服务中断,你仍然可以使用本地配置的 `admin` 账号和密码登录。
+
+:::
+
+## 附录:使用 ldapsearch 确定搜索库和 Schema
+
+为了成功配置 AD 身份验证,你必须提供 AD 服务器的层次结构和 Schema 的正确配置。
+
+[`ldapsearch`](http://manpages.ubuntu.com/manpages/artful/man1/ldapsearch.1.html) 工具允许你查询你的 AD 服务器,从而了解用于用户和组对象的 Schema。
+
+在下面的示例命令中,我们假设:
+
+- Active Directory 服务器的主机名是 `ad.acme.com`。
+- 服务器正在监听端口 `389` 上的未加密连接。
+- Active Directory 的域是 `acme`。
+- 你有一个用户名为 `jdoe`,密码为 `secret` 的有效 AD 账号。
+
+### 确认搜索库
+
+首先,我们将使用 `ldapsearch` 来找到用户和组的父节点的标识名称:
+
+```
+$ ldapsearch -x -D "acme\jdoe" -w "secret" -p 389 \
+-h ad.acme.com -b "dc=acme,dc=com" -s sub "sAMAccountName=jdoe"
+```
+
+此命令执行 LDAP 搜索,搜索起点设置为域根目录(`-b "dc=acme,dc=com"`),并执行针对用户账号(`sAMAccountNam=jdoe`)的筛选器,返回所述用户的属性:
+
+
+
+因为在这种情况下,用户的 DN 是 `CN=John Doe,CN=Users,DC=acme,DC=com` [5],所以我们应该使用父节点 DN `CN=Users,DC=acme,DC=com` 来配置**用户搜索库**。
+
+同样,基于 **memberOf** 属性 [4] 中引用的组的 DN,**组搜索库**的值将是该值的父节点,即 `OU=Groups,DC=acme,DC=com`。
+
+### 确定用户 Schema
+
+上述 `ldapsearch` 查询的输出还能用于确定在用户 Schema 配置中使用的值:
+
+- `Object Class`:**person** [1]
+- `Username Attribute`::**name** [2]
+- `Login Attribute`:**sAMAccountName** [3]
+- `User Member Attribute`:**memberOf** [4]
+
+:::note
+
+如果我们组织中的 AD 用户使用其 UPN(例如 `jdoe@acme.com`)而不是短登录名进行身份验证,则必须将 `Login Attribute` 设置为 **userPrincipalName**。
+
+:::
+
+我们还将 `Search Attribute` 数设置为 **sAMAccountName|name**。这样,用户可以通过输入用户名或全名添加到 Rancher UI 中的集群/项目中。
+
+### 确定组 Schema
+
+接下来,我们将查询与此用户关联的一个组,在本例中为 `CN=examplegroup,OU=Groups,DC=acme,DC=com`:
+
+```
+$ ldapsearch -x -D "acme\jdoe" -w "secret" -p 389 \
+-h ad.acme.com -b "ou=groups,dc=acme,dc=com" \
+-s sub "CN=examplegroup"
+```
+
+此命令将告知我们用于组对象的属性:
+
+
+
+同样,这能让我们确定要在组 Schema 配置中输入的值:
+
+- `Object Class`:**group** [1]
+- `Name Attribute`:**name** [2]
+- `Group Member Mapping Attribute`:**member** [3]
+- `Search Attribute`:**sAMAccountName** [4]
+
+查看 **member** 属性的值,我们可以看到它包含被引用用户的 DN。这对应我们的用户对象中的 **distinguishedName** 属性。因此,必须将 `Group Member User Attribute` 参数的值设置为此属性。
+
+同样,我们可以看到用户对象中 **memberOf** 属性中的值对应组的 **distinguishedName** [5]。因此,我们需要将 `Group DN Attribute` 参数的值设置为此属性。
+
+## 附录:故障排除
+
+如果在测试与 Active Directory 服务器的连接时遇到问题,请首先仔细检查为 ServiceAccount 输入的凭证以及搜索库配置。你还可以检查 Rancher 日志来查明问题的原因。调试日志可能包含有关错误的更详细信息。详情请参见[如何启用调试日志](../../../../../faq/technical-items.md#如何启用调试日志记录?)。
diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/how-to-guides/advanced-user-guides/authentication-permissions-and-global-configuration/about-authentication/authentication-config/configure-azure-ad.md b/i18n/zh/docusaurus-plugin-content-docs/current/how-to-guides/advanced-user-guides/authentication-permissions-and-global-configuration/about-authentication/authentication-config/configure-azure-ad.md
new file mode 100644
index 00000000000..f13752d7a7e
--- /dev/null
+++ b/i18n/zh/docusaurus-plugin-content-docs/current/how-to-guides/advanced-user-guides/authentication-permissions-and-global-configuration/about-authentication/authentication-config/configure-azure-ad.md
@@ -0,0 +1,316 @@
+---
+title: 配置 Azure AD
+weight: 1115
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+https://graph.microsoft.com/abb5adde-bee8-4821-8b03-e63efdc7701c
+
+1. 点击**启用**。
+
+**结果**:Azure Active Directory 身份验证已配置。
+
+
+### 从 Azure AD Graph API 迁移到 Microsoft Graph API
+
+由于 [Azure AD Graph API](https://docs.microsoft.com/en-us/graph/migrate-azure-ad-graph-overview) 已于 2022 年 6 月弃用并将于 2022 年底停用,因此用户应更新其 Azure AD 应用程序以在 Rancher 中使用新的 [Microsoft Graph API](https://docs.microsoft.com/en-us/graph/use-the-api)。
+
+#### 在 Rancher UI 中更新端点
+
+> **重要提示**:管理员应该在他们提交下面第 4 步中的端点迁移之前创建一个[备份](../../../../new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher.md)。
+
+1. 按照[此处](#3-设置-rancher-所需的权限)所述更新 Azure AD 应用注册的权限
+ (**重要**)。
+
+1. 登录到 Rancher。
+
+1. 在 Rancher UI 主页中,记下屏幕顶部的横幅,该横幅建议用户更新 Azure AD 身份验证。单击提供的链接以执行此操作。
+
+ 
+
+1. 要完成新的 Microsoft Graph API 迁移,请单击 **Update Endpoint**。
+
+ **注意**:在开始更新之前,请确保你的 Azure 应用程序具有[新的权限集](#3-设置-rancher-所需的权限)。
+
+ 
+
+1. 在收到弹出警告消息时,单击 **Update**:
+
+ 
+
+1. 有关 Rancher 执行的完整端点更改,请参阅下面的[表格](#global)。管理员不需要手动执行此操作。
+
+#### 离线环境
+
+在离线环境中,由于 Graph Endpoint URL 正在更改,因此管理员需要确保其端点被[列入白名单](#3.2)。
+
+#### 回滚迁移
+
+如果你需要回滚迁移,请注意以下事项:
+
+1. 如果管理员想要回滚,我们建议他们使用正确的恢复流程。有关参考信息,请参阅[备份文档](../../../../new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher.md)、[恢复文档](../../../../new-user-guides/backup-restore-and-disaster-recovery/restore-rancher.md)和[示例](../../../../../reference-guides/backup-restore-configuration/examples.md)。
+
+1. 如果 Azure 应用程序所有者想要轮换应用程序密钥,他们也需要在 Rancher 中进行轮换(因为在 Azure 中更改应用程序密钥时,Rancher 不会自动更新应用程序密钥)。在 Rancher 中,它存储在名为 `azureadconfig-applicationsecret` 的 Kubernetes 密文中,该密文位于 `cattle-global-data` 命名空间中。
+
+1. **注意**:如果管理员使用现有 Azure AD 设置升级到 Rancher v2.6.7 并选择了禁用身份验证提供程序,他们将无法恢复以前的设置,也无法设置使用旧流程重新设置 Azure AD。然后,管理员需要使用新的身份验证流程重新注册。Rancher 现在使用了新的 Graph API,因此,用户需要在 Azure 门户中设置[适当的权限](#3-设置-rancher-所需的权限)。
+
+#### Global:
+
+Rancher 字段 | 已弃用端点
+---------------- | -------------------------------------------------------------
+Auth 端点 | https://login.microsoftonline.com/{tenantID}/oauth2/authorize
+端点 | https://login.microsoftonline.com/
+Graph 端点 | https://graph.windows.net/
+Token 端点 | https://login.microsoftonline.com/{tenantID}/oauth2/token
+---
+
+| Rancher 字段 | 新端点 |
+---------------- | ------------------------------------------------------------------
+| Auth 端点 | https://login.microsoftonline.com/{tenantID}/oauth2/v2.0/authorize |
+| 端点 | https://login.microsoftonline.com/ |
+| Graph 端点 | https://graph.microsoft.com |
+| Token 端点 | https://login.microsoftonline.com/{tenantID}/oauth2/v2.0/token |
+
+#### 中国:
+
+Rancher 字段 | 已弃用端点
+---------------- | ----------------------------------------------------------
+Auth 端点 | https://login.chinacloudapi.cn/{tenantID}/oauth2/authorize
+端点 | https://login.chinacloudapi.cn/
+Graph 端点 | https://graph.chinacloudapi.cn/
+Token 端点 | https://login.chinacloudapi.cn/{tenantID}/oauth2/token
+---
+
+| Rancher 字段 | 新端点 |
+---------------- | -------------------------------------------------------------------------
+| Auth 端点 | https://login.partner.microsoftonline.cn/{tenantID}/oauth2/v2.0/authorize |
+| 端点 | https://login.partner.microsoftonline.cn/ |
+| Graph 端点 | https://microsoftgraph.chinacloudapi.cn |
+| Token 端点 | https://login.partner.microsoftonline.cn/{tenantID}/oauth2/v2.0/token |
+
+
+docker ps 命令,显示如何找到 <RANCHER_CONTAINER_TAG> 和 <RANCHER_CONTAINER_NAME>
+
+
+
+| 占位符 | 示例 | 描述 |
+| -------------------------- | -------------------------- | --------------------------------------------------------- |
+| `rancher-data-<DATE>)中,创建一个备份 tar 包(rancher-data-backup-<RANCHER_VERSION>-<DATE>.tar.gz)。替换占位符来运行以下命令:
+
+ ```
+ docker run --volumes-from rancher-data-docker ps 命令,显示如何找到 <RANCHER_CONTAINER_TAG> 和 <RANCHER_CONTAINER_NAME>
+
+
+
+| 占位符 | 示例 | 描述 |
+| -------------------------- | -------------------------- | --------------------------------------------------------- |
+| `