Mulai cepat: Menyebarkan kluster kontainer SQL Server di Azure

Berlaku untuk:SQL Server - Linux

Mulai cepat ini menunjukkan cara mengonfigurasi instans SQL Server yang sangat tersedia dalam kontainer dengan penyimpanan persisten, pada Azure Kubernetes Service (AKS) atau Red Hat OpenShift. Jika instans SQL Server gagal, orkestrator secara otomatis membuatnya kembali di pod baru. Layanan kluster juga memberikan ketahanan terhadap kegagalan node.

Mulai cepat ini menggunakan alat baris perintah berikut untuk mengelola kluster.

Layanan kluster Alat baris perintah
Azure Kubernetes Service (AKS) kubectl (Kubernetes CLI)
Azure Red Hat OpenShift oc (OpenShift CLI)

Prasyarat

  • Akun Azure dengan langganan aktif. Buat akun secara gratis.

  • Kluster Kubernetes. Untuk informasi selengkapnya tentang membuat dan menyambungkan ke kluster Kubernetes di AKS dengan kubectl, lihat Menyebarkan kluster Azure Kubernetes Service (AKS).

    Catatan

    Untuk menghindari kegagalan node, kluster Kubernetes memerlukan lebih dari satu node.

  • Azure CLI. Lihat Cara menginstal Azure CLI untuk menginstal versi terbaru.

Membuat kata sandi SA

  1. Buat kata sandi SA di kluster Kubernetes. Kubernetes dapat mengelola informasi konfigurasi sensitif, seperti kata sandi sebagai rahasia.

  2. Untuk membuat rahasia di Kubernetes bernama mssql yang menyimpan nilai MyC0m9l&xP@ssw0rd untuk MSSQL_SA_PASSWORD, jalankan perintah berikut. Ingatlah untuk memilih kata sandi kompleks Anda sendiri:

    Penting

    Variabel SA_PASSWORD lingkungan tidak digunakan lagi. Gunakan MSSQL_SA_PASSWORD sebagai gantinya.

    kubectl create secret generic mssql --from-literal=MSSQL_SA_PASSWORD="MyC0m9l&xP@ssw0rd"
    

Membuat penyimpanan

