How to use Charmed Kubernetes addon Operator Charms
This page gives step by step guides for deploying the Operator Charm versions of the Charmed Kubernetes addons. For an explanation of these addons, please see the addons page.
Steps for all addons
In order for Juju to deploy Kubernetes applications, it will need to fetch information and be configured to work with your Kubernetes cluster. These steps assume:
- You have administrative access to the Charmed Kubernetes cluster.
- Your Charmed Kubernetes is running in a model called ‘ck-model’. Replace this term in the commands listed for a different model name.
- Your Juju controller is running on version 2.9.30+. See instructions for upgrading a controller below.
1. Confirm your Juju controller is up to date
Before creating and using a Kubernetes model, it is recommended to upgrade the controller model to the lastest version:
juju upgrade-model -m controller
2. Install kubectl
You will need kubectl to be able to use your Kubernetes cluster. If it is not already installed, it is easy to add via a snap package:
sudo snap install kubectl --classic
For other platforms and install methods, please see the [Kubernetes documentation][kubectl].
3. Retrieve the required configuration
Juju makes use of the kubectl config file to access the Kubernetes cluster.
For Linux-based systems, this file is usually located at ~/.kube/config
If you are already using kubectl
to access other clusters you may wish to merge
the configurations rather than replacing it. The following command fetches the
config file for kubectl
from the Kubernetes cluster and saves it to the default location:
juju ssh kubernetes-control-plane/leader -- cat config > ~/.kube/config
4. Add the Kubernetes cluster to Juju
Next, add your Kubernetes cluster as a cloud to your current Juju controller:
juju add-k8s ck8s --controller $(juju switch | cut -d: -f1)
You may replace ck8s
with whatever name you want to use to refer to this cloud, but
remember to substitute in the correct name in the remaining examples in this page.
<span class="p-notification__title">Note:</span>
<p class="p-notification__message"> Some operator charms may require access to storage. Please make sure your Kubernetes cluster has access to a storage class accessible to
the deployed applications.</p>
5. Add a model
To be able to deploy operators you will also need to create a Juju model in the cloud:
juju add-model k8s-model ck8s
Again, you should replace k8s-model
with a name you want to use to refer to
this Juju model. As well as creating a Juju model, this action will also
create a Kubernetes namespace of the same name which you can use to easily
monitor or manage operators you install on the cluster.
6. Switching between models
Juju will automatically “switch” to the new Kubernetes model you just created.
Most of the instructions for the add-on components here require commands to be run
in the model where Charmed Kubernetes is running and also in the model created on the Kubernetes cloud (which we have called ck8s
in this page). Use the Juju switch
command to see the currently available models:
juju switch
If you followed the example naming scheme, you should see something like this:
juju models
Controller: vs-bos
Model Cloud/Region Type Status Machines Cores Units Access Last connection
ck-model vsphere-boston/Boston vsphere available 11 18 21 admin 29 minutes ago
controller vsphere-boston/Boston vsphere available 1 - - admin just now
k8s-model* ck8s/default kubernetes available 0 - - admin never connected
In the above case, there are three models available to the current controller. One is the model created by the controller itself (“controller”), one is the model where Charmed Kubernetes is installed (in this case, it was called “ck-model”) and the final one, which has an asterisk to indicate it is the current model, is the one we just created. If you chose poor names or get confused between many different models, it is helpful to note that the “Type” field shows the underlying cloud type, so your kubernetes clouds are easier to spot.
To switch to the model which contains the CK cluster, we can run:
juju switch ck-model
…and to switch back to the model in the Kubernetes cloud:
juju switch k8s-model
CoreDNS
CoreDNS is sourced from: https://github.com/coredns/deployment.git
CoreDNS has been the default DNS provider for Charmed Kubernetes clusters since 1.14.
For additional control over CoreDNS, you can also deploy it into the cluster using the CoreDNS Kubernetes operator charm, as described below.
1. Disable in-tree CoreDNS
You will need access to the Juju model running Charmed Kubernetes (NOT the kubernetes cloud) and turn off the built-in DNS provider
juju switch ck-model
(replace “ck-model” with the model contianing Charmed Kubernetes)
With the Charmed Kubernetes model selected from Juju, run:
juju config kubernetes-control-plane dns-provider=none
2. Deploy the CoreDNS operator
Switch back to the Kubernetes cloud:
juju switch k8s-model
…and deploy the operator charm:
juju deploy coredns --channel=latest/stable --trust
You can check on the status of this deployment using the command:
kubectl get -n 'k8s-model' po
3. Configure Charmed Kubernetes to use this DNS
Although the ‘k8s-model’ is running on top of the components installed in ‘ck-model’, they are considered to be separate entities. To use an application running in one model from a different model, Juju supports ‘cross-model relations’. There are a few extra commands to enable this.
juju switch k8s-model
juju offer coredns:dns-provider
The offer command exposes the Juju relation for use in a different model. In the above, we
expose the dns-provider
relation endpoint.
To connect to that, switch models and use the consume
command:
juju switch ck-model
juju consume k8s-model.coredns
The consume
command is the counterpart to offer
. It establishes a connection to the specified model and application, and adds that resource to the current model. A running
application in the model can then be related to it as thought it were a local model
resource. In this case you want to connect it to the kubernetes-control-plane:
juju integrate -m ck-model coredns kubernetes-control-plane
Once everything settles, new or restarted pods will use the CoreDNS charm as their DNS provider. The CoreDNS charm config allows you to change the cluster domain, the IP address or config file to forward unhandled queries to, add additional DNS servers, or even override the Corefile entirely.
For more details, see the CoreDNS charm documentation
Kubernetes Dashboard
Sourced from: https://github.com/kubernetes/dashboard.git
The Kubernetes Dashboard is a standard and easy way to inspect and interact with your Kubernetes cluster. The dashboard operator charm
1. Disable the in-tree dashboard
Targeting the underlying cluster model (‘ck-model’ as used in these examples):
juju config kubernetes-control-plane enable-dashboard-addons=false
2. Deploy the Dashboard charm
For additional control over the Kubernetes Dashboard, you can also deploy it into
the cluster using the Kubernetes Dashboard operator charm.
To do so, set the enable-dashboard-addons
kubernetes-control-plane configuration
option to false
and deploy the charm into a Kubernetes model on your cluster:
juju switch k8s-model
juju deploy kubernetes-dashboard --channel=latest/stable --trust
3. Accessing the Dashboard
Allow the new dashboard time to settle - it needs to fetch and install various images and could take a few minutes depending on the underlying cloud.
Access to the Kubernetes Dashboard works as before. Please use the instructions in the Operations page.
Metrics
The metrics addon consists of two services, Kube State Metrics and Kubernetes Metrics Server. Both of these can be replaced by charm operators as detailed below.
Before deploying the new charms, you should turn off the built-in metrics features:
juju switch ck-model
juju config kubernetes-control-plane enable-metrics=false
1. Kube-State Metrics
Sourced from: https://github.com/kubernetes/kube-state-metrics.git
Kube-State-Metrics is a service which listens to the Kubernetes API server and generates metrics about the state of the objects. It is focused on the health of the various objects running inside kubernetes, such as deployments, nodes and pods.
Deploy the [kube-state-metrics-operator][] charm into this kubernetes model with:
juju deploy kube-state-metrics --trust
If you have a prometheus application running in the same model, it can also be related to this:
juju integrate kube-state-metrics prometheus
2. Kubernetes Metrics Server
The Kubernetes Metrics Server collects resource metrics from Kubelets and exposes them in the Kubernetes apiserver through Metrics API for use by the Horizontal Pod Autoscaler and Vertical Pod Autoscaler. The Metrics API can also be accessed by kubectl top
, making it easier to debug autoscaling pipelines.
Since version 1.24, the metrics-server
can be deployed into the cluster just like any other kubernetes application.
Firstly, ensure that the API aggregation is turned on
juju switch ck-model
juju config kubernetes-control-plane api-aggregation-extension=true
Then deploy the Kubernetes Metrics Server charm:
juju switch k8s-model
juju deploy kubernetes-metrics-server
Some of the new configuration options available through this charm are:
- upgrade the release of the
metrics-server
via configjuju config kubernetes-metrics-server release="v0.6.0"
- adjust the base image registry if the cluster demands a private registry
juju config kubernetes-metrics-server image-registry="my.registry.server:5000"
- adjust the arguments of the running service
juju config kubernetes-metrics-server extra-args="--kubelet-insecure-tls"