Öğ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
- Bir Azure aboneliği Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir Azure hesabı oluşturun. Ücretsiz Azure hesabıyla artık Esnek Sunucu'MySQL için Azure Veritabanı 12 ay boyunca ücretsiz olarak denemeniz mümkün. Diğer ayrıntılar için bkz. Esnek Sunucuyu ücretsiz deneyin.
- Azure Command-Line arabirimi (CLI).
- Desteklenen bir Java Development Kit, sürüm 8 (Azure Cloud Shell içinde bulunur).
- Apache Maven derleme aracı.
- Git istemcisi.
- Docker istemcisi.
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.
- Komut istemi 'ni açın.
- Azure hesabınızda oturum açın.
az login - Azure aboneliğinizi seçin.
az account set -s <your-subscription-ID> - 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.
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/24Yukarı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-mysqlArtı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.
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.
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.
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=alwaysUyarı
Yapılandırma özelliği,
spring.datasource.initialization-mode=alwaysSpring Boot 'ınschema.sqldaha 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.urlyapılandırma özelliğine?serverTimezone=UTCekliyoruz. Aksi halde, Java sunucumuz veritabanıyla aynı tarih biçimini kullanmaz ve bu bir hataya neden olur.Veritabanı şemasını oluşturun.
Spring Boot,
src/main/resources/schema.sqlbir 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);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şturunDemoApplicationve 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
TodoRepositoryarabirimi 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
TodoControllersı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(); } }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"]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ştirinjib-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><plugins>pom.xml dosyasında,<plugin>jib-maven-pluginaş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.
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/24Alt 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)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-keysAş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
Azure portal AKS kümesi kaynağına gidin.
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.
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-aksUygulamayı dağıtmak için YAML düzenleyicisinin altında Ekle ' yi seçin.
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.
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ı
Tarayıcınızdan benzer bir çıkış görebilirsiniz: Tarayıcı isteği
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.