diff --git a/README.md b/README.md index 948a22b8..3d1f331b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ # Akka.CQRS +This code sample is part of Petabridge's [Akka.NET, Akka.Cluster, Kubernetes, and Docker Workshop](https://petabridge.com/cluster/) - if you'd like to follow along with the exercises, please go there! + Akka.CQRS is a reference architecture for [Akka.NET](https://getakka.net/), intended to illustrate the following Akka.NET techniques and principles: 1. [Command-Query Responsibility Segregation](https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs) - the Akka.NET actors who consume write events use distinctly different interfaces from those who consume read events diff --git a/build.fsx b/build.fsx index fc740a72..a5ebeda2 100644 --- a/build.fsx +++ b/build.fsx @@ -47,6 +47,8 @@ Target "Clean" (fun _ -> CleanDir outputPerfTests CleanDir outputNuGet CleanDir "docs/_site" + CleanDirs !! "./**/bin" + CleanDirs !! "./**/obj" ) Target "AssemblyInfo" (fun _ -> @@ -164,7 +166,7 @@ Target "Protobuf" <| fun _ -> let result = ExecProcess(fun info -> info.FileName <- protocPath - info.WorkingDirectory <- (Path.GetDirectoryName (FullName protocPath)) + info.WorkingDirectory <- (Path.GetDirectoryName (FullName protocPath):string) info.Arguments <- args) (System.TimeSpan.FromMinutes 45.0) (* Reasonably long-running task. *) if result <> 0 then failwithf "protoc failed. %s %s" protocPath args @@ -274,6 +276,7 @@ Target "PublishNuget" (fun _ -> // Docker images //-------------------------------------------------------------------------------- Target "PublishCode" (fun _ -> + ActivateFinalTarget "KillCreatedProcesses" let projects = !! "src/**/*.Service.csproj" // publish services and web only ++ "src/**/*.Web.csproj" @@ -284,7 +287,6 @@ Target "PublishCode" (fun _ -> Project = project Configuration = configuration VersionSuffix = overrideVersionSuffix project - AdditionalArgs = ["--no-restore --output bin/Release/netcoreapp2.1/publish"] // would be ideal to change publish dir via MSBuild }) projects |> Seq.iter (runSingleProject) @@ -305,6 +307,9 @@ Target "BuildDockerImages" (fun _ -> let remoteRegistryUrl = getBuildParamOrDefault "remoteRegistry" "" + let composedGetFileNameWithoutExtension (p:string) = + System.IO.Path.GetFileNameWithoutExtension p + let buildDockerImage imageName projectPath = let args = @@ -331,13 +336,16 @@ Target "BuildDockerImages" (fun _ -> |> append "." |> toText + let composedGetDirName (p:string) = + System.IO.Path.GetDirectoryName p + ExecProcess(fun info -> info.FileName <- "docker" - info.WorkingDirectory <- Path.GetDirectoryName projectPath + info.WorkingDirectory <- composedGetDirName projectPath info.Arguments <- args) (System.TimeSpan.FromMinutes 5.0) (* Reasonably long-running task. *) let runSingleProject project = - let projectName = Path.GetFileNameWithoutExtension project + let projectName = composedGetFileNameWithoutExtension project let imageName = mapDockerImageName projectName let result = match imageName with | None -> 0 diff --git a/build.sh b/build.sh index 73752bc7..903eb44f 100644 --- a/build.sh +++ b/build.sh @@ -91,6 +91,17 @@ if [ ! -f "$FAKE_EXE" ]; then exit 1 fi +########################################################################### +# INSTALL Protobuf +########################################################################### +if [ ! -f "$PROTOBUF_EXE" ]; then + mono "$NUGET_EXE" install Google.Protobuf.Tools -ExcludeVersion -Version $PROTOBUF_VERSION -OutputDirectory "$TOOLS_DIR" + if [ $? -ne 0 ]; then + echo "An error occured while installing Google.Protobuf.Tools." + exit 1 + fi +fi + ########################################################################### # INSTALL DOCFX ########################################################################### diff --git a/deployK8sServices.sh b/deployK8sServices.sh new file mode 100644 index 00000000..a04cf1ee --- /dev/null +++ b/deployK8sServices.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# deploys all Kubernetes services + +find ./k8s -name "*.yaml" | while read fname; do + echo "Deploying $fname" + kubectl apply -f "$fname" + + echo "Waiting 10s before start of next deployment." + sleep 10 +done diff --git a/docker-images.txt b/docker-images.txt new file mode 100644 index 00000000..f62e4ed7 --- /dev/null +++ b/docker-images.txt @@ -0,0 +1,4 @@ +akka.cqrs.tradeprocessor +akka.cqrs.traders +akka.cqrs.pricing +akka.cqrs.pricing.web \ No newline at end of file diff --git a/k8s/mongodb-deploy.yaml b/k8s/mongodb-deploy.yaml index 4536ca20..deea57a6 100644 --- a/k8s/mongodb-deploy.yaml +++ b/k8s/mongodb-deploy.yaml @@ -9,13 +9,16 @@ spec: selector: app: mongodb --- -apiVersion: apps/v1beta1 +apiVersion: apps/v1 kind: Deployment metadata: namespace: akka-cqrs name: mongodb spec: replicas: 1 + selector: + matchLabels: + app: mongodb template: metadata: labels: diff --git a/k8s/pricing-web-deploy.yaml b/k8s/pricing-web-deploy.yaml index 2f394bd1..4e4c4ec6 100644 --- a/k8s/pricing-web-deploy.yaml +++ b/k8s/pricing-web-deploy.yaml @@ -82,7 +82,7 @@ spec: httpGet: path: "/" port: 80 - initialDelaySeconds: 5 + initialDelaySeconds: 30 ports: - containerPort: 16666 protocol: TCP diff --git a/src/Akka.CQRS.Infrastructure/Akka.CQRS.Infrastructure.csproj b/src/Akka.CQRS.Infrastructure/Akka.CQRS.Infrastructure.csproj index 81ada1d1..7a788502 100644 --- a/src/Akka.CQRS.Infrastructure/Akka.CQRS.Infrastructure.csproj +++ b/src/Akka.CQRS.Infrastructure/Akka.CQRS.Infrastructure.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + $(NetStandardVersion) Shared, non-domain-specific infrastructure used by various Akka.CQRS services. Debug;Release;Phobos @@ -15,13 +15,13 @@ - + - + diff --git a/src/Akka.CQRS.Infrastructure/StockShardMsgRouter.cs b/src/Akka.CQRS.Infrastructure/StockShardMsgRouter.cs index 2e42b0f3..15812958 100644 --- a/src/Akka.CQRS.Infrastructure/StockShardMsgRouter.cs +++ b/src/Akka.CQRS.Infrastructure/StockShardMsgRouter.cs @@ -34,19 +34,7 @@ public override string EntityId(object message) { return envelope.Message.StockId; } - - switch (message) - { - case ConfirmableMessage a: - return a.Message.StockId; - case ConfirmableMessage b: - return b.Message.StockId; - case ConfirmableMessage f: - return f.Message.StockId; - case ConfirmableMessage m: - return m.Message.StockId; - } - + return null; } } diff --git a/src/Akka.CQRS.Pricing.Actors/MatchAggregator.cs b/src/Akka.CQRS.Pricing.Actors/MatchAggregator.cs index bf5c52f8..5272009c 100644 --- a/src/Akka.CQRS.Pricing.Actors/MatchAggregator.cs +++ b/src/Akka.CQRS.Pricing.Actors/MatchAggregator.cs @@ -88,9 +88,7 @@ private void Recovers() /// Recovery has completed successfully. /// protected override void OnReplaySuccess() - { - _publishPricesTask = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(TimeSpan.FromSeconds(10), - TimeSpan.FromSeconds(10), Self, PublishEvents.Instance, ActorRefs.NoSender); + { // setup subscription to TradeEventPublisher Self.Tell(DoSubscribe.Instance); @@ -263,6 +261,9 @@ private void Commands() protected override void PreStart() { + _publishPricesTask = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(TimeSpan.FromSeconds(10), + TimeSpan.FromSeconds(10), Self, PublishEvents.Instance, ActorRefs.NoSender); + _log.Info("Starting..."); base.PreStart(); } diff --git a/src/Akka.CQRS.Pricing.Cli/Akka.CQRS.Pricing.Cli.csproj b/src/Akka.CQRS.Pricing.Cli/Akka.CQRS.Pricing.Cli.csproj index bb37f4df..100c4921 100644 --- a/src/Akka.CQRS.Pricing.Cli/Akka.CQRS.Pricing.Cli.csproj +++ b/src/Akka.CQRS.Pricing.Cli/Akka.CQRS.Pricing.Cli.csproj @@ -1,12 +1,12 @@  - netstandard2.0 + $(NetStandardVersion) Petabridge.Cmd palettes for accessing the pricing system. Debug;Release;Phobos - + diff --git a/src/Akka.CQRS.Pricing.Service/Akka.CQRS.Pricing.Service.csproj b/src/Akka.CQRS.Pricing.Service/Akka.CQRS.Pricing.Service.csproj index 2f66bc97..7af1426b 100644 --- a/src/Akka.CQRS.Pricing.Service/Akka.CQRS.Pricing.Service.csproj +++ b/src/Akka.CQRS.Pricing.Service/Akka.CQRS.Pricing.Service.csproj @@ -7,7 +7,7 @@ - bin\Release\$(NetCoreVersion)\ + bin\Release\ @@ -17,10 +17,10 @@ - - + + - + diff --git a/src/Akka.CQRS.Pricing.Service/Dockerfile b/src/Akka.CQRS.Pricing.Service/Dockerfile index 985cdf07..b6695fdb 100644 --- a/src/Akka.CQRS.Pricing.Service/Dockerfile +++ b/src/Akka.CQRS.Pricing.Service/Dockerfile @@ -7,8 +7,6 @@ ENV CLUSTER_IP "" ENV CLUSTER_PORT "6055" ENV MONGO_CONNECTION_STR "" #MongoDb connection string for Akka.Persistence -COPY ./bin/Release/netcoreapp2.1/publish/ /app - # 9110 - Petabridge.Cmd # 6055 - Akka.Cluster EXPOSE 9110 6055 @@ -16,9 +14,17 @@ EXPOSE 9110 6055 # Install Petabridge.Cmd client RUN dotnet tool install --global pbm +COPY ./bin/Release/netcoreapp2.1/publish/ /app + +FROM microsoft/dotnet:2.1-runtime AS app +WORKDIR /app + +COPY --from=base /app /app + +# copy .NET Core global tool +COPY --from=base /root/.dotnet /root/.dotnet/ + # Needed because https://stackoverflow.com/questions/51977474/install-dotnet-core-tool-dockerfile ENV PATH="${PATH}:/root/.dotnet/tools" -# RUN pbm help - CMD ["dotnet", "Akka.CQRS.Pricing.Service.dll"] \ No newline at end of file diff --git a/src/Akka.CQRS.Pricing.Service/Program.cs b/src/Akka.CQRS.Pricing.Service/Program.cs index 8a7b5665..0d9373d2 100644 --- a/src/Akka.CQRS.Pricing.Service/Program.cs +++ b/src/Akka.CQRS.Pricing.Service/Program.cs @@ -32,11 +32,15 @@ static int Main(string[] args) var sharding = ClusterSharding.Get(actorSystem); + var shardRegion = sharding.Start("priceAggregator", s => Props.Create(() => new MatchAggregator(s)), ClusterShardingSettings.Create(actorSystem), new StockShardMsgRouter()); + var priceInitiatorActor = actorSystem.ActorOf(ClusterSingletonManager.Props(Props.Create(() => new PriceInitiatorActor(shardRegion)), + ClusterSingletonManagerSettings.Create(actorSystem).WithRole("pricing-engine").WithSingletonName("priceInitiator")), "priceInitiator"); + var clientHandler = actorSystem.ActorOf(Props.Create(() => new ClientHandlerActor(shardRegion)), "subscriptions"); diff --git a/src/Akka.CQRS.Pricing.Web/Akka.CQRS.Pricing.Web.csproj b/src/Akka.CQRS.Pricing.Web/Akka.CQRS.Pricing.Web.csproj index 756daf00..ac56c303 100644 --- a/src/Akka.CQRS.Pricing.Web/Akka.CQRS.Pricing.Web.csproj +++ b/src/Akka.CQRS.Pricing.Web/Akka.CQRS.Pricing.Web.csproj @@ -5,8 +5,8 @@ Debug;Release;Phobos - - bin\Release\$(NetCoreVersion)\ + + bin\Release\ diff --git a/src/Akka.CQRS.Pricing.Web/Controllers/HomeController.cs b/src/Akka.CQRS.Pricing.Web/Controllers/HomeController.cs index 6be879cb..4342a031 100644 --- a/src/Akka.CQRS.Pricing.Web/Controllers/HomeController.cs +++ b/src/Akka.CQRS.Pricing.Web/Controllers/HomeController.cs @@ -12,6 +12,7 @@ public class HomeController : Controller { public IActionResult Index() { + ViewData["AppVersion"] = typeof(HomeController).Assembly.ImageRuntimeVersion; return View(); } diff --git a/src/Akka.CQRS.Pricing.Web/Dockerfile b/src/Akka.CQRS.Pricing.Web/Dockerfile index 5bf94167..24689ac6 100644 --- a/src/Akka.CQRS.Pricing.Web/Dockerfile +++ b/src/Akka.CQRS.Pricing.Web/Dockerfile @@ -13,11 +13,19 @@ EXPOSE 16666 # Install Petabridge.Cmd client RUN dotnet tool install --global pbm +COPY ./bin/Release/netcoreapp2.1/publish/ /app + +FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS app +WORKDIR /app + +COPY --from=base /app /app + +# copy .NET Core global tool +COPY --from=base /root/.dotnet /root/.dotnet/ + # Needed because https://stackoverflow.com/questions/51977474/install-dotnet-core-tool-dockerfile ENV PATH="${PATH}:/root/.dotnet/tools" # RUN pbm help -COPY ./bin/Release/netcoreapp2.1/publish/ /app - CMD ["dotnet", "Akka.CQRS.Pricing.Web.dll"] diff --git a/src/Akka.CQRS.Pricing.Web/Views/Shared/_Layout.cshtml b/src/Akka.CQRS.Pricing.Web/Views/Shared/_Layout.cshtml index 796137a8..b68b5b84 100644 --- a/src/Akka.CQRS.Pricing.Web/Views/Shared/_Layout.cshtml +++ b/src/Akka.CQRS.Pricing.Web/Views/Shared/_Layout.cshtml @@ -44,7 +44,7 @@ @RenderBody()
-

