Menggunakan skrip python untuk menyebarkan Kluster Big Data SQL Server di Azure Red Hat OpenShift (ARO)

Berlaku untuk: SQL Server 2019 (15.x)

Penting

Add-on Kluster Big Data Microsoft SQL Server 2019 akan dihentikan. Dukungan untuk SQL Server 2019 Kluster Big Data akan berakhir pada 28 Februari 2025. Semua pengguna SQL Server 2019 yang ada dengan Jaminan Perangkat Lunak akan didukung sepenuhnya pada platform dan perangkat lunak akan terus dipertahankan melalui pembaruan kumulatif SQL Server hingga saat itu. Untuk informasi selengkapnya, lihat posting blog pengumuman dan Opsi big data di platform Microsoft SQL Server.

Dalam tutorial ini, Anda menggunakan contoh skrip penyebaran python untuk menyebarkan SQL Server 2019 Kluster Big Data ke Azure Red Hat OpenShift (ARO). Opsi penyebaran ini didukung dimulai dengan SQL Server 2019 CU5.

Tip

ARO hanyalah satu opsi untuk menghosting Kubernetes untuk kluster big data Anda. Untuk mempelajari tentang opsi penyebaran lain serta cara menyesuaikan opsi penyebaran, lihat Cara menyebarkan SQL Server Kluster Big Data di Kubernetes.

Peringatan

Volume persisten yang dibuat dengan kelas penyimpanan bawaan managed-premium memiliki kebijakan reklaim Hapus. Jadi, ketika Anda menghapus kluster big data SQL Server, klaim volume persisten dihapus seperti volume persisten. Anda harus membuat kelas penyimpanan kustom dengan menggunakan provisi azure-disk dengan kebijakan Pertahankan klaim ulang, seperti yang dijelaskan dalam penyimpanan Konsep. Skrip di bawah ini menggunakan kelas penyimpanan premium terkelola. Lihat Topik persistensi data untuk detail selengkapnya.

Penyebaran kluster big data default yang digunakan di sini terdiri dari instans SQL Master, satu instans kumpulan komputasi, dua instans kumpulan data, dan dua instans kumpulan penyimpanan. Data dipertahankan menggunakan volume persisten Kubernetes yang menggunakan kelas penyimpanan default ARO. Konfigurasi default yang digunakan dalam tutorial ini cocok untuk lingkungan dev/test.

Prasyarat

Masuk ke akun Azure Anda

Skrip menggunakan Azure CLI untuk mengotomatiskan pembuatan kluster ARO. Sebelum menjalankan skrip, Anda harus masuk ke akun Azure Anda dengan Azure CLI setidaknya sekali. Jalankan perintah berikut dari prompt perintah.

az login

Petunjuk

  1. Unduh skrip deploy-sql-big-data-aro.py Python dan file bdc-scc.yamlyaml .

    File-file ini terletak di artikel ini di bawah:

  2. Jalankan skrip menggunakan:

python deploy-sql-big-data-aro.py

Saat diminta, berikan input Anda untuk ID langganan Azure dan grup sumber daya Azure untuk membuat sumber daya. Secara opsional, Anda juga dapat memberikan input untuk konfigurasi lain atau menggunakan default yang disediakan. Contohnya:

  • azure_region
  • vm_size untuk simpul pekerja OpenShift. Untuk pengalaman optimal saat Anda memvalidasi skenario dasar, kami merekomendasikan setidaknya 8 vCPU dan memori 64 GB di semua simpul pekerja di kluster. Skrip menggunakan Standard_D8s_v3 dan tiga simpul pekerja sebagai default. Konfigurasi ukuran default untuk kluster big data juga menggunakan sekitar 24 disk untuk klaim volume persisten di semua komponen.
  • konfigurasi jaringan untuk penyebaran kluster OpenShift - lihat artikel penyebaran ARO untuk detail selengkapnya tentang setiap parameter.
  • cluster_name - nilai ini digunakan untuk kluster ARO dan Kluster Big Data SQL Server yang dibuat di atas ARO. Nama Kluster Big Data SQL akan menjadi namespace Layanan Kubernetes.
  • username - ini adalah nama pengguna untuk akun yang disediakan selama penyebaran untuk akun admin pengontrol, akun instans master SQL Server, dan gateway. sa Akun SQL Server dinonaktifkan secara otomatis untuk Anda, sebagai praktik terbaik.
  • password - nilai yang sama akan digunakan untuk semua akun.

Kluster Big Data SQL Server sekarang disebarkan di ARO. Sekarang Anda dapat menggunakan Azure Data Studio untuk menyambungkan ke kluster. Untuk informasi selengkapnya, lihat Koneksi ke kluster big data SQL Server dengan Azure Data Studio.

Penghapusan

Jika Anda menguji Kluster Big Data SQL Server di Azure, Anda harus menghapus kluster ARO setelah selesai untuk menghindari biaya yang tidak terduga. Jangan hapus kluster jika Anda ingin terus menggunakannya.

