How to install grafana plugin in airgap container environment

  1. Grafana version : v.9.0.4
  2. Grafana environment : Kube-prometheus stack

I want to use some grafana plugin in public repository.
I use grafana as container then it is hard to use wget.
If i want to use grafana plugin in environment of container is there way or guide?
Please let me know.

kubectl get pod -n monitoring | grep grafana
grafana-c48f6bbc4-d4nmn 1/1 Running 0 144m

$ kubectl describe pod grafana-c48f6bbc4-d4nmn -n monitoring
Name: grafana-c48f6bbc4-d4nmn
Namespace: monitoring
Priority: 0
Node: dkhiopsinf03/10.166.204.96
Start Time: Tue, 04 Oct 2022 12:38:30 +0900
Labels: app.kubernetes.io/component=grafana
app.kubernetes.io/name=grafana
app.kubernetes.io/part-of=kube-prometheus
app.kubernetes.io/version=9.0.4
pod-template-hash=c48f6bbc4
Annotations: checksum/grafana-config: 563127ddafae4dbd41e35c080ed5b739
checksum/grafana-dashboardproviders: 48f241f5bee2d4de7b5f833ab5906aad
checksum/grafana-datasources: a50d2496f51102900b8bdd577b4aed6a
cni.projectcalico.org/containerID: 8a5d5932df10c6c01c362207fcef2f3f73e510f7b86c2ad5e9905a4a3bc3028b
cni.projectcalico.org/podIP: 192.175.100.190/32
cni.projectcalico.org/podIPs: 192.175.100.190/32
Status: Running
IP: 192.175.100.190
IPs:
IP: 192.175.100.190
Controlled By: ReplicaSet/grafana-c48f6bbc4
Containers:
grafana:
Container ID: containerd://caa7906aace888091ad5116035957f89f2f8ed6d9713d7e8a729a3156b2a8596
Image: dcr.cloud.samsungds.net/dspaas-v1.22.10-a/grafana/grafana:9.0.4
Image ID: dcr.cloud.samsungds.net/dspaas-v1.22.10-a/grafana/grafana@sha256:c065bb100e0727c555fb62d5763870b20c30d16a59f3d4188090f0ede75d6e4d
Port: 3000/TCP
Host Port: 0/TCP
State: Running
Started: Tue, 04 Oct 2022 12:38:43 +0900
Ready: True
Restart Count: 0
Limits:
cpu: 200m
memory: 200Mi
Requests:
cpu: 100m
memory: 100Mi
Readiness: http-get http://:http/api/health delay=0s timeout=1s period=10s #success=1 #failure=3
Environment:
Mounts:
/etc/grafana from grafana-config (rw)
/etc/grafana/provisioning/dashboards from grafana-dashboards (rw)
/etc/grafana/provisioning/datasources from grafana-datasources (rw)
/grafana-dashboard-definitions/0/alertmanager-overview from grafana-dashboard-alertmanager-overview (rw)
/grafana-dashboard-definitions/0/apiserver from grafana-dashboard-apiserver (rw)
/grafana-dashboard-definitions/0/cluster-total from grafana-dashboard-cluster-total (rw)
/grafana-dashboard-definitions/0/controller-manager from grafana-dashboard-controller-manager (rw)
/grafana-dashboard-definitions/0/grafana-overview from grafana-dashboard-grafana-overview (rw)
/grafana-dashboard-definitions/0/k8s-resources-cluster from grafana-dashboard-k8s-resources-cluster (rw)
/grafana-dashboard-definitions/0/k8s-resources-namespace from grafana-dashboard-k8s-resources-namespace (rw)
/grafana-dashboard-definitions/0/k8s-resources-node from grafana-dashboard-k8s-resources-node (rw)
/grafana-dashboard-definitions/0/k8s-resources-pod from grafana-dashboard-k8s-resources-pod (rw)
/grafana-dashboard-definitions/0/k8s-resources-workload from grafana-dashboard-k8s-resources-workload (rw)
/grafana-dashboard-definitions/0/k8s-resources-workloads-namespace from grafana-dashboard-k8s-resources-workloads-namespace (rw)
/grafana-dashboard-definitions/0/kubelet from grafana-dashboard-kubelet (rw)
/grafana-dashboard-definitions/0/namespace-by-pod from grafana-dashboard-namespace-by-pod (rw)
/grafana-dashboard-definitions/0/namespace-by-workload from grafana-dashboard-namespace-by-workload (rw)
/grafana-dashboard-definitions/0/node-cluster-rsrc-use from grafana-dashboard-node-cluster-rsrc-use (rw)
/grafana-dashboard-definitions/0/node-rsrc-use from grafana-dashboard-node-rsrc-use (rw)
/grafana-dashboard-definitions/0/nodes from grafana-dashboard-nodes (rw)
/grafana-dashboard-definitions/0/nodes-darwin from grafana-dashboard-nodes-darwin (rw)
/grafana-dashboard-definitions/0/persistentvolumesusage from grafana-dashboard-persistentvolumesusage (rw)
/grafana-dashboard-definitions/0/pod-total from grafana-dashboard-pod-total (rw)
/grafana-dashboard-definitions/0/prometheus from grafana-dashboard-prometheus (rw)
/grafana-dashboard-definitions/0/prometheus-remote-write from grafana-dashboard-prometheus-remote-write (rw)
/grafana-dashboard-definitions/0/proxy from grafana-dashboard-proxy (rw)
/grafana-dashboard-definitions/0/scheduler from grafana-dashboard-scheduler (rw)
/grafana-dashboard-definitions/0/workload-total from grafana-dashboard-workload-total (rw)
/tmp from tmp-plugins (rw)
/var/lib/grafana from grafana-storage (rw)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
grafana-storage:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: grafana-pvc
ReadOnly: false
grafana-datasources:
Type: Secret (a volume populated by a Secret)
SecretName: grafana-datasources
Optional: false
grafana-dashboards:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboards
Optional: false
tmp-plugins:
Type: EmptyDir (a temporary directory that shares a pod’s lifetime)
Medium: Memory
SizeLimit:
grafana-dashboard-alertmanager-overview:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-alertmanager-overview
Optional: false
grafana-dashboard-apiserver:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-apiserver
Optional: false
grafana-dashboard-cluster-total:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-cluster-total
Optional: false
grafana-dashboard-controller-manager:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-controller-manager
Optional: false
grafana-dashboard-grafana-overview:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-grafana-overview
Optional: false
grafana-dashboard-k8s-resources-cluster:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-k8s-resources-cluster
Optional: false
grafana-dashboard-k8s-resources-namespace:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-k8s-resources-namespace
Optional: false
grafana-dashboard-k8s-resources-node:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-k8s-resources-node
Optional: false
grafana-dashboard-k8s-resources-pod:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-k8s-resources-pod
Optional: false
grafana-dashboard-k8s-resources-workload:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-k8s-resources-workload
Optional: false
grafana-dashboard-k8s-resources-workloads-namespace:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-k8s-resources-workloads-namespace
Optional: false
grafana-dashboard-kubelet:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-kubelet
Optional: false
grafana-dashboard-namespace-by-pod:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-namespace-by-pod
Optional: false
grafana-dashboard-namespace-by-workload:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-namespace-by-workload
Optional: false
grafana-dashboard-node-cluster-rsrc-use:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-node-cluster-rsrc-use
Optional: false
grafana-dashboard-node-rsrc-use:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-node-rsrc-use
Optional: false
grafana-dashboard-nodes-darwin:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-nodes-darwin
Optional: false
grafana-dashboard-nodes:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-nodes
Optional: false
grafana-dashboard-persistentvolumesusage:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-persistentvolumesusage
Optional: false
grafana-dashboard-pod-total:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-pod-total
Optional: false
grafana-dashboard-prometheus-remote-write:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-prometheus-remote-write
Optional: false
grafana-dashboard-prometheus:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-prometheus
Optional: false
grafana-dashboard-proxy:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-proxy
Optional: false
grafana-dashboard-scheduler:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-scheduler
Optional: false
grafana-dashboard-workload-total:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: grafana-dashboard-workload-total
Optional: false
grafana-config:
Type: Secret (a volume populated by a Secret)
SecretName: grafana-config
Optional: false
QoS Class: Burstable
Node-Selectors: kubernetes.io/os=linux
node-type=infra
Tolerations: node-role.kubernetes.io/infra:NoSchedule
node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:

  • What Grafana version and what operating system are you using?

  • What are you trying to achieve?

  • How are you trying to achieve it?

  • What happened?

  • What did you expect to happen?

  • Can you copy/paste the configuration(s) that you are having problems with?

  • Did you receive any errors in the Grafana UI or in related logs? If so, please tell us exactly what they were.

  • Did you follow any online instructions? If so, what is the URL?

1 Like

There are two options we are using Grafana with plugins in the network-constrained environments:

  1. Create a custom docker image with Grafana configuration and pre-installed plugins.
  2. Create a private repository in the local network with required plugins. We explained this concept in the article.
2 Likes

Are you saying the whole environment is airgap-ed or certain containers within the environment?

certain containers with in the environment.
I saw above 2way to install plugin but is there no way to install by yaml?

Could you please see this document in Example plugin configuration file section?
Thanks

Thank you for your reply, Mikhail.
btw i am really curious the way to handle by yaml.

Could you please see this document in Example plugin configuration file section?
I am wandering jsonData : key value section how configured.
Thanks

If airgap-ed does not matter if you provision it ir install it manually, it cannot access the outside world hence cant install plugins.

As @mikhailvolkov said, within network of this container, you should have your own plugin repository from which the airgap-ed container can pull/install plugins.

Curious though how was grafana installed in the first place if airgap-ed?