Öğretici: bir VNet 'te MySQL esnek sunucusu ile AKS kümesinde bir Spring Boot uygulaması dağıtma

Uygulama hedefi: MySQL için Azure veritabanı-esnek sunucu

Bu öğreticide, Azure Kubernetes Service (AKS) kümesi üzerinde MySQL için Azure veritabanı ile Azure sanal ağı'ndaki birbirleriyle güvenli bir şekilde iletişim kuran bir Spring Boot uygulamasını nasıl dağıtacağınızı öğreneceksiniz.

Not

Bu öğreticide, Kubernetes kavramlarını, Java Spring Boot ve MySQL 'in temel olarak anlaşıldığı varsayılmaktadır.

Ö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. Eastus konumundaki az Group Create komutunu kullanarak RG-mysqlaksdemo kaynak grubu oluşturalım.

  1. Komut istemi 'ni 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 esnek sunucusu oluşturma

Artık bir sanal ağda (özel erişim bağlantı yöntemi) esnek bir sunucu oluşturacağız.

  1. Bu öğreticideki tüm kaynaklar için bir Azure sanal ağı VNET-mysqlaksdemo ve MySQL esnek sunucusu için bir alt ağ alt ağı 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 esnek-sunucu Create komutunu kullanarak MySQL Için Azure veritabanı-esnek sunucu MySQL-mysqlaksdemo oluşturun. Yönetici Kullanıcı adı ve parolası için değerlerinizi 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 COMPUTE, 32 GB depolama, 7 gün yedekleme bekletme süresi ve belirtilen alt ağ alt ağı-MySQL ile bir esnek sunucu oluşturdunuz. Bu alt ağ, içinde dağıtılan başka bir kaynak içermemelidir ve Microsoft. Dbformısql/Flexibelservers için temsilci olarak sunulacaktır.

  3. Spring Boot uygulamasıyla kullanılacak yeni bir MySQL veritabanı yapılandırın demo .

    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 bu kayıt defterine örnek uygulamayı bir Docker görüntüsü olarak iter. 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ı kodlarız. Daha hızlı bir şekilde geçmek istiyorsanız, ' de bulunan kodlanmış uygulamayı indirebilir https://github.com/Azure-Samples/tutorial-springboot-mysql-aks ve sonraki bölüme atlayabilirsiniz- görüntüyü oluşturup ACR 'ye gönderin.

  1. Yayı ınitialku 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 -
    

    Bir temel yay önyükleme uygulaması, klasörü içinde oluşturulacaktır springboot-mysql-aks .

    Aşağıdaki adımlar için, vscode veya HERHANGI bir IDE gibi en sevdiğiniz metin düzenleyicinizi kullanın.

  2. Spring Boot 'ı MySQL için Azure veritabanı-esnek sunucu 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ı konağı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 'ın schema.sql daha sonra oluşturduğumuz dosyayı kullanarak sunucu her başlatıldığında otomatik olarak bir veritabanı şeması oluşturmasıdır. Bu test için idealdir, ancak bunun her yeniden başlatmada verilerinizi silebileceğini unutmayın; bu nedenle bu işlem ü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, src/main/resources/schema.sql bir veritabanı şeması oluşturmak için otomatik olarak yürütülür. Bu dosyayı aşağıdaki içerikle 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 sunucunuzdaki verileri depolamak ve almak için JDBC kullanacak Java kodunu ekleyin. TodoSınıfının yanında yeni bir Java sınıfı oluşturun DemoApplication 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, daha önce oluşturduğunuz tabloda eşlenmiş bir etki alanı modelidir todo .

    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 tarafından yönetilen bir depodur.

    Veri depolayabilen ve alabileceği bir denetleyici oluşturarak uygulamayı sona erdirin. 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 <properties> pom.xml dosyasındaki koleksiyonu Azure Container Registry ve en son sürümü için kayıt defteri adıyla güncelleştirin jib-maven-plugin . Note: ACR adınız büyük harfli karakterler içeriyorsa, bunları küçük harfe dönüştürdiğinizden 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ında, <plugin> jib-maven-plugin aşağıda gösterildiği gibi, için bir giriş içeren bir öğe olması için koleksiyonu güncelleştirin. mcr.microsoft.com/java/jdk:8-zulu-alpineAzure için resmi olarak desteklenen jdk içeren Microsoft Container Registry (MCR) ' dan bir temel görüntü kullandığınızı unutmayın. resmi olarak desteklenen jdks 'e sahip diğer MCR temel görüntüler için bkz. java SE jdk, java SE jre, java SE gözetimsiz jreve java SE jdk ve maven.

    <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şturun ve ACR 'ye gönderin

