Öğretici: MySQL için Azure Veritabanı ile AKS kümesinde Spring Boot uygulaması dağıtma - Sanal ağda Esnek Sunucu

ŞUNLAR IÇIN GEÇERLIDIR: MySQL için Azure Veritabanı - Esnek Sunucu

Bu öğreticide, arka uçta esnek MySQL için Azure Veritabanı sunucuylaAzure Kubernetes Service (AKS) kümesinde bir Spring Boot uygulaması dağıtmayı ve bir Azure sanal ağı içinde birbirleriyle güvenli bir şekilde iletişim kurmayı öğreneceksiniz.

Not

Bu öğreticide Kubernetes kavramları, Java Spring Boot ve MySQL hakkında temel bilgiler edinirsiniz. Spring Boot uygulamaları için Azure Spring Apps kullanmanızı öneririz. Ancak azure Kubernetes Services'i hedef olarak kullanmaya devam edebilirsiniz. Öneri için bkz . Java İş Yükü Hedef Kılavuzu .

Önkoşullar

MySQL için Azure Veritabanı esnek sunucu oluşturma

Kaynak grubu oluşturma

Azure kaynak grubu, Azure kaynaklarının dağıtıldığı ve yönetildiği mantıksal bir gruptur. Şimdi eastus konumundaki az group create komutunu kullanarak bir rg-mysqlaksdemo kaynak grubu oluşturalım.

  1. Komut istemini açın.
  2. Azure hesabınızda oturum açın.
    az login
    
  3. Azure aboneliğinizi seçin.
    az account set -s <your-subscription-ID>
    
  4. Kaynak grubunu oluşturun.
    az group create --name rg-mysqlaksdemo --location eastus
    

MySQL için Azure Veritabanı esnek sunucu örneği oluşturma

Şimdi sanal ağda MySQL için Azure Veritabanı esnek bir sunucu örneği oluşturacağız (özel erişim bağlantı yöntemi).

  1. Bu öğreticideki tüm kaynaklar için bir Azure sanal ağı vnet-mysqlaksdemo ve MySQL için Azure Veritabanı esnek sunucu örneği için bir alt ağ-mysql oluşturun.

    az network vnet create \
    --resource-group rg-mysqlaksdemo \
    --name vnet-mysqlaksdemo \
    --address-prefixes 155.55.0.0/16 \
    --subnet-name subnet-mysql \
    --subnet-prefix 155.55.1.0/24 
    
  2. Yukarıdaki oluşturulan alt ağda az mysql flexible-server create komutunu kullanarak MySQL için Azure Veritabanı esnek sunucu örneği mysql-mysqlaksdemo oluşturun. Yönetici kullanıcı adı ve parola değerlerini değiştirin.

    az mysql flexible-server create \
    --name mysql-mysqlaksdemo \
    --resource-group rg-mysqlaksdemo \
    --location eastus \
    --admin-user <your-admin-username> \
    --admin-password <your-admin-password> \
    --vnet vnet-mysqlaksdemo \
    --subnet subnet-mysql
    

    Artık Eastus bölgesinde, Burstable B1MS işlemi, 32 GB depolama alanı, 7 günlük yedekleme saklama süresi ve sağlanan subnet-mysql alt ağı ile MySQL için Azure Veritabanı esnek bir sunucu örneği oluşturdunuz. Bu alt ağın içinde başka bir kaynak dağıtılmamalıdır ve Microsoft.DBforMySQL/flexibleServers'a devredilecektir.

  3. Spring Boot Uygulaması ile kullanılacak yeni MySQL için Azure Veritabanı esnek sunucu veritabanını demo yapılandırın.

    az mysql flexible-server db create \
    --resource-group rg-mysqlaksdemo \
    --server-name mysql-mysqlaksdemo \
    --database-name demo
    

Azure kapsayıcı kayıt defteri oluşturma

