Install Consul on Kubernetes with Helm

This topic describes how to install Consul on Kubernetes using the official Consul Helm chart. For instruction on how to install Consul on Kubernetes using the Consul K8s CLI, refer to Installing the Consul K8s CLI.

Introduction

We recommend using the Consul Helm chart to install Consul on Kubernetes for multi-cluster installations that involve cross-partition or cross datacenter communication. The Helm chart installs and configures all necessary components to run Consul.

Consul can run directly on Kubernetes so that you can leverage Consul functionality if your workloads are fully deployed to Kubernetes. For heterogeneous workloads, Consul agents can join a server running inside or outside of Kubernetes. Refer to the Consul on Kubernetes architecture to learn more about its general architecture.

The Helm chart exposes several useful configurations and automatically sets up complex resources, but it does not automatically operate Consul. You must still become familiar with how to monitor, backup, and upgrade the Consul cluster.

The Helm chart has no required configuration, so it installs a Consul cluster with default configurations. We strongly recommend that you learn about the configuration options before going to production.

Security warning: By default, Helm installs Consul with security configurations disabled so that the out-of-box experience is optimized for new users. We strongly recommend using a properly-secured Kubernetes cluster or making sure that you understand and enable Consul’s security features before going into production. Some security features are not supported in the Helm chart and require additional manual configuration.

Refer to the architecture section to learn more about the general architecture of Consul on Kubernetes.

For a hands-on experience with Consul as a service mesh for Kubernetes, follow the Getting Started with Consul service mesh tutorial.

Requirements

Using the Helm Chart requires Helm version 3.6+. Visit the Helm website to download the latest version.

Install Consul

  1. Add the HashiCorp Helm Repository:

    1. $ helm repo add hashicorp https://helm.releases.hashicorp.com
    2. "hashicorp" has been added to your repositories
  2. Verify that you have access to the consul chart:

    1. $ helm search repo hashicorp/consul
    2. NAME CHART VERSION APP VERSION DESCRIPTION
    3. hashicorp/consul 1.0.1 1.14.1 Official HashiCorp Consul Chart
  3. Before you install Consul on Kubernetes with Helm, ensure that the consul Kubernetes namespace does not exist. We recommend installing Consul on a dedicated namespace.

    1. $ kubectl get namespace
    2. NAME STATUS AGE
    3. default Active 18h
    4. kube-node-lease Active 18h
    5. kube-public Active 18h
    6. kube-system Active 18h
  4. Install Consul on Kubernetes using Helm. The Helm chart does everything to set up your deployment: after installation, agents automatically form clusters, elect leaders, and run the necessary agents.

  • Run the following command to install the latest version of Consul on Kubernetes with its default configuration.

    1. $ helm install consul hashicorp/consul --set global.name=consul --create-namespace --namespace consul

    You can also install Consul on a dedicated namespace of your choosing by modifying the value of the -n flag for the Helm install.

  • To install a specific version of Consul on Kubernetes, issue the following command with --version flag:

    1. $ export VERSION=1.0.1
    2. $ helm install consul hashicorp/consul --set global.name=consul --version ${VERSION} --create-namespace --namespace consul

Custom installation

If you want to customize your installation, create a values.yaml file to override the default settings. To learn what settings are available, run helm inspect values hashicorp/consul or read the Helm Chart Reference.

Minimal values.yaml for Consul service mesh

The following values.yaml config file contains the minimum required settings to enable Consul Service Mesh:

Install from Helm Chart - 图1

values.yaml

  1. global:
  2. name: consul

After you create your values.yaml file, run helm install with the --values flag:

  1. $ helm install consul hashicorp/consul --create-namespace --namespace consul --values values.yaml
  2. NAME: consul
  3. ...

Enable the Consul CNI plugin

By default, Consul injects a connect-inject-init init container as part of the Kubernetes pod startup process when Consul is in transparent proxy mode. The container configures traffic redirection in the service mesh through the sidecar proxy. To configure redirection, the container requires elevated CAP_NET_ADMIN privileges, which may not be compatible with security policies in your organization.

Instead, you can enable the Consul container network interface (CNI) plugin to perform traffic redirection. Because the plugin is executed by the local Kubernetes kubelet, the plugin already has the elevated privileges necessary to configure the network.

The Consul Helm Chart is responsible for installing the Consul CNI plugin. To configure the plugin to be installed, add the following configuration to your values.yaml file:

Install from Helm Chart - 图2

values.yaml

  1. global:
  2. name: consul
  3. connectInject:
  4. enabled: true
  5. cni:
  6. enabled: true
  7. logLevel: info
  8. cniBinDir: "/opt/cni/bin"
  9. cniNetDir: "/etc/cni/net.d"

Install from Helm Chart - 图3

values.yaml

  1. global:
  2. name: consul
  3. connectInject:
  4. enabled: true
  5. cni:
  6. enabled: true
  7. logLevel: info
  8. cniBinDir: "/home/kubernetes/bin"
  9. cniNetDir: "/etc/cni/net.d"

Install from Helm Chart - 图4

values.yaml

  1. global:
  2. name: consul
  3. openshift:
  4. enabled: true
  5. connectInject:
  6. enabled: true
  7. cni:
  8. enabled: true
  9. logLevel: info
  10. multus: true
  11. cniBinDir: "/var/lib/cni/bin"
  12. cniNetDir: "/etc/kubernetes/cni/net.d"

The following table describes the available CNI plugin options:

