<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Kubernetes on Business Information Technology Services</title>
        <link>https://www.bitservices.io/categories/kubernetes/</link>
        <description>Recent content in Kubernetes on Business Information Technology Services</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <copyright>BITServices Ltd</copyright>
        <lastBuildDate>Sat, 01 Jan 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://www.bitservices.io/categories/kubernetes/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Arden University</title>
        <link>https://www.bitservices.io/projects/arden/</link>
        <pubDate>Sat, 01 Jan 2022 00:00:00 +0000</pubDate>
        
        <guid>https://www.bitservices.io/projects/arden/</guid>
        <description>&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://arden.ac.uk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://www.bitservices.io/img/arden-university/logo.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Arden University&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For Arden, there were two projects to deliver: an Amazon Elastic Kubernetes
Service (&lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/eks/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EKS&lt;/a&gt;) based platform and development of their serverless integrations.&lt;/p&gt;
&lt;p&gt;In order to help with the delivery of these projects, some open source
contributions were made.&lt;/p&gt;
&lt;h1 id=&#34;elastic-kubernetes-service-eks-platform&#34;&gt;Elastic Kubernetes Service (&lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/eks/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EKS&lt;/a&gt;) Platform
&lt;/h1&gt;&lt;p&gt;A new platform was required to migrate existing on-premises and Amazon &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/ec2/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EC2&lt;/a&gt;
workloads to. The new platform had to allow developers to easily manage their
own deployments, allow for centralised logging and monitoring, had to be secure
and allow for management of things such as DNS records and TLS certificates to
be fully automated.&lt;/p&gt;
&lt;p&gt;The platform had to be delivered &amp;lsquo;as code&amp;rsquo; so it could be easily managed,
upgraded and replicated. This was done using mainly &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; with some base
&lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; services being deployed using the &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;https://helm.sh/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Helm&lt;/a&gt; provider.&lt;/p&gt;
&lt;p&gt;Any base &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; services that &lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/cd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD&lt;/a&gt; did not depend on explicitly were
managed and deployed by &lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/cd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD&lt;/a&gt; along with the business applications hosted on
the platform.&lt;/p&gt;
&lt;h2 id=&#34;managing-deployments-with-argocd&#34;&gt;Managing Deployments with ArgoCD
&lt;/h2&gt;&lt;p&gt;The main interface into the platform for developers was through &lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/cd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD&lt;/a&gt;. This
allowed developers to deploy applications, see the status of their workloads and
get immediate logs and events to diagnose failures. Being able to deploy and
diagnose simple issues themselves allowed developers to spend less time being
blocked waiting for infrastructure engineers to help out.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/cd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD&lt;/a&gt; was integrated with Microsoft &lt;a class=&#34;link&#34; href=&#34;https://www.microsoft.com/security/business/microsoft-entra&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Entra&lt;/a&gt; to allow single-sign on which
improves security and convenience. Developers could be assigned to individual
projects meaning they only have access to the applications that they are working
with.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://argocd-image-updater.readthedocs.io/en/stable/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD Image Updater&lt;/a&gt; was also used in development environments so that
successful builds of an application could be deployed automatically.&lt;/p&gt;
&lt;h2 id=&#34;monitoring--logging&#34;&gt;Monitoring &amp;amp; Logging
&lt;/h2&gt;&lt;p&gt;For the monitoring and logging, open source tools were used as they provide
excellent flexibility and of course value.&lt;/p&gt;
&lt;p&gt;For monitoring, &lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prometheus&lt;/a&gt; was used with &lt;a class=&#34;link&#34; href=&#34;https://grafana.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Grafana&lt;/a&gt;. &lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prometheus&lt;/a&gt; was also
configured to make a future expansion to &lt;a class=&#34;link&#34; href=&#34;https://thanos.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thanos&lt;/a&gt; as easy as possible, should
the need ever arise.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://grafana.com/oss/loki/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Loki&lt;/a&gt; was used for logging, it integrated perfectly with the monitoring metrics
since it also uses &lt;a class=&#34;link&#34; href=&#34;https://grafana.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Grafana&lt;/a&gt; as the main user interface.&lt;/p&gt;
&lt;p&gt;Alerts were configured with &lt;a class=&#34;link&#34; href=&#34;https://grafana.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Grafana&lt;/a&gt; unified alerts, allowing alerts to be
raised from either metric or logging data.&lt;/p&gt;
&lt;h2 id=&#34;automated-management&#34;&gt;Automated Management
&lt;/h2&gt;&lt;p&gt;Tools such as &lt;a class=&#34;link&#34; href=&#34;https://cert-manager.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Certificate Manager&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://github.com/kubernetes-sigs/external-dns/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;External DNS&lt;/a&gt; were used to allow
automation of day to day administrative tasks.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://cert-manager.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Certificate Manager&lt;/a&gt; automatically provisions and renews TLS certificates for
applications hosted within the platform whilst &lt;a class=&#34;link&#34; href=&#34;https://github.com/kubernetes-sigs/external-dns/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;External DNS&lt;/a&gt; creates and cleans
up DNS records.&lt;/p&gt;
&lt;h2 id=&#34;future-ready&#34;&gt;Future Ready
&lt;/h2&gt;&lt;p&gt;Whilst not immediately implemented due to possible conflicts with the business
the platform was developed and tested with IPv6 support and support for &lt;a class=&#34;link&#34; href=&#34;https://www.arm.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ARM&lt;/a&gt;
based compute allowing for easy adoption later on.&lt;/p&gt;
&lt;h1 id=&#34;serverless-integrations-development&#34;&gt;Serverless Integrations Development
&lt;/h1&gt;&lt;p&gt;Arden was implementing a new student record system called &lt;a class=&#34;link&#34; href=&#34;https://www.tribalgroup.com/solutions/student-information-systems/sits-vision&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SITS&lt;/a&gt;. This was a
huge project that affected all areas of the business. A significant problem was
integrating existing systems that do not understand &lt;a class=&#34;link&#34; href=&#34;https://www.tribalgroup.com/solutions/student-information-systems/sits-vision&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SITS&lt;/a&gt;, such as: the virtual
learning environment, Active Directory, time tabling products and many more.&lt;/p&gt;
&lt;p&gt;To enable this communication between systems, a group of serverless
&amp;lsquo;middlewares&amp;rsquo; were used to keep things scalable and event driven.&lt;/p&gt;
&lt;p&gt;Since the integrated systems spanned across &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AWS&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://azure.microsoft.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Azure&lt;/a&gt; as well as
including software as a service (SaaS) solutions, many technologies were used to
integrate them. These technologies included: &lt;a class=&#34;link&#34; href=&#34;https://www.typescriptlang.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Typescript&lt;/a&gt; based &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/lambda/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Lambda&lt;/a&gt;
functions deployed with the Amazon &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/cdk/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CDK&lt;/a&gt;, Azure &lt;a class=&#34;link&#34; href=&#34;https://azure.microsoft.com/products/logic-apps&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Logic Apps&lt;/a&gt;, Azure &lt;a class=&#34;link&#34; href=&#34;https://azure.microsoft.com/products/functions/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Functions&lt;/a&gt;,
Amazon &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/sns/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SNS&lt;/a&gt;, Amazon &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/sqs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SQS&lt;/a&gt; and Azure &lt;a class=&#34;link&#34; href=&#34;https://azure.microsoft.com/products/service-bus/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Service Bus&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These integrations handled large amounts of traffic especially as &lt;a class=&#34;link&#34; href=&#34;https://www.tribalgroup.com/solutions/student-information-systems/sits-vision&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SITS&lt;/a&gt; went
live at Arden. They also helped the business implement complex processes with
systems that cannot be directly integrated.&lt;/p&gt;
&lt;h1 id=&#34;open-source-contributions&#34;&gt;Open Source Contributions
&lt;/h1&gt;&lt;p&gt;The following open source contributions were made whilst delivering these
projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/prometheus/prometheus/pull/16088&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prometheus: discovery: Allow EC2 Service Discovery to work with IPv6-only instances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/kubernetes-sigs/external-dns/pull/5111&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;External DNS: feat(aws): always create AAAA alias records in route53&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/zorn96/ms_active_directory/pulls?q=is%3Apr&amp;#43;author%3Arlees85&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ms_active_directory: Multiple contributions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/navarasu/onedark.nvim/pull/234&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;onedark.nvim: Fix NvimTree Floating Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/kdheepak/lazygit.nvim/pull/148&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;lazygit.nvim: feat: Allow current buffer commits to show on the already worked out Git root&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- raw HTML omitted --&gt;
</description>
        </item>
        <item>
        <title>Drivvn</title>
        <link>https://www.bitservices.io/projects/drivvn/</link>
        <pubDate>Thu, 02 Jul 2020 00:00:00 +0000</pubDate>
        
        <guid>https://www.bitservices.io/projects/drivvn/</guid>
        <description>&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.drivvn.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://www.bitservices.io/img/drivvn/logo.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Drivvn&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A project to pick up support for and improve an existing &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; based