Untuk database dalam kluster Kubernetes, Anda harus menggunakan penyimpanan yang bertahan. Anda dapat mengonfigurasi volume persisten dan klaim volume persisten di kluster Kubernetes menggunakan langkah-langkah berikut:

  1. Buat manifes untuk menentukan kelas penyimpanan dan klaim volume persisten. Manifes menentukan provisioner penyimpanan, parameter, dan kebijakan klaim ulang. Kluster Kubernetes menggunakan manifes ini untuk membuat penyimpanan persisten.

  2. Contoh YAML berikut mendefinisikan kelas penyimpanan dan klaim volume persisten. Provisioner kelas penyimpanan adalah azure-disk, karena kluster Kubernetes ini ada di Azure. Jenis akun penyimpanan adalah Standard_LRS. Klaim volume persisten diberi nama mssql-data. Metadata klaim volume persisten mencakup anotasi yang menghubungkannya kembali ke kelas penyimpanan.

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
         name: azure-disk
    provisioner: kubernetes.io/azure-disk
    parameters:
      storageaccounttype: Standard_LRS
      kind: Managed
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: mssql-data
      annotations:
        volume.beta.kubernetes.io/storage-class: azure-disk
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 8Gi
    

    Simpan file (misalnya, pvc.yaml).

  3. Buat klaim volume persisten di Kubernetes, di mana <path to pvc.yaml file> adalah lokasi tempat Anda menyimpan file:

    kubectl apply -f <path to pvc.yaml file>
    

    Volume persisten secara otomatis dibuat sebagai akun penyimpanan Azure, dan terikat dengan klaim volume persisten.

    storageclass "azure-disk" created
    persistentvolumeclaim "mssql-data" created
    
  4. Verifikasi klaim volume persisten, di mana <persistentVolumeClaim> adalah nama klaim volume persisten:

    kubectl describe pvc <persistentVolumeClaim>
    

    Pada langkah sebelumnya, klaim volume persisten diberi nama mssql-data. Untuk melihat metadata tentang klaim volume persisten, jalankan perintah berikut:

    kubectl describe pvc mssql-data
    

    Metadata yang dikembalikan menyertakan nilai yang disebut Volume. Nilai ini memetakan ke nama blob.

    Name:          mssql-data
    Namespace:     default
    StorageClass:  azure-disk
    Status:        Bound
    Volume:        pvc-d169b88e-f26d-11e7-bc3e-0a58ac1f09a4
    Labels:        ‹none>
    Annotations:   kubectl.kubernetes.io/last-applied-configuration-{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{"volume.beta.   kubernetes.io/storage-class":"azure-disk"},"name":"mssq1-data...
                   pv.kubernetes.io/bind-completed-yes
                   pv.kubernetes.io/bound-by-controller=yes
                   volume.beta.kubernetes.io/storage-class=azure-disk
                   volume.beta.kubernetes.io/storage-provisioner=kubernetes.io/azure-disk
    Capacity:      8Gi
    Access Modes:  RWO
    Events:        <none>
    

    Nilai untuk volume cocok dengan bagian dari nama blob dalam gambar berikut dari portal Azure:

    Screenshot of the Azure portal blob name.

  5. Verifikasi volume persisten.

    kubectl describe pv
    

    kubectl mengembalikan metadata tentang volume persisten yang secara otomatis dibuat dan terikat pada klaim volume persisten.

Membuat penyebaran

Kontainer yang menghosting instans SQL Server dijelaskan sebagai objek penyebaran Kubernetes. Penyebaran membuat set replika. Set replika membuat pod.

Anda membuat manifes untuk menjelaskan kontainer, berdasarkan gambar SQL Server mssql-server-linux Docker.

  • Manifes mereferensikan klaim volume persisten mssql-server, dan rahasia mssql yang sudah Anda terapkan pada kluster Kubernetes.
  • Manifes juga menjelaskan layanan. Layanan ini adalah load balancer. Load balancer menjamin bahwa alamat IP bertahan setelah instans SQL Server dipulihkan.
  • Manifes menjelaskan permintaan dan batas sumber daya. Ini didasarkan pada persyaratan sistem minimum.
  1. Buat manifes (file YAML) untuk menjelaskan penyebaran. Contoh berikut menjelaskan penyebaran, termasuk kontainer berdasarkan gambar kontainer SQL Server.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mssql-deployment
    spec:
      replicas: 1
      selector:
         matchLabels:
           app: mssql
      template:
        metadata:
          labels:
            app: mssql
        spec:
          terminationGracePeriodSeconds: 30
          hostname: mssqlinst
          securityContext:
            fsGroup: 10001
          containers:
          - name: mssql
            image: mcr.microsoft.com/mssql/server:2022-latest
            resources:
              requests:
                memory: "2G"
                cpu: "2000m"
              limits:
                memory: "2G"
                cpu: "2000m"
            ports:
            - containerPort: 1433
            env:
            - name: MSSQL_PID
              value: "Developer"
            - name: ACCEPT_EULA
              value: "Y"
            - name: MSSQL_SA_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mssql
                  key: MSSQL_SA_PASSWORD
            volumeMounts:
            - name: mssqldb
              mountPath: /var/opt/mssql
          volumes:
          - name: mssqldb
            persistentVolumeClaim:
              claimName: mssql-data
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mssql-deployment
    spec:
      selector:
        app: mssql
      ports:
        - protocol: TCP
          port: 1433
          targetPort: 1433
      type: LoadBalancer
    

    Salin kode sebelumnya ke file baru, bernama sqldeployment.yaml. Perbarui nilai berikut ini:

    • value: "Developer"MSSQL_PID : Mengatur kontainer untuk menjalankan edisi Pengembang SQL Server. Edisi pengembang tidak dilisensikan untuk data produksi. Jika penyebaran untuk penggunaan produksi, atur edisi yang sesuai (Enterprise, Standard, atau Express). Untuk informasi selengkapnya, lihat Cara melisensikan SQL Server.

    • persistentVolumeClaim: Nilai ini memerlukan entri untuk claimName: yang memetakan ke nama yang digunakan untuk klaim volume persisten. Tutorial ini menggunakan mssql-data.

    • name: MSSQL_SA_PASSWORD: Mengonfigurasi citra kontainer untuk mengatur kata sandi SA, seperti yang ditentukan di bagian ini.

      valueFrom:
        secretKeyRef:
          name: mssql
          key: MSSQL_SA_PASSWORD
      

      Ketika Kubernetes menyebarkan kontainer, Kubernetes mengacu pada rahasia yang dinamai mssql untuk mendapatkan nilai kata sandi.

    • securityContext: Mendefinisikan hak istimewa dan pengaturan kontrol akses untuk pod atau kontainer. Dalam hal ini, ditentukan pada tingkat pod, sehingga semua kontainer mematuhi konteks keamanan tersebut. Dalam konteks keamanan, kami menentukan fsGroup dengan nilai 10001, yang merupakan ID Grup (GID) untuk mssql grup. Nilai ini berarti bahwa semua proses kontainer juga merupakan bagian dari GID 10001 tambahan (mssql). Pemilik untuk volume /var/opt/mssql dan file apa pun yang dibuat dalam volume tersebut mssql akan menjadi GID 10001 (grup).

    Peringatan

    Dengan menggunakan LoadBalancer jenis layanan, instans SQL Server dapat diakses dari jarak jauh (melalui Internet) di port 1433.

    Simpan file. Contohnya, sqldeployment.yaml.

  2. Buat penyebaran, di mana <path to sqldeployment.yaml file> adalah lokasi tempat Anda menyimpan file:

    kubectl apply -f <path to sqldeployment.yaml file>
    

    Penyebaran dan layanan dibuat. Instans SQL Server berada dalam kontainer, terhubung ke penyimpanan persisten.

    deployment "mssql-deployment" created
    service "mssql-deployment" created
    

    Penyebaran dan layanan dibuat. Instans SQL Server berada dalam kontainer, terhubung ke penyimpanan persisten.

    Untuk melihat status pod, ketik kubectl get pod.

    NAME                                READY    STATUS    RESTARTS   AGE
    mssql-deployment-3813464711-h312s   1/1      Running   0          17m
    

    Pod memiliki status Running. Status ini menunjukkan bahwa kontainer sudah siap. Setelah penyebaran dibuat, dibutuhkan beberapa menit sebelum pod terlihat. Penundaan ini karena kluster menarik gambar mssql-server-linux dari Registri Artefak Microsoft. Setelah citra ditarik pertama kalinya, penyebaran berikutnya mungkin lebih cepat jika penyebaran dilakukan ke node yang sudah memiliki citra yang di-cache di atasnya.

  3. Pastikan layanan sedang berjalan. Jalankan perintah berikut:

    kubectl get services
    

    Perintah ini mengembalikan layanan yang berjalan, dan alamat IP internal dan eksternal untuk layanan. Perhatikan alamat IP eksternal untuk layanan mssql-deployment. Gunakan alamat IP ini untuk menyambungkan ke SQL Server.

    NAME               TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)          AGE
    kubernetes         ClusterIP      10.0.0.1      <none>          443/TCP          52m
    mssql-deployment   LoadBalancer   10.0.113.96   52.168.26.254   1433:30619/TCP   2m
    

    Untuk informasi selengkapnya tentang status objek di kluster Kubernetes, jalankan perintah berikut. Ingatlah untuk mengganti <MyResourceGroup> dan <MyKubernetesClustername> dengan grup sumber daya dan nama kluster Kubernetes Anda:

    az aks browse --resource-group <MyResourceGroup> --name <MyKubernetesClustername>
    
  4. Anda juga dapat memverifikasi bahwa kontainer berjalan sebagai non-root dengan menjalankan perintah berikut, di mana <nameOfSqlPod> adalah nama pod SQL Server Anda:

    kubectl.exe exec <nameOfSqlPod> -it -- /bin/bash
    

    Anda dapat melihat nama pengguna seolah-olah mssql Anda menjalankan whoami. mssql adalah pengguna non-root.

    whoami
    

