The language of templates
Introduction: Many infrastructure providers
including the Azure public cloud favor templates that manifest infrastructure
as a code. Azure offers a
control plane for all resources that can be deployed to the cloud and services
take advantage of them both for themselves and their customers. While Azure
Functions allow extensions via new resources, Azure Resource provider and ARM
APIs provide extensions via existing resources. This eliminates the need to
have new processes introduced around new resources and is a significant win for
reusability and user convenience. Resources and their extensions can be written
only in Bicep and ARM templates. Bicep provides more concise syntax and
improved type safety, but they compile to ARM templates which is the de facto standard
to declare and use Azure resources and supported by the unified Azure Resource
Manager. Bicep is a new domain-specific language that was recently developed
for authoring ARM templates by using an easier syntax. Bicep is typically
used for resource deployments to Azure. It is a new deployment-specific
language that was recently developed. Either or both JSON and Bicep can be used
to author ARM templates and while JSON is ubiquitous, Bicep can only be used
with Resource Manager Templates. In fact, Bicep has tooling that converts Bicep
templates into standard Json Templates for ARM Resources by a process called
transpilation. This conversion happens automatically but it can also be
manually invoked. Bicep is succint so it provides a further incentive. The use
of builtin functions, conditions and loops for repetitive resources infuses
logic into the ARM templates.
With the standardization of the
template, it can bring consistency across services and their resources with
added benefits like policy as a code and repeated deployments across clouds and
regions. The need for region agnostic deployments cannot be over-emphasized for
foundational services that struggle with limitations. There are many clouds and
regions to support, and the task of deployment could have significant cost when
the services groan without the availability of suitable ARM Templates.
Other infrastructure providers like
Kubernetes have a language that articulates state so that its control loop can
reconcile these resources. The resources can be generated and infused with
specific configuration and secret using a configMap generator and a secret
generator respectively. For example, it can take an existing
application.properties file and generate a configMap that can be applied to new
resources. Kustomization allows us to override the registry for all images used
in the containers for an application. There are two advantages to using
it. First, it allows us to configure the individual components of the
application without requiring changes in them. Second, it allows us to combine
components from different sources and overlay them or even override certain
configurations. The kustomize tool provides this feature. Kustomize can add
configmaps and secrets to the deployments using their specific generators
respectively. Kustomize is static declaration. It allows adding labels across
components. We can choose the groups of Kubernetes resources dynamically using
selectors, but they must be declared as yaml. This kustomization yaml is
usually stored as manifests and applied on existing components so they refer to
other yamls. Arguably, yaml is the most succint format of templates.
Azure Blueprints can be leveraged to
allow an engineer or architect to sketch a project’s design parameters, define
a repeatable set of resources that implements and adheres to an organization’s
standards, patterns and requirements. It is a declarative way to
orchestrate the deployment of various resource templates and other artifacts
such as role assignments, policy assignments, ARM templates, and Resource
Groups. Blueprint Objects are stored in the CosmosDB and replicated to multiple
Azure regions. Since it is designed to setup the environment, it is different
from resource provisioning. This package fits nicely into a CI/CD pipeline and
handles both what should be deployed and the assignment of what was deployed.
Yet none of the formats discussed so
far make use of the technique popularized by dockerfiles that represent
container images. An image is a collection of layers where each layer
represents a set of file-system differences over a base but are themselves
stored as folders and files. This not only makes the building of an image
incremental, programmatic and re-usable but also interchangeable instead of
merely a composite. Perhaps, that is the next evolutionary step to templates.
No comments:
Post a Comment