infrastructure platform hosted on &lt;a class=&#34;link&#34; href=&#34;https://azure.microsoft.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Microsoft Azure&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;#result&#34; &gt;Skip to Result&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;stabilising-platform&#34;&gt;Stabilising Platform
&lt;/h1&gt;&lt;p&gt;Initially, the primary focus had been to automate continual time consuming
tasks and to reduce the number of support tickets. This has been achieved by
implementing technologies such as &lt;a class=&#34;link&#34; href=&#34;https://github.com/kubernetes-sigs/external-dns/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;External DNS&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://cert-manager.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Certificate Manager&lt;/a&gt;.
Reliability has been improved by consolidating and improving complex build
pipelines by utilising YAML libraries for &lt;a class=&#34;link&#34; href=&#34;https://azure.microsoft.com/services/devops/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Azure DevOps&lt;/a&gt; and introducing
infrastructure as code with &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;evolving-platform&#34;&gt;Evolving Platform
&lt;/h1&gt;&lt;p&gt;After stabilising the platform focus shifted to evolving the platform to be
more performant, scalable and developer friendly. In addition to everything
outlined below, lots of work went into upgrades of &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; clusters and
services, improvements as and when they were identified and migrations to new
Azure subscriptions/tenants.&lt;/p&gt;
&lt;h2 id=&#34;developer-friendly&#34;&gt;Developer Friendly
&lt;/h2&gt;&lt;p&gt;To help improve continuous delivery, &lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/cd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD&lt;/a&gt; was implemented. This allowed
developers to publish &lt;a class=&#34;link&#34; href=&#34;https://www.docker.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker&lt;/a&gt; images in their build pipelines which would then
automatically be picked up and deployed into a &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; environment.
&lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/cd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD&lt;/a&gt; also allowed the configuration for the application to be completely
separated from other infrastructure as code meaning developers could have full
control over the configuration of their deployed applications without
requiring permissions to alter other parts of infrastructure.&lt;/p&gt;
&lt;h2 id=&#34;infrastructure-as-code&#34;&gt;Infrastructure as Code
&lt;/h2&gt;&lt;p&gt;There was a large focus on infrastructure as code. &lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; was used to
automate the creation of all base infrastructure: such as resource groups,
virtual networks, security groups and &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; clusters - including all
supporting infrastructure and Active Directory objects. This allowed much
quicker and reliable provision of core infrastructure.&lt;/p&gt;
&lt;p&gt;Any new services deployed were also fully automated so that required
databases, &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; permissions and the application themselves could also
be deployed in a reliable and repeatable way.&lt;/p&gt;
&lt;h2 id=&#34;monitoring--logging&#34;&gt;Monitoring &amp;amp; Logging
&lt;/h2&gt;&lt;p&gt;As the platform grew it became important to be able to monitor workloads.
Initially &lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prometheus&lt;/a&gt; was used with &lt;a class=&#34;link&#34; href=&#34;https://grafana.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Grafana&lt;/a&gt; as well as some other custom
exporters to get certain metrics that were otherwise unavailable.&lt;/p&gt;
&lt;p&gt;However as things grew &lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prometheus&lt;/a&gt; was not scaling so eventually the
monitoring stack was upgraded with &lt;a class=&#34;link&#34; href=&#34;https://thanos.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thanos&lt;/a&gt;. This allowed gathering of huge
amounts of metrics from multiple &lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prometheus&lt;/a&gt; instances and storing the data
in cost efficient blob storage. &lt;a class=&#34;link&#34; href=&#34;https://thanos.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Thanos&lt;/a&gt; also allowed a &amp;lsquo;single pane of glass&amp;rsquo;
view of the entire estate of multiple clusters through &lt;a class=&#34;link&#34; href=&#34;https://grafana.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Grafana&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Centralised logging was also set up utilising &lt;a class=&#34;link&#34; href=&#34;https://www.elastic.co/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ElasticSearch&lt;/a&gt; at first and
later &lt;a class=&#34;link&#34; href=&#34;https://newrelic.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;New Relic&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;ingress&#34;&gt;Ingress
&lt;/h2&gt;&lt;p&gt;A lot of work was carried out around ingress to the platform. Initially
cluster ingresses were standardised with &lt;a class=&#34;link&#34; href=&#34;https://github.com/kubernetes/ingress-nginx/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ingress Nginx&lt;/a&gt;. Security and CDN
capability was then added using &lt;a class=&#34;link&#34; href=&#34;https://www.cloudflare.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cloudflare&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://www.cloudflare.com/en-gb/products/zero-trust/access/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cloudflare Access&lt;/a&gt;. This
allowed many apps to use single sign-on that originally did not support it.
It also enabled zero trust access to internal services without having to set
up and maintain a VPN.&lt;/p&gt;
&lt;h1 id=&#34;result&#34;&gt;Result
&lt;/h1&gt;&lt;p&gt;Due to multiple reasons - the good work that Drivvn do, the pandemic and just
the way things are going - significantly more people are now buying cars
online. Making the infrastructure more scalable and resilient has helped make
it possible to meet these suddenly increasing demands.&lt;/p&gt;
&lt;p&gt;Having the infrastructure as code ready allowed us to work with one of the
Drivvn development teams to deliver a new product from inception to launch
within a few weeks. The initial infrastructure was provisioned and available
within hours. We then worked with the team to refine the build pipelines and
infrastructure as they developed the product. Since launch, the infrastructure
supporting this product has been extremely reliable. Having &lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/cd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ArgoCD&lt;/a&gt; set up
allowed developers to manage their own configuration and &amp;lsquo;self-serve&amp;rsquo;
deployments all the way to production - with easy roll backs if required.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
</description>
        </item>
        <item>
        <title>Using confd to Inject Secrets into Kubernetes Pods</title>
        <link>https://www.bitservices.io/blog/confd-kubernetes/</link>
        <pubDate>Mon, 06 Aug 2018 19:22:56 +0100</pubDate>
        
        <guid>https://www.bitservices.io/blog/confd-kubernetes/</guid>
        <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction
