Déploiement de Swift sur Kubernetes : guide de base pour développeurs

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Pourquoi Swift et Kubernetes ?

Swift n'est pas seulement un langage pour iOS et macOS. Grâce au projet Swift on Server et aux frameworks comme Vapor et SwiftNIO, les développeurs Swift peuvent construire des applications côté serveur hautes performances. Cependant, pour qu'une telle application fonctionne de manière stable et puisse monter en charge, une infrastructure moderne est nécessaire.

Kubernetes (K8s) est le standard de facto pour l'orchestration de conteneurs. Dans ce guide, nous allons montrer comment empaqueter une application Swift dans une image Docker, écrire des manifestes Kubernetes et la déployer dans un cluster. Vous apprendrez à utiliser SwiftNIO pour créer un serveur HTTP léger et à le configurer pour un déploiement cloud.



1. Préparation de l'application Swift pour la conteneurisation

1.1. Création d'un projet SwiftNIO

Pour la démonstration, nous allons écrire un serveur HTTP minimal utilisant SwiftNIO. Cela évite les dépendances inutiles et montre comment fonctionne la mise en réseau de bas niveau. Ouvrez un terminal et créez un nouveau projet :

mkdir SwiftK8sDemocd SwiftK8sDemoswift package init --type executable

Ajoutez la dépendance SwiftNIO dans Package.swift :

// swift-tools-version:5.7import PackageDescription

let package = Package( name: "SwiftK8sDemo", dependencies: [ .package(url: "https://github.com/apple/swift-nio.git", from: "2.0.0") ], targets: [ .executableTarget( name: "SwiftK8sDemo", dependencies: [ .product(name: "NIO", package: "swift-nio"), .product(name: "NIOHTTP1", package: "swift-nio") ] ) ])


1.2. Code du serveur avec vérification de santé

Créons un serveur simple qui répond aux requêtes GET et dispose d'un point de terminaison de vérification de santé (/health). Ceci est nécessaire pour les sondes de vivacité de Kubernetes. Remplacez le contenu de Sources/SwiftK8sDemo/main.swift :

import NIOimport NIOHTTP1

final class HTTPHandler: ChannelInboundHandler { typealias InboundIn = HTTPServerRequestPart typealias OutboundOut = HTTPServerResponsePart

func channelRead(context: ChannelHandlerContext, data: NIOAny) { let req = unwrapInboundIn(data) switch req { case .head(let header): let response: String let status: HTTPResponseStatus if header.uri == "/health" { response = "{\\"status\\":\\"ok\\"}" status = .ok } else { response = "Hello from Swift on K8s!" status = .ok } var buffer = context.channel.allocator.buffer(capacity: response.utf8.count) buffer.writeString(response) let head = HTTPResponseHead(version: .init(major: 1, minor: 1), status: status) context.write(wrapOutboundOut(.head(head)), promise: nil) context.write(wrapOutboundOut(.body(.byteBuffer(buffer))), promise: nil) context.writeAndFlush(wrapOutboundOut(.end(nil)), promise: nil) default: break } }}

let group = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount)defer { try! group.syncShutdownGracefully() }

let bootstrap = ServerBootstrap(group: group) .serverChannelOption(ChannelOptions.backlog, value: 256) .serverChannelOption(ChannelOptions.socketOption(.so_reuseaddr), value: 1) .childChannelInitializer { channel in channel.pipeline.configureHTTPServerPipeline().flatMap { channel.pipeline.addHandler(HTTPHandler()) } }

let host = ProcessInfo.processInfo.environment["HOST"] ?? "0.0.0.0"let port = Int(ProcessInfo.processInfo.environment["PORT"] ?? "8080") ?? 8080

print("Server starting on \\(host):\\(port)")try bootstrap.bind(host: host, port: port).wai

Blogs

Book Recommendations