The aks-microservice-chart-blueprint
chart is the best way to release your
microservice into PagoPA K8s environment. It contains all the required
components to get started, and it has several architectural aspects already
configured.
Some of the key benefits of this chart are:
- Highly secure environment thanks to Secret Store CSI Provider;
- Ingress HTTPS connection;
- Improved scalability and reliability thanks to Keda;
- Simpified way to setup secrets and configMaps
To see the entire architecture please see this page architecture
see CHANGELOG to see the new features and the breking changes
- helm & kubernetes
Install:
This is the official and recommended method to adopt this chart.
Create a helm
folder inside your microservice project in which install the
Helm chart:
mkdir helm && cd helm
Add Helm repo:
helm repo add pagopa-microservice https://pagopa.github.io/aks-microservice-chart-blueprint
If you had already added this repo earlier, run
helm repo update
to retrieve the latest versions of the packages.
Add a very basic configuration in Chart.yaml
:
cat <<EOF > Chart.yaml
apiVersion: v2
name: my-microservice
description: My microservice description
type: application
version: 1.0.0
appVersion: 1.0.0
dependencies:
- name: microservice-chart
version: 1.19.0
repository: "https://pagopa.github.io/aks-microservice-chart-blueprint"
EOF
Install the dependency:
helm dep build
Create a values-<env>.yaml
for each environment:
touch values-dev.yaml values-uat.yaml values-prod.yaml
Override all values that you need, and form the root of your project install the chart:
helm upgrade -i -n <namespace name> -f <file with values> <name of the helm chart> <chart folder>
helm upgrade -i -n mynamespace -f helm/values-dev.yaml mymicroservice helm
Change version of the dependency and run the update:
cd helm && helm dep update .
To work as expect this template must request:
App:
- has liveness and readiness endpoints
- you know which are the probes for your application, because are mandatory
Azure:
- TLS certificate are present into the kv (for ingress)
- Managed POD identity are created
K8s:
- Reloader of other tools that allow to restar the pod in case of some of the config map or secret are changed
Here you can find a result of the template final result
In the example
folder, you can find a working examples.
Use spring-boot-app-color to test canary deployment
It is an elementary version of an Azure Function App written in NodeJS.
It has three functions:
ready
that responds to the readiness probe;live
that responds to the liveness probe;secrets
that return a USER and a PASS taken respectively from a K8s ConfigMap and an Azure Key Vault.
To try it locally use either the Azure Functions Core Tools or Docker.
You can also find a generic pipeline.
https://github.com/pagopa/devops-java-springboot-color
there are two folders called:
- spring-boot-app-bar
- spring-boot-app-foo
This are only a helm chart that install a simple web application written in java springboot.
This can be usefull to check how works aks with two applications
We strongly suggest performing SAST on your microservice Helm chart. You could look at this GitHub Action.
see README/Microservice Chart configuration to understand how to use the values.
Is possibile to load inside the deployment the values of an external config map, into ENV variables.
To do so, you can use this example snippet code:
envConfigMapExternals:
progressive-delivery-mock-one:
PLAYER_INITIAL_LIVES_ENV: player_initial_lives
UI_PROPERTIES_FILE_NAME_ENV: ui_properties_file_name
envConfigMapExternals:
<config map name>:
<ENV variable name>: <key name inside the config map>
For more information, visit the complete documentation.
Clone the repository and run the setup script:
git clone git@github.com:pagopa/aks-microservice-chart-blueprint.git
cd aks-microservice-chart-blueprint.git
sh /bin/setup
Setup script installs a version manager tool that may introduce compatibility issues in your environment. To prevent any potential problems, you can install these dependencies manually or with your favourite tool:
- NodeJS 14.17.3
- Helm 3.8.0
The branch gh-pages
contains the GitHub page content and all released charts.
To update the page content, use bin/publish
.
- None.
livenessProbe readinessProbe Now chose if enable tcpSocket ot httpGet
livenessProbe:
handlerType: httpGet <httpGet|tcpSocket>
readinessProbe:
handlerType: httpGet <httpGet|tcpSocket>
fileConfigExternals:
Now create file from external config map
fileConfigExternals:
create: true
configMaps:
- name: nodo-cacerts
key: cacerts
serviceMonitor:
Now create service monitor for send metrics to prometheus
serviceMonitor:
create: true
endpoints:
- interval: 10s #micrometer
targetPort: 9092
path: /
- interval: 10s #cinnamon
targetPort: 9091
path: /metrics
fileShare:
Now use azure storage file and mount in a pod to /mnt/file-azure/{{ name }}/..
(Es. /mnt/file-azure/certificates/java-cacerts
)
(Attention key vault must contains two keys, azurestorageaccountname
and azurestorageaccountkey
. See https://learn.microsoft.com/en-us/azure/aks/azure-files-volume and storage file share named as fileShare.folders.name)
fileShare:
create: true
folders:
- name: certificates
readOnly: false
mountOptions: "dir_mode=0777,file_mode=0777,cache=strict,actimeo=30"
- name: firmatore
readOnly: false
mountOptions: "dir_mode=0777,file_mode=0777,cache=strict,actimeo=30"
envFieldRef:
Now map environment from a Pod Information
envFieldRef:
NAMESPACE: "metadata.namespace"
SERVICE_HTTP_HOST: "status.podIP"
fileConfig:
Now load file inside configMap and mount in a pod to /mnt/file-config/..
(Es. /mnt/file-config/logback.xml
)
fileConfig:
logback.xml: |-
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<property name="CONSOLE_PATTERN" value="%d %-5level [sid:%X{sessionId}] [can:%X{idCanale}] [sta:%X{idStazione}] [%logger] - %msg [%X{akkaSource}]%n"/>
<appender name="CONSOLE_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE_APPENDER_ASYNC" />
</root>
</configuration>
Or use commenad helm for load file while use a subchart
--set-file 'microservice-chart.fileConfig.logback\.xml'=helm/config/dev/logback.xml
service:
Now use a list of ports and not more a single value
service:
create: true
type: ClusterIP
ports:
- 8080
- 4000
ingress: now you need to specify the service port
ingress:
create: true
host: "dev01.rtd.internal.dev.cstar.pagopa.it"
path: /rtd/progressive-delivery/(.*)
servicePort: 8080