Peringatan

Langkah-langkah berikut merobek kluster ARO yang menghapus kluster big data SQL Server juga. Jika Anda memiliki database atau data HDFS yang ingin Anda simpan, cadangkan data tersebut sebelum menghapus kluster.

Jalankan perintah Azure CLI berikut untuk menghapus kluster big data dan layanan ARO di Azure (ganti <resource group name> dengan grup sumber daya Azure yang Anda tentukan dalam skrip penyebaran):

az group delete -n <resource group name>

deploy-SQL-big-data-aro.py

Skrip di bagian ini menyebarkan Kluster Big Data SQL Server ke Azure Red Hat OpenShift. Salin skrip ke stasiun kerja Anda dan simpan seperti deploy-sql-big-data-aro.py sebelum Anda memulai penyebaran.

#
# Prerequisites: 
# 
# Azure CLI, Azure Data CLI (`azdata`), OpenShift CLI (oc)  
#
# Run `az login` at least once BEFORE running this script
#

from subprocess import check_output, CalledProcessError, STDOUT, Popen, PIPE, getoutput
from time import sleep
import os
import getpass
import json

def executeCmd (cmd):
    if os.name=="nt":
        process = Popen(cmd.split(),stdin=PIPE, shell=True)
    else:
        process = Popen(cmd.split(),stdin=PIPE)
    stdout, stderr = process.communicate()
    if (stderr is not None):
        raise Exception(stderr)

