POPC Infrastructure
as GitOps Implementation
GitOps

GIT
Infrastructure as a Code
Terraform
Ansible
Infrastructure as a Code

resource "azurerm_resource_group" "dtm-dev" {
name = "dtm-dev"
location = "West Europe"
}
resource "azurerm_virtual_network" "dtm-dev" {
name = "dtm-dev"
location = azurerm_resource_group.dtm-dev.location
resource_group_name = azurerm_resource_group.dtm-dev.name
address_space = ["10.1.0.0/16"]
}
VM
LB
Resource Group

DevOps

Plan

GIT
push
apply
Container Management

Kubernetes
OpenShift
Rancher
Cloud Foundary
PKS
Container Management
Master
Node
Node
apiVersion: apps/v1
kind: Deployment
metadata:
name: notifications-gateway
labels:
app: notifications-gateway
spec:
replicas: 1
selector:
matchLabels:
app: notifications-gateway
strategy:
type: RollingUpdate
.....
apply
Node
Deployment
ReplikaSet
POD
K8S (AKS) Deployment


DevOps

GIT
push
apply
node
node
node

LB
LB
VPN Gateway

AppUser

Dev
internal access
internal access
external access

AKS Plan
Manage K8S Resources
ArgoCD
FluxCD
Terraform
Ansible
Jenkins X
Manage K8S Resources

DevOps

GIT
node

K8s Resources

push
pull
node
node
synchronize
service
pod
secret

Manage K8S Resources

Manage K8S Resources

ArgoCD Deployment


DevOps

GIT
push
apply
node
node
node

LB
LB
VPN Gateway

access to ArgoCD

ArgoCD Plan
Logs
GrayLog
EFK (Elasticsearch Logstash Kibana)
ELK (Elasticsearch FluentD Kibana)
Data Dog
Logs
app
fluentD

elastic
kibana
app
fluentD


DevOps
logging
logging
query logs

Logs

Metrics
Prometheus
Graphite
Zabbix
Grafana (UI)
Metrics
app
prometheus
grafana

DevOps
query metrics
app
svc
apiVersion: v1
kind: Service
metadata:
annotations:
prometheus.io/scrape: 'true'
prometheus.io/path: '/actuator/prometheus'
prometheus.io/port: '8081'
prometheus.io/scheme: 'http'
labels:
app: notifications-gateway
name: notifications-gateway
spec:
....
scrape metrics
app
app
svc
scrape metrics

Metrics

GIT
push

Board Def

DevOps

grafana
board
puller
pull

node
Metrics

Secrets
Vault
Consule
SealedSecrets
Secrets
sealed controller
node
argoCD
sealed secret

GIT

Secret

DevOps
kind: Secret
metadata:
name: rabbitmq
namespace: rabbitmq
data:
password: dmVylY3JldA==
username: cmFml0
kind: SealedSecret
metadata:
name: rabbitmq
namespace: rabbitmq
spec:
encryptedData:
password: AgBd6Kf...
username: AgA0KuM7...
template:
metadata:
name: rabbitmq
...
kubeseal

SealedSecret
secret
pull
create
notify
unseale

push
Secrets
node
Vault

DevOps
get secret

init

app
secrets
put secret
Secrets
node
apiVersion: apps/v1
kind: Deployment
metadata:
name: notifications-gateway
labels:
app: notifications-gateway
spec:
template:
metadata:
annotations:
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-inject-secret-smsapi: kube-dev/data/smsapi
vault.hashicorp.com/agent-inject-secret-application.properties: kube-dev/data/rabbitmq
vault.hashicorp.com/agent-inject-template-application.properties: |
{{- with secret "kube-dev/data/rabbitmq" -}}
spring.rabbitmq.username={{ .Data.data.username }}
spring.rabbitmq.password={{ .Data.data.password }}{{ "\n" }}
{{- end -}}
{{- with secret "kube-dev/data/smsapi" -}}
notifications.sms.provider.token={{ .Data.data.token }}
{{- end -}}
vault.hashicorp.com/role: internal-app
Vault configuration:
CICD
node
Jenkins
Tekton
CircleCi
Jenkins X
Jenkins Configuration as a Code
node

GIT
push

Configuration

DevOps
argoCD
cofig map
pull
create
mount

jenkins

jenkins pod
Jenkins Pipelines as a Code
node

GIT
push

Pipelines

DevOps
pull

jenkins


seed-job

CICD
node


GIT
push

code

Dev
trigger




jenkins
worker
creates
clone
build
unit tests
integration tests
check style
archunits
app:1.0
app:master

app
Image Registry
Thank You
DevOps
By andipansa
DevOps
- 181