Kaynak grubunda özel bir Azure kapsayıcı kayıt defteri oluşturun. Bu öğretici, sonraki adımlarda örnek uygulamayı docker görüntüsü olarak bu kayıt defterine gönderir. mysqlaksdemoregistry değerini kayıt defteriniz için benzersiz bir adla değiştirin.

az acr create --resource-group rg-mysqlaksdemo \
--location eastus \
--name mysqlaksdemoregistry \
--sku Basic

Uygulamayı kodlama

Bu bölümde tanıtım uygulamasını kodlayacağız. Daha hızlı gitmek istiyorsanız, adresinde bulunan https://github.com/Azure-Samples/tutorial-springboot-mysql-aks kodlanmış uygulamayı indirebilir ve sonraki bölüme atlayabilirsiniz: Görüntüyü derleme ve ACR'ye gönderme.

  1. Spring Initializr kullanarak uygulamayı oluşturun.

    curl https://start.spring.io/starter.tgz \
    -d dependencies=web,data-jdbc,mysql \
    -d baseDir=springboot-mysql-aks \
    -d bootVersion=2.5.6.RELEASE \
    -d artifactId=springboot-mysql-aks \
    -d description="Spring Boot on AKS connecting to Azure DB for MySQL" \
    -d javaVersion=1.8 | tar -xzvf -
    

    Klasörün içinde springboot-mysql-aks temel bir Spring Boot uygulaması oluşturulur.

    Aşağıdaki adımlar için VSCode veya herhangi bir IDE gibi sık kullandığınız metin düzenleyiciyi kullanın.

  2. Spring Boot'MySQL için Azure Veritabanı esnek sunucuyu kullanacak şekilde yapılandırın.

    src/main/resources/application.properties dosyasını açın ve aşağıdaki kod parçacığını ekleyin. Bu kod Kubernetes bildirim dosyasından veritabanı ana bilgisayarını, veritabanı adını, kullanıcı adını ve parolayı okuyor.

    logging.level.org.springframework.jdbc.core=DEBUG
    spring.datasource.url=jdbc:mysql://${DATABASE_HOST}:3306/${DATABASE_NAME}?serverTimezone=UTC
    spring.datasource.username=${DATABASE_USERNAME}
    spring.datasource.password=${DATABASE_PASSWORD}
    spring.datasource.initialization-mode=always
    

    Uyarı

    Yapılandırma özelliği spring.datasource.initialization-mode=always , Spring Boot'un sunucu her başlatıldığında daha sonra oluşturacağımız dosyayı kullanarak schema.sql otomatik olarak bir veritabanı şeması oluşturacağı anlamına gelir. Bu test için harika bir özelliktir, ancak bunun her yeniden başlatmada verilerinizi sileceğini unutmayın, bu nedenle üretimde kullanılmamalıdır!

    Not

    Veritabanına bağlanırken JDBC sürücüsünün UTC tarih biçimini (veya Eşgüdümlü Evrensel Saat) kullanmasını söylemek için spring.datasource.url yapılandırma özelliğine ?serverTimezone=UTC ekliyoruz. Aksi halde, Java sunucumuz veritabanıyla aynı tarih biçimini kullanmaz ve bu bir hataya neden olur.

  3. Veritabanı şemasını oluşturun.

    Spring Boot, veritabanı şeması oluşturmak için otomatik olarak yürütülür src/main/resources/schema.sql . Aşağıdaki içerikle bu dosyayı oluşturun:

    DROP TABLE IF EXISTS todo;
    CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
    
  4. Java Spring Boot uygulamasını kodlayın.

    MySQL sunucunuzda verileri depolamak ve almak için JDBC kullanacak Java kodunu ekleyin. sınıfının yanında DemoApplication yeni Todo bir Java sınıfı oluşturun ve aşağıdaki kodu ekleyin:

    package com.example.springbootmysqlaks;
    
    import org.springframework.data.annotation.Id;
    
    public class Todo {
    
        public Todo() {
        }
    
        public Todo(String description, String details, boolean done) {
            this.description = description;
            this.details = details;
            this.done = done;
        }
    
        @Id
        private Long id;
    
        private String description;
    
        private String details;
    
        private boolean done;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getDescription() {
            return description;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    
        public String getDetails() {
            return details;
        }
    
        public void setDetails(String details) {
            this.details = details;
        }
    
        public boolean isDone() {
            return done;
        }
    
        public void setDone(boolean done) {
            this.done = done;
        }
    }
    

    Bu sınıf, önceden oluşturduğunuz todo tablosunda eşlenmiş olan bir etki alanı modelidir.

    Bu sınıfı yönetmek için bir depoya ihtiyacınız vardır. Aynı pakette yeni bir TodoRepository arabirimi tanımlayın:

    package com.example.springbootmysqlaks;
    
    import org.springframework.data.repository.CrudRepository;
    
    public interface TodoRepository extends CrudRepository<Todo, Long> {
    }
    

    Bu depo, Spring Data JDBC'nin yönettiği bir depodur.

    Verileri depolayıp alabilen bir denetleyici oluşturarak uygulamayı tamamlayın. Aynı pakette bir TodoController sınıfı uygulayın ve aşağıdaki kodu ekleyin:

    package com.example.springbootmysqlaks;
    
    import org.springframework.http.HttpStatus;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @RequestMapping("/")
    public class TodoController {
    
        private final TodoRepository todoRepository;
    
        public TodoController(TodoRepository todoRepository) {
            this.todoRepository = todoRepository;
        }
    
        @PostMapping("/")
        @ResponseStatus(HttpStatus.CREATED)
        public Todo createTodo(@RequestBody Todo todo) {
            return todoRepository.save(todo);
        }
    
        @GetMapping("/")
        public Iterable<Todo> getTodos() {
            return todoRepository.findAll();
        }
    }
    
  5. springboot-mysql-aks temel dizininde yeni bir Dockerfile oluşturun ve bu kod parçacığını kopyalayın.

    FROM openjdk:8-jdk-alpine
    RUN addgroup -S spring && adduser -S spring -G spring
    USER spring:spring
    ARG DEPENDENCY=target/dependency
    COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
    COPY ${DEPENDENCY}/META-INF /app/META-INF
    COPY ${DEPENDENCY}/BOOT-INF/classes /app
    ENTRYPOINT ["java","-cp","app:app/lib/*","com.example.springbootmysqlaks.DemoApplication"]
    
  6. pom.xml dosyasına gidin ve pom.xml dosyasındaki koleksiyonu Azure Container Registry'nizin kayıt defteri adıyla ve en son sürümüyle güncelleştirin <properties>jib-maven-plugin. Not: ACR adınız büyük harf karakterleri içeriyorsa, bunları küçük harf karakterlerine dönüştürdüğünüzden emin olun.

    <properties>
     	<docker.image.prefix>mysqlaksdemoregistry.azurecr.io</docker.image.prefix>
     	<jib-maven-plugin.version>3.1.4</jib-maven-plugin.version>
     	<java.version>1.8</java.version>
     </properties>
    
  7. <plugins> pom.xml dosyasındaki <plugin>koleksiyonu, aşağıda gösterildiği gibi için jib-maven-pluginbir girdi içeren bir öğe olacak şekilde güncelleştirin. Microsoft Container Registry’den (MCR) edindiğimiz ve Azure için resmi olarak desteklenen bir JDK’yı içeren bir temel görüntüyü (mcr.microsoft.com/java/jdk:8-zulu-alpine) kullandığımıza dikkat edin. Resmi olarak desteklenen JDK'lere sahip diğer MCR temel görüntüleri için docker hub'ına bakın.

    <plugin>
        <artifactId>jib-maven-plugin</artifactId>
        <groupId>com.google.cloud.tools</groupId>
        <version>${jib-maven-plugin.version}</version>
        <configuration>
            <from>
                <image>mcr.microsoft.com/java/jdk:8-zulu-alpine</image>
            </from>
            <to>
                <image>${docker.image.prefix}/${project.artifactId}</image>
            </to>
        </configuration>
    </plugin>
    

Görüntüyü oluşturma ve ACR'ye gönderme

Komut isteminde springboot-mysql-aks klasörüne gidin ve aşağıdaki komutları çalıştırarak önce Azure Container Registry için varsayılan adı ayarlayın (aksi takdirde adını az acr loginiçinde belirtmeniz gerekir), görüntüyü derleyin ve ardından görüntüyü kayıt defterine gönderin.

Bu adımı yürütürken docker daemon'unuzun çalıştığından emin olun.

az config set defaults.acr=mysqlaksdemoregistry
az acr login && mvn compile jib:build

AKS'de Kubernetes kümesi oluşturma

Şimdi sanal ağ vnet-mysqlaksdemo'da bir AKS kümesi oluşturacağız.

Bu öğreticide AKS'de Azure CNI ağını kullanacağız. Bunun yerine kubenet ağını yapılandırmak isterseniz bkz . AKS'de kubenet ağını kullanma.

  1. AKS kümesinin kullanması için bir subnet-aks alt ağı oluşturun.

    az network vnet subnet create \
    --resource-group rg-mysqlaksdemo \
    --vnet-name vnet-mysqlaksdemo \
    --name subnet-aks \
    --address-prefixes 155.55.2.0/24
    
  2. Alt ağ kaynak kimliğini alın.

    SUBNET_ID=$(az network vnet subnet show --resource-group rg-mysqlaksdemo --vnet-name vnet-mysqlaksdemo --name subnet-aks --query id -o tsv)
    
  3. Azure Container Registry (ACR) mysqlaksdemoregistry'nin eklendiği sanal ağda bir AKS kümesi oluşturun.

        az aks create \
        --resource-group rg-mysqlaksdemo \
        --name aks-mysqlaksdemo \
        --network-plugin azure \
        --service-cidr 10.0.0.0/16 \
        --dns-service-ip 10.0.0.10 \
        --docker-bridge-address 172.17.0.1/16 \
        --vnet-subnet-id $SUBNET_ID \
        --attach-acr mysqlaksdemoregistry \
        --dns-name-prefix aks-mysqlaksdemo \
        --generate-ssh-keys
    

    Aşağıdaki IP adresi aralıkları, küme oluşturma işleminin bir parçası olarak da tanımlanır:

    • --service-cidr, AKS kümesindeki iç hizmetleri bir IP adresi atamak için kullanılır. Aşağıdaki gereksinimleri karşılayan herhangi bir özel adres aralığını kullanabilirsiniz:

      • Kümenizin sanal ağ IP adresi aralığında olmamalıdır
      • Küme sanal ağ eşlerinin bulunduğu diğer sanal ağlarla çakışmamalıdır
      • Şirket içi IP'lerle çakışmamalıdır
      • 169.254.0.0/16, 172.30.0.0/16, 172.31.0.0/16 veya 192.0.2.0/24 aralıklarında olmamalıdır
    • --dns-service-ip adresi, kümenin DNS hizmetinin IP adresidir. Bu adresin Kubernetes hizmeti adres aralığı içinde olması gerekir. Adres aralığınızdaki ilk IP adresini kullanmayın. Alt ağ aralığınızdaki ilk adres kubernetes.default.svc.cluster.local adresi için kullanılır.

    • --docker-bridge-address, tüm Docker yüklemelerinde mevcut olan varsayılan docker0 köprüsü ağ adresini temsil eden Docker köprüsü ağ adresidir. Kümenin hizmet CIDR'si ve pod CIDR'si dahil olmak üzere ağınızdaki diğer CIDR'lerle çakışmayan bir adres alanı seçmelisiniz.

Uygulamayı AKS kümesine dağıtma

  1. Azure portalında AKS küme kaynağınıza gidin.

  2. Kaynak görünümlerinden herhangi birinden (Ad Alanı, İş Yükleri, Hizmetler ve girişler, Depolama veya Yapılandırma) YAML ile Ekle ve Ekle'yi seçin.

    Azure portalında Azure Kubernetes Service kaynak görünümünü gösteren ekran görüntüsü.

  3. Aşağıdaki YAML'yi yapıştırın. Esnek MySQL için Azure Veritabanı sunucu yöneticisi kullanıcı adı ve parolası için değerlerinizi değiştirin.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: springboot-mysql-aks
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: springboot-mysql-aks
      template:
        metadata:
          labels:
            app: springboot-mysql-aks
        spec:
          containers:
          - name: springboot-mysql-aks
            image: mysqlaksdemoregistry.azurecr.io/springboot-mysql-aks:latest
            env:
            - name: DATABASE_HOST
              value: "mysql-mysqlaksdemo.mysql.database.azure.com"
            - name: DATABASE_USERNAME
              value: "<your-admin-username>"
            - name: DATABASE_PASSWORD
              value: "<your-admin-password>"
            - name: DATABASE_NAME    
              value: "demo"     
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: springboot-mysql-aks
    spec:
      type: LoadBalancer
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: springboot-mysql-aks
    
  4. Uygulamayı dağıtmak için YAML düzenleyicisinin alt kısmındaki Ekle'yi seçin.

    YAML düzenleyicisiyle ekle'yi gösteren ekran görüntüsü.

  5. YAML dosyası eklendikten sonra kaynak görüntüleyici Spring Boot uygulamanızı gösterir. Dış hizmete dahil edilen bağlı dış IP adresini not edin.

    Azure Kubernetes küme hizmeti dış IP'sinin Azure portal görünümünü gösteren ekran görüntüsü.

Uygulamayı test etme

Uygulamayı test etmek için cURL’yi kullanabilirsiniz.

İlk olarak, aşağıdaki komutu kullanarak veritabanında yeni bir "yapılacaklar" öğesi oluşturun.

curl --header "Content-Type: application/json" \
--request POST \
--data '{"description":"configuration","details":"congratulations, you have deployed your application correctly!","done": "true"}' \
http://<AKS-service-external-ip>

Ardından, yeni bir cURL isteği kullanarak veya tarayıcınıza küme Dış IP'sini girerek verileri alın.

curl http://<AKS-service-external-ip>

Bu komut, oluşturduğunuz öğe de dahil olmak üzere "yapılacaklar" öğelerinin listesini döndürür.

[{"id":1,"description":"configuration","details":"congratulations, you have deployed your application correctly!","done":true}]

Bu cURL isteklerinin ekran görüntüsü aşağıdadır: cURL isteklerinin komut satırı çıkışını gösteren ekran görüntüsü.

Tarayıcınız aracılığıyla benzer bir çıkış görebilirsiniz: Tarayıcı isteği çıkışını gösteren ekran görüntüsü.

Tebrikler! Arka uçta esnek MySQL için Azure Veritabanı sunucu ile Azure Kubernetes Service (AKS) kümesinde spring boot uygulamasını başarıyla dağıttınız!

Kaynakları temizleme

Azure ücretlerinden kaçınmak için gereksiz kaynakları temizlemeniz gerekir. Kümeye artık ihtiyacınız yoksa az group delete komutunu kullanarak kaynak grubunu, kapsayıcı hizmetini ve ilgili tüm kaynakları kaldırın.

az group delete --name rg-mysqlaksdemo

Not

Kümeyi sildiğinizde AKS kümesi tarafından kullanılan Microsoft Entra hizmet sorumlusu kaldırılmaz. Hizmet sorumlusunu kaldırma adımları için bkz. AKS hizmet sorumlusuyla ilgili önemli noktalar ve silme. Yönetilen kimlik kullandıysanız, kimlik platform tarafından yönetilir ve kaldırılması gerekmez.

Sonraki adımlar