&lt;/h1&gt;&lt;p&gt;Whilst using Kubernetes over the past few months, one challenge I repeatedly
faced was to get secrets - such as passwords, SSH keys or certificate keys -
securely into applications running on Kubernetes.&lt;/p&gt;
&lt;p&gt;Whilst this is quite easy if the container image is under your full control,
to achieve this with an &amp;lsquo;off the shelf&amp;rsquo; image is a little more tricky.&lt;/p&gt;
&lt;p&gt;One tool I came across recently was &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/kelseyhightower/confd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;confd&lt;/a&gt;&lt;/strong&gt; - which has helped a lot with
this challenge and below I will outline how.&lt;/p&gt;
&lt;h1 id=&#34;confd-basics&#34;&gt;confd Basics
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/kelseyhightower/confd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;confd&lt;/a&gt; is a tool for rendering configuration files from predefined templates
using values (secrets) that are stored in a backend. A backend could be &lt;a class=&#34;link&#34; href=&#34;https://coreos.com/etcd/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;etcd&lt;/a&gt;,
Amazon &lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-paramstore.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SSM Parameter Store&lt;/a&gt;, Hashicorp &lt;a class=&#34;link&#34; href=&#34;https://www.vaultproject.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Vault&lt;/a&gt; or many others.&lt;/p&gt;
&lt;p&gt;The examples below will be using the Amazon &lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-paramstore.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SSM Parameter Store&lt;/a&gt; backend. For
Kubernetes clusters running on AWS this works really well as Amazon &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/iam/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;IAM&lt;/a&gt; roles
can be used, mitigating the use for storing the backend password anywhere.&lt;/p&gt;
&lt;p&gt;I won&amp;rsquo;t go into too much detail on the basics of &lt;a class=&#34;link&#34; href=&#34;https://github.com/kelseyhightower/confd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;confd&lt;/a&gt;. I would recommend you
look at the below links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/kelseyhightower/confd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;confd Github Page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/kelseyhightower/confd/blob/master/docs/quick-start-guide.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;confd Quick Start Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;confd-image&#34;&gt;confd Image
&lt;/h1&gt;&lt;p&gt;First a Docker container that has &lt;a class=&#34;link&#34; href=&#34;https://github.com/kelseyhightower/confd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;confd&lt;/a&gt; available will be required. At the
time of writing I could not find an official image available - so baked my own.
This should be a simple and small image, based on something like &lt;a class=&#34;link&#34; href=&#34;https://alpinelinux.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Alpine Linux&lt;/a&gt;
with only &lt;a class=&#34;link&#34; href=&#34;https://github.com/kelseyhightower/confd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;confd&lt;/a&gt; installed and not much else.&lt;/p&gt;
&lt;span style=&#34;color: #ff3333;&#34;&gt;Since creating this guide, many better ways of handling secrets in Kubernetes
are available such as CSI drivers and the use of Terraform with Kubernetes
secrets. Due to this and the fact confd has not had a release since 2018 the
pre-baked images are no longer available.&lt;/span&gt;
&lt;h1 id=&#34;example-1-injecting-secrets-into-environment&#34;&gt;Example 1: Injecting Secrets into Environment
&lt;/h1&gt;&lt;p&gt;Many &amp;lsquo;off the shelf&amp;rsquo; images allow for loading secrets from environment
variables. One example of this is &lt;a class=&#34;link&#34; href=&#34;https://grafana.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Grafana&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;starting-example&#34;&gt;Starting Example
&lt;/h2&gt;&lt;p&gt;Lets start with injecting secrets as simply as possible - plain text in the
deployment spec:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;imagePullPolicy&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;IfNotPresent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;grafana/grafana:latest&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;GF_SECURITY_ADMIN_USER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;value&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;admin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;GF_SECURITY_ADMIN_PASSWORD&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;value&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;supersecurepassword123&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We want the Grafana image to get the secrets above, by itself, without having
to manage the Grafana image ourselves.&lt;/p&gt;
&lt;h2 id=&#34;add-the-secrets-to-amazon-ssm-parameter-store&#34;&gt;Add the Secrets to Amazon SSM Parameter Store
&lt;/h2&gt;&lt;p&gt;Add the two secrets to the Amazon SSM Parameter store using the AWS console.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/grafana-username&lt;/code&gt;: the Grafana administrators username&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/grafana-password&lt;/code&gt;: the Grafana administrators password&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;create-an-amazon-iam-role&#34;&gt;Create an Amazon &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/iam/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;IAM&lt;/a&gt; Role
&lt;/h2&gt;&lt;p&gt;To allow the containers to access the SSM Parameters, they need to be granted
access by IAM.&lt;/p&gt;
&lt;p&gt;In addition, access to decrypt using the Amazon &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/kms/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;KMS&lt;/a&gt; key used to encypt the
parameters will also need to be granted.&lt;/p&gt;
&lt;p&gt;Example (do not copy and paste!):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2012-10-17&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Statement&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Effect&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Allow&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Action&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ssm:GetParameter&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Resource&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;arn:aws:ssm:eu-west-1:123456123:parameter/grafana-username&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;arn:aws:ssm:eu-west-1:123456123:parameter/grafana-password&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Effect&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Allow&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Action&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kms:Decrypt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Resource&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;arn:aws:kms:eu-west-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;confd-configurations&#34;&gt;confd Configurations
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/kelseyhightower/confd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;confd&lt;/a&gt; uses TOML configuration files to define what you want it to process. The
below TOML will process template &lt;code&gt;grafana.env.tmpl&lt;/code&gt; (defined later) and put the
output in &lt;code&gt;/shared-config/grafana.env&lt;/code&gt; with mode &lt;code&gt;0400&lt;/code&gt;. As Grafana by default
runs as UID:GID &lt;code&gt;472:472&lt;/code&gt; we make sure the environment file is owned by the
same user &amp;amp; group.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;apiVersion&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;v1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;kind&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ConfigMap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-confd-configs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;namespace&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;monitoring&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;grafana.env.toml&lt;/span&gt;: |&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    [template]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    src    = &amp;#34;grafana.env.tmpl&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    dest   = &amp;#34;/shared-config/grafana.env&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    uid    = 472
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    gid    = 472
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    mode   = &amp;#34;0400&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    keys   = [
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;#34;/grafana-username&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;#34;/grafana-password&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    ]&lt;/span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;confd-templates&#34;&gt;confd Templates
&lt;/h2&gt;&lt;p&gt;The templates are the configuration files to render. As we want to set
environment variables, the following template works well:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;apiVersion&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;v1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;kind&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ConfigMap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-confd-templates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;namespace&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;monitoring&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;grafana.env.tmpl&lt;/span&gt;: |&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    export GF_SECURITY_ADMIN_USER=&amp;#34;{{     getv &amp;#34;/grafana-username&amp;#34; }}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    export GF_SECURITY_ADMIN_PASSWORD=&amp;#34;{{ getv &amp;#34;/grafana-password&amp;#34; }}&amp;#34;&lt;/span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;override-launcher&#34;&gt;Override Launcher
&lt;/h2&gt;&lt;p&gt;A new launcher script should be created for the main container (Grafana in this
example). The new launcher script should import rendered environment variables
and then start the original entrypoint script.&lt;/p&gt;
&lt;p&gt;Please note the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Always use &lt;code&gt;.&lt;/code&gt; instead of &lt;code&gt;source&lt;/code&gt;. A &lt;strong&gt;lot&lt;/strong&gt; of containers do not have a full bash shell.&lt;/li&gt;
&lt;li&gt;Always &lt;code&gt;exec&lt;/code&gt; to start the original entry point - so that it remains as PID 1.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/run.sh&lt;/code&gt; is the original entry point of the Grafana image.&lt;/li&gt;
&lt;li&gt;Make sure &lt;code&gt;&amp;quot;${@}&amp;quot;&lt;/code&gt; is passed to the original entry point, so arguments still work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To find the original entry point of an image, download the image with
&lt;code&gt;docker pull&lt;/code&gt; and then use &lt;code&gt;docker inspect&lt;/code&gt; to find the entry point.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;apiVersion&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;v1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;kind&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ConfigMap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-launcher&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;namespace&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;monitoring&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;launcher.sh&lt;/span&gt;: |&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    #!/bin/bash -e
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    ###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    echo &amp;#34;:: Loading extra environment variables...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    . &amp;#34;/shared-config/grafana.env&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    ###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    echo &amp;#34;:: Launching Grafana...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    exec &amp;#34;/run.sh&amp;#34; &amp;#34;${@}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    ###############################################################################&lt;/span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;modifying-the-deployment&#34;&gt;Modifying the Deployment
&lt;/h2&gt;&lt;p&gt;The final step is to make the Grafana deployment run &lt;a class=&#34;link&#34; href=&#34;https://github.com/kelseyhightower/confd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;confd&lt;/a&gt; based on the
supplied configuration before Grafana is started. To do that we use an
&lt;code&gt;initContainer&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Notice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We set the region to &lt;code&gt;eu-west-1&lt;/code&gt;, but you need to set this to the region your SSM parameters are stored.&lt;/li&gt;
&lt;li&gt;We have three volume mounts:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grafana-shared-config&lt;/code&gt; is a shared &lt;code&gt;emptyDir&lt;/code&gt; volume for the main Grafana container and the confd initContainer.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grafana-confd-configs&lt;/code&gt; will refer to the &lt;a class=&#34;link&#34; href=&#34;https://github.com/kelseyhightower/confd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;confd&lt;/a&gt; configurations configuration map defined above.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grafana-confd-templates&lt;/code&gt; will refer to the &lt;a class=&#34;link&#34; href=&#34;https://github.com/kelseyhightower/confd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;confd&lt;/a&gt; templates configuration map defined above.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;initContainers&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-confd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;rlees85/secrets-loader:latest&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;command&lt;/span&gt;: [ &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;confd&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;-onetime&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;-backend&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ssm&amp;#39;&lt;/span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;AWS_DEFAULT_REGION&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;value&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;eu-west-1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumeMounts&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-shared-config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;mountPath&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;/shared-config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-confd-configs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;mountPath&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;/etc/confd/conf.d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-confd-templates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;mountPath&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;/etc/confd/templates&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;grafana-shared-config&lt;/code&gt; and &lt;code&gt;grafana-launcher&lt;/code&gt; mount should be added to the
main Grafana container.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-shared-config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;mountPath&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;/shared-config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-launcher&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;mountPath&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;/launcher&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All volumes should be correctly defined in the deployment. Please note that
in the particular deployment used in this example &lt;code&gt;grafana-config&lt;/code&gt; was already
present.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;configMap&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-shared-config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;emptyDir&lt;/span&gt;: {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-confd-configs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;configMap&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;defaultMode&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0400&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-confd-configs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-confd-templates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;configMap&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;defaultMode&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0400&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-confd-templates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-launcher&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;configMap&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;defaultMode&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0500&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana-launcher&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The initContainer needs access to Amazon SSM Parameter store. Make sure
&lt;a class=&#34;link&#34; href=&#34;https://github.com/jtblin/kube2iam&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;kube2iam&lt;/a&gt; is configured on the Kubernetes Cluster and add the appropriate
annotation to the Grafana deployment.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;annotations&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;iam.amazonaws.com/role&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally, we can override the Grafana containers start-up command to use the new
launcher script:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;grafana&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;imagePullPolicy&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;IfNotPresent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;grafana/grafana:latest&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;command&lt;/span&gt;: [ &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/launcher/launcher.sh&amp;#39;&lt;/span&gt; ]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;The &lt;a class=&#34;link&#34; href=&#34;https://github.com/kelseyhightower/confd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;confd&lt;/a&gt; initContainer now runs before Grafana starts and outputs the
templated secrets to shared storage. The main Grafana container then sources
these secrets from shared storage before running the original image entry
point.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl -n monitoring logs grafana-7646488856-4f4gx -c grafana-confd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2018-08-06T19:34:55Z grafana-7646488856-4f4gx confd[1]: INFO Backend set to ssm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2018-08-06T19:34:55Z grafana-7646488856-4f4gx confd[1]: INFO Starting confd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2018-08-06T19:34:55Z grafana-7646488856-4f4gx confd[1]: INFO Backend source(s) set to
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2018-08-06T19:34:56Z grafana-7646488856-4f4gx confd[1]: INFO Target config /shared-config/grafana.env out of sync
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2018-08-06T19:34:56Z grafana-7646488856-4f4gx confd[1]: INFO Target config /shared-config/grafana.env has been updated
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;$ kubectl -n monitoring logs grafana-7646488856-4f4gx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t=2018-08-06T19:35:07+0000 lvl=info msg=&amp;#34;Starting Grafana&amp;#34; logger=server version=5.2.1 commit=2040f61 compiled=2018-06-29T09:17:46+0000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;t=2018-08-06T19:35:07+0000 lvl=info msg=&amp;#34;Config overridden from Environment variable&amp;#34; logger=settings var=&amp;#34;GF_SECURITY_ADMIN_USER=admin&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t=2018-08-06T19:35:07+0000 lvl=info msg=&amp;#34;Config overridden from Environment variable&amp;#34; logger=settings var=&amp;#34;GF_SECURITY_ADMIN_PASSWORD=*********&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1 id=&#34;example-2-rendering-configuration-files-andor-keys&#34;&gt;Example 2: Rendering Configuration Files and/or Keys
&lt;/h1&gt;&lt;p&gt;Please read through example 1 first. A lot of things will not be covered again
and are assumed to be already set up (SSM parameters, KMS keys and IAM
permissions).&lt;/p&gt;
&lt;p&gt;In this example we have a much more complicated application, that requires
secrets to be loaded into its configuration files. Additionally, the
application integrates with other services - and therefore needs an SSH private
key to be injected at run-time.&lt;/p&gt;
&lt;h2 id=&#34;starting-example-1&#34;&gt;Starting Example
&lt;/h2&gt;&lt;p&gt;In this example, the deployment spec has no secrets in. The secrets are baked
directly in to the image. This may be undesirable for example if the image has
to pass through a pipeline - developers perhaps should not have access to
production secrets.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s say the following file is baked directly into the image:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cat /etc/application.d/50-config.properties
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mysql.db.username=application
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mysql.db.password=application123
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;integration.ssh-key=/etc/application/ssh.pem
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; When loading multi-line parameters (such as SSH keys) into Amazon SSM
Parameter store use the CLI tool and not the console! If the console is used
new lines are lost.&lt;/p&gt;
&lt;h2 id=&#34;confd-configurations-1&#34;&gt;confd Configurations
&lt;/h2&gt;&lt;p&gt;In a similar fashion to the first example, we template a configuration file and
SSH key based on templates to shared storage.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;apiVersion&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;v1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;kind&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ConfigMap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;application-confd-configs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;99-secrets.properties.toml&lt;/span&gt;: |&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    [template]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    src    = &amp;#34;99-secrets.properties.tmpl&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    dest   = &amp;#34;/shared-config/99-secrets.properties&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    mode   = &amp;#34;0400&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    keys   = [
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;#34;/application-db-username&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;#34;/application-db-password&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    ]&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;integration-key.pem.toml&lt;/span&gt;: |&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    [template]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    src    = &amp;#34;integration-key.pem.tmpl&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    dest   = &amp;#34;/shared-config/integration-key.pem&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    mode   = &amp;#34;0400&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    keys   = [
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;#34;/application-integration-key&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    ]&lt;/span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;confd-templates-1&#34;&gt;confd Templates
&lt;/h2&gt;&lt;p&gt;As before, the templates referred to by the TOML configurations are defined
below:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;apiVersion&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;v1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;kind&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ConfigMap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;application-confd-templates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;99-secrets.properties.tmpl&lt;/span&gt;: |&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    mysql.db.username={{ getv &amp;#34;/application-db-username&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    mysql.db.password={{ getv &amp;#34;/application-db-password&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    integration.ssh-key=/shared-config/integration-key.pem&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;integration-key.pem.tmpl&lt;/span&gt;: |&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    {{ getv &amp;#34;/application-integration-key&amp;#34; }}&lt;/span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;override-launcher-1&#34;&gt;Override Launcher
&lt;/h2&gt;&lt;p&gt;The same as the first example a new launcher script should be created for the
main container. The script should import rendered configuration files into a
folder that the application can pick them up.&lt;/p&gt;
&lt;p&gt;The extra configuration file already points to the rendered SSH key so no
further action is required for the key.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;apiVersion&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;v1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;kind&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ConfigMap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;application-launcher&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;namespace&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;monitoring&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;launcher.sh&lt;/span&gt;: |&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    #!/bin/bash -e
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    ###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    echo &amp;#34;:: Loading extra configuration files...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    find &amp;#34;/shared-config&amp;#34; -maxdepth 1 -type f -name &amp;#34;*.properties&amp;#34; -exec cp -sfv {} &amp;#34;/etc/application.d/&amp;#34; \;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    ###############################################################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    echo &amp;#34;:: Launching Application...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    exec &amp;#34;/opt/startup/startup.sh&amp;#34; &amp;#34;${@}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    ###############################################################################&lt;/span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the image you are working with does not have &lt;code&gt;find&lt;/code&gt; there are many other
ways to achieve the same thing.&lt;/p&gt;
&lt;h2 id=&#34;modifying-the-deployment-1&#34;&gt;Modifying the Deployment
&lt;/h2&gt;&lt;p&gt;The deployment needs to be modified the same way as in &lt;strong&gt;example 1&lt;/strong&gt; above.&lt;/p&gt;
&lt;h2 id=&#34;conclusion-1&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;This shows even complicated configurations can be setup with &lt;a class=&#34;link&#34; href=&#34;https://github.com/kelseyhightower/confd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;confd&lt;/a&gt; whilst
still using off-the-shelf images.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
</description>
        </item>
        <item>
        <title>Eclipse Group Solutions</title>
        <link>https://www.bitservices.io/projects/eclipse-group-solutions/</link>
        <pubDate>Mon, 06 Nov 2017 00:00:00 +0000</pubDate>
        
        <guid>https://www.bitservices.io/projects/eclipse-group-solutions/</guid>
        <description>&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.linkedin.com/company/eclipse-group-solutions-ltd./&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://www.bitservices.io/img/eclipse-group-solutions/logo.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Eclipse Group Solutions&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A very exciting &amp;lsquo;greenfield&amp;rsquo; project creating a new infrastructure platform
using &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon Web Services&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://docker.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; for &lt;a class=&#34;link&#34; href=&#34;https://www.sap.com/uk/products/crm/e-commerce-platforms.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SAP Commerce&lt;/a&gt; based
e-commerce websites.&lt;/p&gt;
&lt;p&gt;It had been a great pleasure working with the team at &lt;a class=&#34;link&#34; href=&#34;https://www.linkedin.com/company/eclipse-group-solutions-ltd./&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Eclipse&lt;/a&gt; whilst
delivering this project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;#result&#34; &gt;Skip to Result&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;project-breifing&#34;&gt;Project Breifing
&lt;/h1&gt;&lt;p&gt;The project aim was to create an &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon Web Services&lt;/a&gt; based, fully automated
infrastructure platform to host &lt;a class=&#34;link&#34; href=&#34;https://www.sap.com/uk/products/crm/e-commerce-platforms.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SAP Commerce&lt;/a&gt; e-commerce websites. The
platform must be constructed in a way that it can be used on other cloud
service providers with little effort later on.&lt;/p&gt;
&lt;p&gt;Developers and testers needed the ability to get code and features through
testing pipelines much quicker. In addition, production websites need to handle
peak demand seamlessly.&lt;/p&gt;
&lt;p&gt;As well as delivering a platform, existing teams were to be assisted with
picking up new tools, technologies and concepts to enable on-going support
of the platform.&lt;/p&gt;
&lt;h1 id=&#34;solution&#34;&gt;Solution
&lt;/h1&gt;&lt;p&gt;The final solution comprised of many components. These components are outlined
below.&lt;/p&gt;
&lt;h2 id=&#34;infrastructure-as-code&#34;&gt;Infrastructure as Code
&lt;/h2&gt;&lt;p&gt;Writing infrastructure as code was key to this solution. This is what enabled
infrastructure to be provisioned in a reliable and repeatable way at the click
of a button. By taking advantage of &lt;a class=&#34;link&#34; href=&#34;https://terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; module sources it was possible
to define a collection of infrastructure objects (such as subnets, route
tables, gateways) in a single place but allow variables (such as name, CIDR
ranges) to be passed in depending on the environment being built. As a result
all infrastructure met defined standards, human error is vastly reduced and
development/production parity was achieved.&lt;/p&gt;
&lt;p&gt;By taking advantage of &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon Web Services&lt;/a&gt; availability zones and
infrastructure as code, all production environments were highly available and
could withstand the loss of an Amazon data centre without any downtime.&lt;/p&gt;
&lt;h2 id=&#34;immutable-software&#34;&gt;Immutable Software
&lt;/h2&gt;&lt;p&gt;To allow software (&lt;a class=&#34;link&#34; href=&#34;https://www.sap.com/uk/products/crm/e-commerce-platforms.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SAP Commerce&lt;/a&gt; in particular) to run in a dynamically scaled
environment there were a few challenges to overcome. There needed to be a way
to start &lt;a class=&#34;link&#34; href=&#34;https://www.sap.com/uk/products/crm/e-commerce-platforms.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SAP Commerce&lt;/a&gt; very quickly in &amp;lsquo;scale-up&amp;rsquo; situations additionally the
state of any running &lt;a class=&#34;link&#34; href=&#34;https://www.sap.com/uk/products/crm/e-commerce-platforms.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SAP Commerce&lt;/a&gt; instances had to be externalised in case of
scale-down.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docker.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker&lt;/a&gt; was chosen to containerise software. Containerisation enabled the
application and all dependencies, configurations, etc to be packed into an
image that can be started very quickly. By using &lt;a class=&#34;link&#34; href=&#34;https://www.sap.com/uk/products/crm/e-commerce-platforms.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SAP Commerce&lt;/a&gt; &amp;lsquo;aspects&amp;rsquo; a
single &lt;a class=&#34;link&#34; href=&#34;https://docker.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker&lt;/a&gt; image can be capable of running in multiple environments in
multiple modes. A single image can be promoted all the way through the testing
pipeline just by using tags.&lt;/p&gt;
&lt;p&gt;To make running containers stateless, services such as Amazon &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/s3/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;S3&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/efs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EFS&lt;/a&gt;
were used.&lt;/p&gt;
&lt;h2 id=&#34;service-orchestration&#34;&gt;Service Orchestration
&lt;/h2&gt;&lt;p&gt;To enable service-level auto scaling, auto healing, multi-tenant clustering and
service health checks, &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; was implemented. This allowed the platform
to meet the scaling requirements. The healing features of &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt; allowed
the platform to be more resilient to virtual machine failure or network outages
resulting in a higher service availability.&lt;/p&gt;
&lt;h1 id=&#34;technologies--tools&#34;&gt;Technologies &amp;amp; Tools
&lt;/h1&gt;&lt;p&gt;Multiple technologies and tools were used to deliver this project.&lt;/p&gt;
&lt;h2 id=&#34;amazon-web-services&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon Web Services&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;The initial cloud provider chosen was Amazon. Amazon Web Services (AWS) is a
mature cloud service with endless offerings. It is effortless to build
highly-available and highly-performant infrastructure stacks. Most tools (such
as &lt;a class=&#34;link&#34; href=&#34;https://terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://github.com/kubernetes/kops&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kops&lt;/a&gt; below) offer excellent support for AWS. By using the
many AWS services available such as &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/iam/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;IAM&lt;/a&gt; and availability zones it was
possible to create secure and resilient infrastructure.&lt;/p&gt;
&lt;h2 id=&#34;hashicorp-terraform&#34;&gt;Hashicorp &lt;a class=&#34;link&#34; href=&#34;https://terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terraform&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Terraform was chosen to build foundation and networking infrastructure.
Terraform has excellent &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon Web Services&lt;/a&gt; support and code can easily be
ported to work with other cloud providers too - including OpenStack for
managing resources on-premises. Terraform made it very easy to meet the project
requirements to stay cloud agnostic and to fully automate infrastructure.&lt;/p&gt;
&lt;h2 id=&#34;docker&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://docker.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Containerisation was chosen to help simplify development. Rather than pushing a
codebase that may have a complete different set of steps to deploy depending on
target environment, containerisation makes that a single image that may take
the target environment as a parameter. Additionally, all dependencies and
libraries required to run the application are packed into the container,
meaning that the same container can be ran locally, on tin or in the cloud with
minimal effort. Docker was chosen specifically due to it being well proven and
mature.&lt;/p&gt;
&lt;h2 id=&#34;kubernetes&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Kubernetes is fast becoming an industry standard for container orchestration.
It can also run on any cloud provider or even on-premises on tin. Native
support for service-level auto-scaling and &amp;lsquo;cluster autoscaler&amp;rsquo; add-on for the
scaling of underlying virtual machines allowed scaling requirements to be met.
The many different types of services (deployments, statefulsets, daemonsets),
specifications (disruption budgets, affinities) and probes (liveness,
readiness) made it possible to build a platform that is resilient against
hypervisor, network or even data centre failures.&lt;/p&gt;
&lt;h2 id=&#34;other-tools&#34;&gt;Other Tools
&lt;/h2&gt;&lt;p&gt;Other tools used to deliver this project include: &lt;a class=&#34;link&#34; href=&#34;https://github.com/kubernetes/kops&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kops&lt;/a&gt;, Hasicorp &lt;a class=&#34;link&#34; href=&#34;https://www.packer.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Packer&lt;/a&gt;
and &lt;a class=&#34;link&#34; href=&#34;https://www.ansible.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ansible&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;result&#34;&gt;Result
&lt;/h1&gt;&lt;p&gt;The result of this project allows &lt;a class=&#34;link&#34; href=&#34;https://www.linkedin.com/company/eclipse-group-solutions-ltd./&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Eclipse&lt;/a&gt; to offer their customers an
improved hosting service. Development environments can now be provisioned
rapidly and easily decommissioned when not in use to match project demands.
Automatic scaling allows customers websites to seamlessly handle high load
during sales and events whilst running economically during quiet periods. The
platform allows for zero-downtime code deployments and platform updates. High
availability is achieved by always running across multiple availability zones
(data centres) in addition to having automatic health checks and repairs.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
</description>
        </item>
        
    </channel>
</rss>