© 2019 - Akka.CQRS.Pricing.Web

+

© 2019 - @DateTime.UtcNow.Year Akka.CQRS.Pricing.Web v @ViewData["AppVersion"]

diff --git a/src/Akka.CQRS.TradePlacers.Service/Akka.CQRS.TradePlacers.Service.csproj b/src/Akka.CQRS.TradePlacers.Service/Akka.CQRS.TradePlacers.Service.csproj index 17d4916b..106b4fc5 100644 --- a/src/Akka.CQRS.TradePlacers.Service/Akka.CQRS.TradePlacers.Service.csproj +++ b/src/Akka.CQRS.TradePlacers.Service/Akka.CQRS.TradePlacers.Service.csproj @@ -6,8 +6,8 @@ Debug;Release;Phobos
- - bin\Release\$(NetCoreVersion)\ + + bin\Release\ @@ -18,7 +18,7 @@ - + diff --git a/src/Akka.CQRS.TradePlacers.Service/Dockerfile b/src/Akka.CQRS.TradePlacers.Service/Dockerfile index 22448e55..92335b74 100644 --- a/src/Akka.CQRS.TradePlacers.Service/Dockerfile +++ b/src/Akka.CQRS.TradePlacers.Service/Dockerfile @@ -6,8 +6,6 @@ ENV CLUSTER_SEEDS "[]" ENV CLUSTER_IP "" ENV CLUSTER_PORT "5054" -COPY ./bin/Release/netcoreapp2.1/publish/ /app - # 9110 - Petabridge.Cmd # 5055 - Akka.Cluster EXPOSE 9110 5054 @@ -15,6 +13,16 @@ EXPOSE 9110 5054 # Install Petabridge.Cmd client RUN dotnet tool install --global pbm +COPY ./bin/Release/netcoreapp2.1/publish/ /app + +FROM microsoft/dotnet:2.1-runtime AS app +WORKDIR /app + +COPY --from=base /app /app + +# copy .NET Core global tool +COPY --from=base /root/.dotnet /root/.dotnet/ + # Needed because https://stackoverflow.com/questions/51977474/install-dotnet-core-tool-dockerfile ENV PATH="${PATH}:/root/.dotnet/tools" diff --git a/src/Akka.CQRS.TradePlacers.Service/Program.cs b/src/Akka.CQRS.TradePlacers.Service/Program.cs index 0dcc1488..7128dcb3 100644 --- a/src/Akka.CQRS.TradePlacers.Service/Program.cs +++ b/src/Akka.CQRS.TradePlacers.Service/Program.cs @@ -37,8 +37,8 @@ static int Main(string[] args) Cluster.Cluster.Get(actorSystem).RegisterOnMemberUp(() => { var sharding = ClusterSharding.Get(actorSystem); - var shardRegionProxy = sharding.StartProxy("orderBook", "trade-processor", new StockShardMsgRouter()); + var subManager = Akka.CQRS.Subscriptions.DistributedPubSub.DistributedPubSubTradeEventSubscriptionManager.For(actorSystem); foreach (var stock in AvailableTickerSymbols.Symbols) { var max = (decimal)ThreadLocalRandom.Current.Next(20, 45); @@ -48,13 +48,13 @@ static int Main(string[] args) // start bidders foreach (var i in Enumerable.Repeat(1, ThreadLocalRandom.Current.Next(1, 6))) { - actorSystem.ActorOf(Props.Create(() => new BidderActor(stock, range, shardRegionProxy))); + actorSystem.ActorOf(Props.Create(() => new BidderActor(subManager, stock, range, shardRegionProxy))); } // start askers foreach (var i in Enumerable.Repeat(1, ThreadLocalRandom.Current.Next(1, 6))) { - actorSystem.ActorOf(Props.Create(() => new AskerActor(stock, range, shardRegionProxy))); + actorSystem.ActorOf(Props.Create(() => new AskerActor(subManager, stock, range, shardRegionProxy))); } } }); diff --git a/src/Akka.CQRS.TradeProcessor.Actors/AskerActor.cs b/src/Akka.CQRS.TradeProcessor.Actors/AskerActor.cs index 46bb77ce..61e586a6 100644 --- a/src/Akka.CQRS.TradeProcessor.Actors/AskerActor.cs +++ b/src/Akka.CQRS.TradeProcessor.Actors/AskerActor.cs @@ -45,6 +45,11 @@ private class DoAsk private DoAsk() { } } + public AskerActor(ITradeEventSubscriptionManager subscriptionManager, string tickerSymbol, PriceRange targetRange, IActorRef tradeGateway) + : this(tickerSymbol, subscriptionManager, tradeGateway, targetRange, + GuidTradeOrderIdGenerator.Instance, CurrentUtcTimestamper.Instance) + { } + public AskerActor(string tickerSymbol, PriceRange targetRange, IActorRef tradeGateway) : this(tickerSymbol, DistributedPubSubTradeEventSubscriptionManager.For(Context.System), tradeGateway, targetRange, GuidTradeOrderIdGenerator.Instance, CurrentUtcTimestamper.Instance) diff --git a/src/Akka.CQRS.TradeProcessor.Actors/BidderActor.cs b/src/Akka.CQRS.TradeProcessor.Actors/BidderActor.cs index 29a50189..dffc8aa2 100644 --- a/src/Akka.CQRS.TradeProcessor.Actors/BidderActor.cs +++ b/src/Akka.CQRS.TradeProcessor.Actors/BidderActor.cs @@ -45,6 +45,11 @@ private class DoBid private DoBid() { } } + public BidderActor(ITradeEventSubscriptionManager subscriptionManager, string tickerSymbol, PriceRange targetRange, IActorRef tradeGateway) + : this(tickerSymbol, subscriptionManager, tradeGateway, targetRange, + GuidTradeOrderIdGenerator.Instance, CurrentUtcTimestamper.Instance) + { } + public BidderActor(string tickerSymbol, PriceRange targetRange, IActorRef tradeGateway) : this(tickerSymbol, DistributedPubSubTradeEventSubscriptionManager.For(Context.System), tradeGateway, targetRange, GuidTradeOrderIdGenerator.Instance, CurrentUtcTimestamper.Instance) diff --git a/src/Akka.CQRS.TradeProcessor.Service/Akka.CQRS.TradeProcessor.Service.csproj b/src/Akka.CQRS.TradeProcessor.Service/Akka.CQRS.TradeProcessor.Service.csproj index 7eb19719..c7d50ecb 100644 --- a/src/Akka.CQRS.TradeProcessor.Service/Akka.CQRS.TradeProcessor.Service.csproj +++ b/src/Akka.CQRS.TradeProcessor.Service/Akka.CQRS.TradeProcessor.Service.csproj @@ -7,7 +7,7 @@ - bin\Release\$(NetCoreVersion)\ + bin\Release\ @@ -17,10 +17,10 @@ - - + + - + diff --git a/src/Akka.CQRS.TradeProcessor.Service/Dockerfile b/src/Akka.CQRS.TradeProcessor.Service/Dockerfile index 3429fbbb..07e47554 100644 --- a/src/Akka.CQRS.TradeProcessor.Service/Dockerfile +++ b/src/Akka.CQRS.TradeProcessor.Service/Dockerfile @@ -7,8 +7,6 @@ ENV CLUSTER_IP "" ENV CLUSTER_PORT "5055" ENV MONGO_CONNECTION_STR "" #MongoDb connection string for Akka.Persistence -COPY ./bin/Release/netcoreapp2.1/publish/ /app - # 9110 - Petabridge.Cmd # 5055 - Akka.Cluster EXPOSE 9110 5055 @@ -16,6 +14,16 @@ EXPOSE 9110 5055 # Install Petabridge.Cmd client RUN dotnet tool install --global pbm +COPY ./bin/Release/netcoreapp2.1/publish/ /app + +FROM microsoft/dotnet:2.1-runtime AS app +WORKDIR /app + +COPY --from=base /app /app + +# copy .NET Core global tool +COPY --from=base /root/.dotnet /root/.dotnet/ + # Needed because https://stackoverflow.com/questions/51977474/install-dotnet-core-tool-dockerfile ENV PATH="${PATH}:/root/.dotnet/tools" diff --git a/src/Akka.CQRS/AvailableTickerSymbols.cs b/src/Akka.CQRS/AvailableTickerSymbols.cs index 10bea012..512b70cf 100644 --- a/src/Akka.CQRS/AvailableTickerSymbols.cs +++ b/src/Akka.CQRS/AvailableTickerSymbols.cs @@ -9,6 +9,8 @@ namespace Akka.CQRS /// public static class AvailableTickerSymbols { - public static readonly string[] Symbols = { "MSFT", "AMZN", "GOOG", "TSLA", "TEAM", "AMD", "WDC", "STX", "UBER", "SNAP", "FB" }; + public static readonly string[] Symbols = + { "MSFT", "AMZN", "GOOG", "TSLA", "TEAM", "AMD", "WDC", "STX", "UBER", "SNAP", "FB", "NET", "DT", "ESTC", + "FSLY", "UPWK", "INTC", "HPE", "BB", "QCOM", "APPL", "DDOG", "NEWR", "RACE", "SAVE", "AAL", "UAL", "DAL"}; } } diff --git a/src/common.props b/src/common.props index d22d35ca..d8b36f4f 100644 --- a/src/common.props +++ b/src/common.props @@ -1,10 +1,10 @@ - Copyright © 2017 Your Company - Your Authors - 0.1.0 - Fixed `NullReferenceException` when recovering `MatchAggregatorSnapshot` records with no price and volume updates. -Fixed issue with BSON serialization for `MatchAggregatorSnapshot` records. + Copyright © 2015-2019 Petabridge + Petabridge + 0.2.0 + Upgraded to latest version of Akka.NET +Upgraded all K8s files to support latest v1 stable APIs @@ -16,13 +16,13 @@ Fixed issue with BSON serialization for `MatchAggregatorSnapshot` records. 1.2.2 2.4.1 - 15.9.0 - 1.3.14 - 0.2.1 - 0.4.3 - 5.6.0 - 3.4.0 - 0.6.3 + 16.7.0 + 1.4.9 + 0.4.0 + 0.5.0 + 5.10.3 + 3.12.4 + 0.8.0 netcoreapp2.1 diff --git a/stopK8sServices.sh b/stopK8sServices.sh new file mode 100644 index 00000000..da8d2fac --- /dev/null +++ b/stopK8sServices.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +# destroys all K8s services + +kubectl -n akka-cqrs delete statefulsets,deployments,po,svc --all \ No newline at end of file