An Engineers Notebook

Setting up Failover Clustering | Server 2016 via PowerShell

Servers in this example:

DC1 – Domain Controller

FS1 – File Server for Shared Storage

Cluster-Host1 – Cluster Node

Cluster-Host2 – Cluster Node

Here is the required networking for this lab:

Production Network – | DC, FS1, Cluster-Host1, Cluster-Host2

Cluster Network – | Cluster-Host1, Cluster-Host2

Storage Network  – | FS1

First we set up the required storage, iSCSI on the file server. This will consist of the shared storage for whatever App and a Quorum disk. Both disks should be formatted as NTFS (this will be done in the powershell below. The PowerShell commands are making use of the Invoke-Command cmdlet, to enable us to run these commands from a domain joined computer with the right admin credentials. Only one of the last two commands are required, depending on if your setting up a domain based cluster or not.

NOTE: During this process in Server 2016 from a Windows 10 Machine running RSAT, I had issues using the GUI to set this up. See for details. 


## iSCSI Initiators (pre-target) ##
# start iscsi initiator service on both nodes
Invoke-Command Cluster-Host1,Cluster-Host2 { Get-Service *iscsi* | Set-Service -StartupType Automatic -PassThru | Start-Service }
# view iscsi initiator addresses
Invoke-Command Cluster-Host1,Cluster-Host2 { Get-InitiatorPort }
# create iscsi target portal for discovery
Invoke-Command Cluster-Host1,Cluster-Host2 { New-IscsiTargetPortal -TargetPortalAddress }

## iSCSI Target ##
# create iscsi lun
Invoke-Command FS1 { New-IscsiVirtualDisk -Path C:DataDisk.vhdx -SizeBytes 100GB }
Invoke-Command FS1 { New-IscsiVirtualDisk -Path C:QuorumDisk.vhdx -SizeBytes 1GB }
# create iscsi target
Invoke-Command FS1 { New-IscsiServerTarget -TargetName CL-Target -InitiatorIds "","" }
# assign luns to target
Invoke-Command FS1 { Add-IscsiVirtualDiskTargetMapping -TargetName CL-Target -Path C:DataDisk.vhdx }
Invoke-Command FS1 { Add-IscsiVirtualDiskTargetMapping -TargetName CL-Target -Path C:QuorumDisk.vhdx }

## iSCSI Initiators (post-target) ##
# update discovery portal with new target information
Invoke-Command Cluster-Host1,Cluster-Host2 { Get-IscsiTargetPortal | Update-IscsiTargetPortal }
# view iscsi targetGet
Invoke-Command Cluster-Host1,Cluster-Host2 { Get-IscsiTarget }
# connect initiators to target
Invoke-Command Cluster-Host1,Cluster-Host2 { Get-IscsiTarget | Connect-IscsiTarget }
# force the connection to persist (across reboots)
Invoke-Command Cluster-Host1,Cluster-Host2 { Get-IscsiSession | Register-IscsiSession }
##Connect to ONE of the cluster hosts to format the disks. Repeat for each disk. Label Witnes as W and data D.
# view disks
# initialize disks as GPT
Initialize-Disk -Number 2 -PartitionStyle GPT
# view partitions
# partition an entire disk
New-Partition -DiskNumber 2 -UseMaximumSize -Driveletter D
# view volumes
# format with a file system
Format-Volume -DriveLetter I -FileSystem NTFS -AllocationUnitSize 4096 -NewFileSystemLabel "IT Data"
## Failover Clustering ##
# install failover clustering feature on both nodes
Invoke-Command Cluster-Host1,Cluster-Host2 { Install-WindowsFeature Failover-Clustering,RSAT-Clustering-PowerShell }
# run cluster validation
Test-Cluster -Node Cluster-Host1,Cluster-Host2
# create a new cluster (single domain)
New-Cluster -Name Cluster1 -Node Cluster-Host1,Cluster-Host2 -StaticAddress -IgnoreNetwork,
# create a new cluster (multi-domain/workgroup - no network name)
New-Cluster -Name Cluster1 -Node Cluster-Host1,Cluster-Host2 -StaticAddress -AdministrativeAccessPoint Dns


Leave a Reply

Your email address will not be published.