Komut isteminde springboot-MySQL-aks klasörü ' ne gidin ve aşağıdaki komutları çalıştırarak Azure Container Registry için varsayılan adı ayarlayın (Aksi takdirde ' de adı belirtmeniz gerekir az acr login ), görüntüyü derleyin ve sonra görüntüyü kayıt defterine gönderin.

Bu adımı yürütürken Docker Daemon 'ın çalıştığından emin olun.

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

AKS üzerinde bir Kubernetes kümesi oluşturma

Artık sanal ağ VNET-mysqlaksdemo içinde bir aks kümesi oluşturacağız.

Bu öğreticide, AKS 'de Azure CNı ağı kullanacağız. Bunun yerine Kubernetes kullanan ağını yapılandırmak istiyorsanız bkz. AKS 'de Kubernetes kullanan ağı kullanma.

  1. AKS kümesi için kullanılacak bir alt ağ 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. Sanal ağda Azure Container Registry (ACR) mysqlaksdemoregistry eklenmiş 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 parçası olarak da tanımlanmıştır:

    • --Service-CIDR , aks kümesinde 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ığı içinde olmaması gerekir
      • Küme sanal ağ eşlerinin bulunduğu diğer sanal ağlarla çakışmamalıdır
      • Herhangi bir şirket içi IP ile ç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 yer almalıdır
    • --DNS-Service-ip adresi, kümenin DNS hizmetinin IP adresidir. Bu adresin Kubernetes hizmeti adres aralığı içinde olması gerekir. Adres aralığızdaki ilk IP adresini kullanmayın. Alt ağ aralığınızı ilk adres Kubernetes. default. svc. Cluster. Local adresi için kullanılır.

    • --Docker-Bridge-Address , tüm Docker yüklemelerinde bulunan varsayılan docker0 Köprüsü ağ adresini temsil eden Docker köprü ağ adresidir. Kümenin hizmet CıDR ve pod CıDR dahil olmak üzere ağlarınızdaki CIO 'nun geri kalanı ile çakışmayan bir adres alanı seçmelisiniz.

Uygulamayı AKS kümesine dağıtma

  1. Azure portal AKS kümesi kaynağına gidin.

  2. kaynak görünümlerinden (ad alanı, iş yükleri, hizmetler ve giriş, Depolama veya yapılandırma) her türlü yaml ile ekle ve ekle ' yi seçin.

    Azure portal Azure Kubernetes hizmeti kaynak görünümünü gösteren ekran görüntüsü.

  3. Aşağıdaki YAML 'ye yapıştırın. MySQL esnek 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ında Ekle ' yi seçin.

    YAML Düzenleyicisi ile ekleme gösteren ekran görüntüsü.

  5. YAML dosyası eklendikten sonra Kaynak Görüntüleyicisi, Spring Boot uygulamanızı gösterir. Dış hizmette bulunan bağlı dış IP adresini bir yere unutmayın.

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

Uygulamayı test edin

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

İlk olarak, aşağıdaki komutu kullanarak veritabanında yeni bir "Todo" öğ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ızda kümenin Dış IP'sini girerek verileri alın.

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

Bu komut, oluşturduğunuz öğe dahil olmak üzere "todo" öğelerinin listesini geri döner.

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

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

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

Tebrikler! Arka uçta MySQL için Azure Veritabanı - Azure Kubernetes Service Sunucusu ile Azure Kubernetes Service (AKS) kümesinde bir Spring Boot uygulaması başarıyla dağıttın!

Kaynakları temizleme

Azure ücretlerini önlemek 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 Azure Active Directory 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ını gerektirmez.

Sonraki adımlar