Koneksi ke instans SQL Server

Anda dapat terhubung dengan aplikasi dari luar jaringan virtual Azure, menggunakan sa akun dan alamat IP eksternal untuk layanan tersebut. Gunakan kata sandi yang Anda konfigurasi sebagai rahasia OpenShift.

Anda dapat menggunakan aplikasi berikut untuk menyambungkan ke instans SQL Server.

Menyambungkan dengan sqlcmd

Untuk menyambungkan dengan sqlcmd, jalankan perintah berikut:

sqlcmd -S <External IP Address> -U sa -P "MyC0m9l&xP@ssw0rd"

Ganti nilai berikut:

  • <External IP Address> dengan alamat IP untuk mssql-deployment layanan
  • MyC0m9l&xP@ssw0rd dengan kata sandi kompleks Anda

Memverifikasi kegagalan dan pemulihan

Untuk memverifikasi kegagalan dan pemulihan, Anda dapat menghapus pod dengan langkah-langkah berikut:

  1. Cantumkan pod yang menjalankan SQL Server.

    kubectl get pods
    

    Perhatikan nama pod yang menjalankan SQL Server.

  2. Hapus pod.

    kubectl delete pod mssql-deployment-0
    

    mssql-deployment-0 adalah nilai yang dikembalikan dari langkah sebelumnya untuk nama pod.

Kubernetes secara otomatis membuat ulang pod untuk memulihkan instans SQL Server, dan terhubung ke penyimpanan persisten. Gunakan kubectl get pods untuk memverifikasi bahwa sebuah pod baru disebarkan. Gunakan kubectl get services untuk memverifikasi bahwa alamat IP untuk kontainer baru adalah sama.

Membersihkan sumber daya

Jika Anda tidak berencana untuk melalui tutorial yang mengikuti, bersihkan sumber daya yang tidak perlu Anda. az group delete Gunakan perintah untuk menghapus grup sumber daya, layanan kontainer, dan semua sumber daya terkait. Ganti <MyResourceGroup> dengan nama grup sumber daya yang berisi kluster Anda.

az group delete --name <MyResourceGroup> --yes --no-wait