OptionDescriptionDefault
cni.enabledBoolean value that enables or disables the CNI plugin. If true, the plugin is responsible for redirecting traffic in the service mesh. If false, redirection is handled by the connect-inject init container.false
cni.logLevelString value that specifies the log level for the installer and plugin. You can specify the following values: info, debug, error.info
cni.namespaceSet the namespace to install the CNI plugin into. Overrides global namespace settings for CNI resources, for example kube-systemnamespace used for consul-k8s install, for example consul
cni.multusBoolean value that enables multus CNI plugin support. If true, multus will be enabled. If false, Consul CNI will operate as a chained plugin.false
cni.cniBinDirString value that specifies the location on the Kubernetes node where the CNI plugin is installed./opt/cni/bin
cni.cniNetDirString value that specifies the location on the Kubernetes node for storing the CNI configuration./etc/cni/net.d

Enable Consul service mesh on select namespaces

By default, Consul Service Mesh is enabled on almost all namespaces within a Kubernetes cluster, with the exception of kube-system and local-path-storage. To restrict the service mesh to a subset of namespaces:

  1. specify a namespaceSelector that matches a label attached to each namespace where you want to deploy the service mesh. In order to default to enabling service mesh on select namespaces by label, the connectInject.default value must be set to true.

Install from Helm Chart - 图5

values.yaml

  1. global:
  2. name: consul
  3. connectInject:
  4. enabled: true
  5. default: true
  6. namespaceSelector: |
  7. matchLabels:
  8. connect-inject : enabled
  1. Label the namespaces where you would like to enable Consul Service Mesh.

    1. $ kubectl create ns foo
    2. $ kubectl label namespace foo connect-inject=enabled
  2. Run helm install with the --values flag:

    1. $ helm install consul hashicorp/consul --create-namespace --namespace consul --values values.yaml
    2. NAME: consul

Update your Consul on Kubernetes configuration

If you already installed Consul and want to make changes, you need to run helm upgrade. Refer to Upgrading for more details.

Usage

You can view the Consul UI and access the Consul HTTP API after installation.

Viewing the Consul UI

The Consul UI is enabled by default when using the Helm chart.

For security reasons, it is not exposed through a LoadBalancer service by default. To visit the UI, you must use kubectl port-forward.

Port forward with TLS disabled

If running with TLS disabled, the Consul UI is accessible through http on port 8500:

  1. $ kubectl port-forward service/consul-server --namespace consul 8500:8500
  2. ...

After you set up the port forward, navigate to http://localhost:8500.

Port forward with TLS enabled

If running with TLS enabled, the Consul UI is accessible through https on port 8501:

  1. $ kubectl port-forward service/consul-server --namespace consul 8501:8501
  2. ...

After you set up the port forward, navigate to https://localhost:8501.

You need to click through an SSL warning from your browser because the Consul certificate authority is self-signed and not in the browser’s trust store.

ACLs Enabled

If ACLs are enabled, you need to input an ACL token to display all resources and make modifications in the UI.

To retrieve the bootstrap token that has full permissions, run:

  1. $ kubectl get secrets/consul-bootstrap-acl-token --template='{{.data.token | base64decode }}'
  2. e7924dd1-dc3f-f644-da54-81a73ba0a178%

Then paste the token into the UI under the ACLs tab (without the %).

NOTE: If using multi-cluster federation, your kubectl context must be in the primary datacenter to retrieve the bootstrap token since secondary datacenters use a separate token with less permissions.

Exposing the UI through a service

If you want to expose the UI via a Kubernetes Service, configure the ui.service chart values. Because this service allows requests to the Consul servers, it should not be open to the world.

Accessing the Consul HTTP API

While technically any listening agent can respond to the HTTP API, communicating with the local Consul node has important caching behavior and allows you to use the simpler /agent endpoints for services and checks.

To find information about a node, you can use the downward API.

An example pod specification is shown below. In addition to pods, anything with a pod template can also access the downward API and can therefore also access Consul: StatefulSets, Deployments, Jobs, etc.

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: consul-example
  5. spec:
  6. containers:
  7. - name: example
  8. image: 'hashicorp/consul:latest'
  9. env:
  10. - name: HOST_IP
  11. valueFrom:
  12. fieldRef:
  13. fieldPath: status.hostIP
  14. command:
  15. - '/bin/sh'
  16. - '-ec'
  17. - |
  18. export CONSUL_HTTP_ADDR="${HOST_IP}:8500"
  19. consul kv put hello world
  20. restartPolicy: Never

An example Deployment is also shown below to show how the host IP can be accessed from nested pod specifications:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: consul-example-deployment
  5. spec:
  6. replicas: 1
  7. selector:
  8. matchLabels:
  9. app: consul-example
  10. template:
  11. metadata:
  12. labels:
  13. app: consul-example
  14. spec:
  15. containers:
  16. - name: example
  17. image: 'hashicorp/consul:latest'
  18. env:
  19. - name: HOST_IP
  20. valueFrom:
  21. fieldRef:
  22. fieldPath: status.hostIP
  23. command:
  24. - '/bin/sh'
  25. - '-ec'
  26. - |
  27. export CONSUL_HTTP_ADDR="${HOST_IP}:8500"
  28. consul kv put hello world

Next Steps

If you are still considering a move to Kubernetes, or to Consul on Kubernetes specifically, our Migrate to Microservices with Consul Service Mesh on Kubernetes collection uses an example application written by a fictional company to illustrate why and how organizations can migrate from monolith to microservices using Consul service mesh on Kubernetes. The case study in this collection should provide information valuable for understanding how to develop services that leverage Consul during any stage of your microservices journey.