#
# MUST INPUT THESE VALUES!!!!!
#
SUBSCRIPTION_ID = input("Provide your Azure subscription ID:").strip()
GROUP_NAME = input("Provide Azure resource group name to be created:").strip()
#
# This password will be use for Controller user, Gateway user and SQL Server Master SA accounts
AZDATA_USERNAME=input("Provide username to be used for Controller, SQL Server and Gateway endpoints - Press ENTER for using  `admin`:").strip() or "admin"
AZDATA_PASSWORD = getpass.getpass("Provide password to be used for Controller user, Gateway user and SQL Server Master accounts:")
#
# Optionally change these configuration settings
#
AZURE_REGION=input("Provide Azure region - Press ENTER for using `westus2`:").strip() or "westus2"
# MASTER_VM_SIZE=input("Provide VM size for master nodes for the ARO cluster - Press ENTER for using  `Standard_D2s_v3`:").strip() or "Standard_D2s_v3"
WORKER_VM_SIZE=input("Provide VM size for the worker nodes for the ARO cluster - Press ENTER for using  `Standard_D8s_v3`:").strip() or "Standard_D8s_v3"
OC_NODE_COUNT=input("Provide number of worker nodes for ARO cluster - Press ENTER for using  `3`:").strip() or "3"
VNET_NAME=input("Provide name of Virtual Network for ARO cluster - Press ENTER for using  `aro-vnet`:").strip() or "aro-vnet"
VNET_ADDRESS_SPACE=input("Provide Virtual Network Address Space for ARO cluster - Press ENTER for using  `10.0.0.0/16`:").strip() or "10.0.0.0/16"
MASTER_SUBNET_NAME=input("Provide Master Subnet Name for ARO cluster - Press ENTER for using  `master-subnet`:").strip() or "master-subnet"
MASTER_SUBNET_IP_RANGE=input("Provide address range of Master Subnet for ARO cluster - Press ENTER for using  `10.0.0.0/23`:").strip() or "10.0.0.0/23"
WORKER_SUBNET_NAME=input("Provide Worker Subnet Name for ARO cluster - Press ENTER for using  `worker-subnet`:").strip() or "worker-subnet"
WORKER_SUBNET_IP_RANGE=input("Provide address range of Worker Subnet for ARO cluster - Press ENTER for using  `10.0.2.0/23`:").strip() or "10.0.2.0/23"
#
# This is both Kubernetes cluster name and SQL Big Data cluster name
CLUSTER_NAME=input("Provide name of OpenShift cluster and SQL big data cluster - Press ENTER for using  `sqlbigdata`:").strip() or "sqlbigdata"
#
# Deploy the ARO cluster
#  
print ("Set azure context to subscription: "+SUBSCRIPTION_ID)
command = "az account set -s "+ SUBSCRIPTION_ID
executeCmd (command)
print ("Creating azure resource group: "+GROUP_NAME)
command="az group create --name "+GROUP_NAME+" --location "+AZURE_REGION
executeCmd (command)
command = "az network vnet create --resource-group "+GROUP_NAME+" --name "+VNET_NAME+" --address-prefixes "+VNET_ADDRESS_SPACE
print("Creating Virtual Network: "+VNET_NAME)
executeCmd(command)
command = "az network vnet subnet create --resource-group "+GROUP_NAME+" --vnet-name "+VNET_NAME+" --name "+MASTER_SUBNET_NAME+" --address-prefixes "+MASTER_SUBNET_IP_RANGE+" --service-endpoints Microsoft.ContainerRegistry"
print("Creating Master Subnet: "+MASTER_SUBNET_NAME)
executeCmd(command)
command = "az network vnet subnet create --resource-group "+GROUP_NAME+" --vnet-name "+VNET_NAME+" --name "+WORKER_SUBNET_NAME+" --address-prefixes "+WORKER_SUBNET_IP_RANGE+" --service-endpoints Microsoft.ContainerRegistry"
print("Creating Worker Subnet: "+WORKER_SUBNET_NAME)
executeCmd(command)
command = "az network vnet subnet update --name "+MASTER_SUBNET_NAME+" --resource-group "+GROUP_NAME+" --vnet-name "+VNET_NAME+" --disable-private-link-service-network-policies true"
print("Updating Master Subnet by disabling Private Link Policies")
executeCmd(command)
command = "az aro create --resource-group "+GROUP_NAME+" --name "+CLUSTER_NAME+" --vnet "+VNET_NAME+" --master-subnet "+MASTER_SUBNET_NAME+" --worker-subnet "+WORKER_SUBNET_NAME+" --worker-count "+OC_NODE_COUNT+" --worker-vm-size "+WORKER_VM_SIZE +" --only-show-errors"
print("Creating OpenShift cluster: "+CLUSTER_NAME)
executeCmd (command)
#
# Login to oc console
#
command = "az aro list-credentials --name "+CLUSTER_NAME+" --resource-group "+GROUP_NAME +" --only-show-errors"
output=json.loads(getoutput(command))
OC_CLUSTER_USERNAME = str(output['kubeadminUsername'])
OC_CLUSTER_PASSWORD = str(output['kubeadminPassword'])
command = "az aro show --name "+CLUSTER_NAME+" --resource-group "+GROUP_NAME +" --only-show-errors"
output=json.loads(getoutput(command))
APISERVER = str(output['apiserverProfile']['url'])
command = "oc login "+ APISERVER+ " -u " + OC_CLUSTER_USERNAME + " -p "+ OC_CLUSTER_PASSWORD
executeCmd (command)
#
# Setup pre-requisites for deploying BDC on OpenShift
#
#
#Creating new project/namespace
command = "oc new-project "+ CLUSTER_NAME
executeCmd (command)
#
# create custom SCC for BDC
command = "oc apply -f bdc-scc.yaml"
executeCmd (command)
#
#Bind the custom scc with service accounts in the BDC namespace
command = "oc create clusterrole bdc-role --verb=use --resource=scc --resource-name=bdc-scc -n " + CLUSTER_NAME
executeCmd (command)
command = "oc create rolebinding bdc-rbac --clusterrole=bdc-role --group=system:serviceaccounts:" + CLUSTER_NAME
executeCmd (command)
#
# Deploy big data cluster
#
print ('Set environment variables for credentials')
os.environ['AZDATA_PASSWORD'] = AZDATA_PASSWORD
os.environ['AZDATA_USERNAME'] = AZDATA_USERNAME
os.environ['ACCEPT_EULA']="Yes"
#
#Creating azdata configuration with aro-dev-test profile
command = "azdata bdc config init --source aro-dev-test --target custom --force"
executeCmd (command)
command="azdata bdc config replace -c custom/bdc.json -j ""metadata.name=" + CLUSTER_NAME + ""
executeCmd (command)
#
# Create BDC
command = "azdata bdc create --config-profile custom --accept-eula yes"
executeCmd(command)
#login into big data cluster and list endpoints
command="azdata login -n " + CLUSTER_NAME
executeCmd (command)
print("")
print("SQL Server big data cluster endpoints: ")
command="azdata bdc endpoint list -o table"
executeCmd(command)

bdc-scc.yaml

Manifes .yaml berikut mendefinisikan batasan konteks keamanan kustom (SCC) untuk penyebaran Kluster Big Data. Salin ke direktori yang sama dengan deploy-sql-big-data-aro.py.

allowHostDirVolumePlugin: false
allowHostIPC: false
allowHostNetwork: false
allowHostPID: false
allowHostPorts: false
allowPrivilegeEscalation: true
allowPrivilegedContainer: false
allowedCapabilities:
  - SETUID
  - SETGID
  - CHOWN
  - SYS_PTRACE
apiVersion: security.openshift.io/v1
defaultAddCapabilities: null
fsGroup:
  type: RunAsAny
kind: SecurityContextConstraints
metadata:
  annotations:
    kubernetes.io/description: SQL Server BDC custom scc is based on 'nonroot' scc plus additional capabilities required by BDC.
  generation: 2
  name: bdc-scc
readOnlyRootFilesystem: false
requiredDropCapabilities:
  - KILL
  - MKNOD
runAsUser:
  type: MustRunAsNonRoot
seLinuxContext:
  type: MustRunAs
supplementalGroups:
  type: RunAsAny
volumes:
  - configMap
  - downwardAPI
  - emptyDir
  - persistentVolumeClaim
  - projected
  - secret