K8s cluster’ının Rancher ve Grafana üzerinden Yönetilmesi ve İzlenmesi

onur kocaman
Turk Telekom Bulut Teknolojileri
11 min readNov 20, 2022

Yapılacaklar listesi

  • Kubernetes cluster’ı Kubeadm deployment methodu kullanarak 1 master ve 3 adet worker nod’u üzerine kurulacak.
  • Rancher, master nod üzerine container olarak yüklenip, kurduğumuz K8s clusterı “Existing Cluster” olarak rancher’a import edilecek.
  • Prometheus ve Grafana yazılımları K8s üstüne yine container olarak deploy edilecek. Sonrasında K8s dashboard’u grafana’ya eklenecek.

Kubeadm ile kurulum yapmadan önce sunucuların tamamında aşağıdaki bazı ön gereksinimlerin sağlanması gerekiyor.

  • Swap kapatılmalı
sed -e '/swap/ s/^#*/#/' -i /etc/fstab
swapoff -a
  • /etc/hosts dosyalarına master ve worker nodlarının ip ve hostnameleri girilmeli.
cat << EOF >> /etc/hosts
<master ip> k8smaster01
<worker01 ip> k8sworker01
<worker02 ip> k8sworker02
<worker03 ip> k8sworker03
EOF
  • Sudo yetkisine sahip kullanıcı yaratılmalı.
useradd kubeuser
passwd kubeuser
usermod -aG wheel kubeuser
sed -e '/^%wheel/ s/^#*/#/' -i /etc/sudoers
sed -i 's/# %wheel/%wheel/g' /etc/sudoers
  • Worker nodlar üzerindeki kurulumlar ssh-key ile yapılacağı için key yaratıp diğer sunucular üzerine kopyalıyoruz.
ssh-keygen
ssh-copy-id <tüm worker nodlar>
  • Firewalld servisi disable edilecek. Açık kalacaksa gerekli portların (6443,179 vb.) firewalld’ye eklenmesi gerekiyor.
systemctl disable - now firewalld
  • Docker yüklenebilmesi için gerekli docker-ce reposu etkinleştirilmeli.
yum install -y yum-utils
yum-config-manager \
- add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
  • Yine gerekli olan centos extras reposu eklenmeli.

Öncelikle OS release major numarası alınır.

OS_RELEASE=$(rpm -q --qf "%{VERSION}" $(rpm -q --whatprovides redhat-release))
OS_RELEASE_MAJOR=$(echo $OS_RELEASE | cut -d. -f1)

GPG key download edilir ve kopyalanır.

curl -s https://www.centos.org/keys/RPM-GPG-KEY-CentOS-$OS_RELEASE_MAJOR | sudo tee /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$OS_RELEASE_MAJOR

Centos-extras repo dosyası yaratılır.

cat << EOF | sudo tee /etc/yum.repos.d/centos-extras.repo
[extras]
name=CentOS-$OS_RELEASE_MAJOR - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$OS_RELEASE_MAJOR&arch=\$basearch&repo=extras
#baseurl=http://mirror.centos.org/centos/$OS_RELEASE_MAJOR/extras/\$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$OS_RELEASE_MAJOR
priority=1
EOF
  • kubeadm, kubelet ve kubectl paketlerini yüklememiz gerekiyor bunun için gerekli repo tanımlarını aşağıdaki gibi yapacağız.
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
  • Kubelet ve kubeadm, selinux ile çalışacak şekilde dizayn edilmediklerinden selinux’u kapatıyoruz.
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  • containerd’yi yükleyip ve servisini etkineştiriyoruz.
yum install -y containerd.io
systemctl enable --now containerd
  • Kubeadm, kubelet ve kubectl paketlerini yüklüyoruz. Bu arada bu paketlerin update olmaması içinde repo tanımına “exclude” girdik.
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet

Control-plane ayağa kaldırılmadan önce bazı modüllerin ve sistem paramaterlerinin tüm nodlarda ayarlanması gerekiyor.

sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

[kubeuser@k8smaster01 ~]$ lsmod | grep br_netfilter
br_netfilter 22256 0
bridge 151336 1 br_netfilter
[kubeuser@k8smaster01 ~]$ lsmod | grep overlay
overlay 71964 0

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system
  • Şimdi master nod üzerinde control-plane çalıştıracağız. Hata alındığı taktirde aşağıdaki gibi hata giderilebilir.
sudo kubeadm init

Eğer aşağıdaki hatayı aldıysanız, tmol uzantılı dosyayı silip containerd servisini restart edip tekrar initializtion yapılması gerekiyor.

[preflight] Some fatal errors occurred:
[ERROR CRI]: container runtime is not running: output: E1120 15:53:56.095056 26124 remote_runtime.go:948] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
time="2022-11-20T15:53:56+03:00" level=fatal msg="getting status of runtime: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
error execution phase preflight
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
sudo kubeadm init

Kubeadm init çıktısı aşağıdaki gibi olmalı.


Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join <master_ip>:6443 --token eamzab.96rqpvh55svqiz2s \
--discovery-token-ca-cert-hash sha256:014dbde959e9117755324cb9dd256a08b2cb695e728049e204e164d630ff3b2b
  • Şimdi cluster’ı ayağa kaldırmak için normal kullanıcı ile aşağıdaki konfig dosyalarını kopyalacağız.
  mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • Artık clusterdaki master nodu ve podları kubectl ile görebiliriz. Bütün podların ayağa kalkması için bir süre geçmesi gerekiyor.
[kubeuser@k8smaster01 ~]$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-565d847f94-27zl5 0/1 Pending 0 5m29s
coredns-565d847f94-pjpfg 0/1 Pending 0 5m29s
etcd-k8smaster01 1/1 Running 0 5m35s
kube-apiserver-k8smaster01 1/1 Running 0 5m35s
kube-controller-manager-k8smaster01 1/1 Running 0 5m35s
kube-proxy-kdtdj 1/1 Running 0 5m29s
kube-scheduler-k8smaster01 1/1 Running 0 5m35s
[kubeuser@k8smaster01 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster01 NotReady control-plane 5m46s v1.25.4
[kubeuser@k8smaster01 ~]$
  • Şimdi kubeadm init komutunun çıktında gelen token’ı kullanarak worker nodların üzerinde aşağıdaki komutu sudo ile çalıştırıp nodları cluster’a dahil ediyoruz.
sudo kubeadm join <master_ip>:6443 --token eamzab.96rqpvh55svqiz2s \
--discovery-token-ca-cert-hash sha256:014dbde959e9117755324cb9dd256a08b2cb695e728049e204e164d630ff3b2b

Not: Worker nodları eklerken master noddaki hatayı alabilirsiniz. yine aşağıdaki komutu çalıştırmalıyız.

sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
  • Herhangi bir sıkıntı yoksa aşağıdaki gibi nodun cluster’a dahil olduğunu gösteren ifadeyi göreceğiz.


This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

  • Son durumda henüz pod network için network plugin’i yüklemediğimiz ve worker nodlarına rol tanımı yapmadığımız için aşağıdaki gibi statüsü “NotReady”, rolü ise boş olan nodlarla karşılaşırız.
[kubeuser@k8smaster01 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster01 NotReady control-plane 19m v1.25.4
k8sworker01 NotReady <none> 6m23s v1.25.4
k8sworker02 NotReady <none> 95s v1.25.4
k8sworker03 NotReady <none> 112s v1.25.4
  • Aşağıdaki komutla önce worker’lara rol atayalım.
kubectl label node k8sworker01 node-role.kubernetes.io/worker=worker
kubectl label node k8sworker02 node-role.kubernetes.io/worker=worker
kubectl label node k8sworker03 node-role.kubernetes.io/worker=worker
  • CNI network plugin olarak bazı seçenekler mevcut, bu kurulumda calico kullanıldı. K8s ortamında koşacak uygulamalara göre en iyi pratikler değişebilir.
curl https://docs.projectcalico.org/manifests/calico.yaml -O
ls -l calico.yaml
  • Calico yaml dosyası içinde pod network’ü için belirlenecek subnet bilgisini tutan “CALICO_IPV4POOL_CIDR” değişkeni uygun şekilde belirlenir. Network’ü belirlerken iç ağınızda bu netwokün kullanılmadığını teyit edin. Aksi taktirde pod network ayağa kalkmayacaktır.
[kubeuser@k8smaster01 ~]$  kubectl apply -f calico.yaml
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created
  • calico yaml dosyası apply edilerek pod network ayağa kaldırılır ve nodlar “ready” duruma getirilir.
[kubeuser@k8smaster01 ~]$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-798cc86c47-pbldb 1/1 Running 0 2m
kube-system calico-node-csgfv 1/1 Running 0 2m
kube-system calico-node-dbjc5 1/1 Running 0 2m
kube-system calico-node-dbjq7 0/1 Init:ImagePullBackOff 0 2m
kube-system calico-node-hvsn2 1/1 Running 0 2m
kube-system coredns-565d847f94-27zl5 1/1 Running 0 32m
kube-system coredns-565d847f94-pjpfg 1/1 Running 0 32m
kube-system etcd-k8smaster01 1/1 Running 0 32m
kube-system kube-apiserver-k8smaster01 1/1 Running 0 32m
kube-system kube-controller-manager-k8smaster01 1/1 Running 0 32m
kube-system kube-proxy-7wk49 1/1 Running 0 19m
kube-system kube-proxy-kdtdj 1/1 Running 0 32m
kube-system kube-proxy-kv4m4 1/1 Running 0 14m
kube-system kube-proxy-xs7c5 1/1 Running 0 15m
kube-system kube-scheduler-k8smaster01 1/1 Running 0 32m
[kubeuser@k8smaster01 ~]$ kubectl cluster-info
Kubernetes control plane is running at https://<master-ip>:6443
CoreDNS is running at https://<master-ip>:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[kubeuser@k8smaster01 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster01 Ready control-plane 32m v1.25.4
k8sworker01 Ready worker 19m v1.25.4
k8sworker02 Ready worker 15m v1.25.4
k8sworker03 Ready worker 15m v1.25.4
  • Şimdi rancher kurulumuna geçelim. Rancher yazının başında söyledğimiz gibi master nodun üzerine conatiner olarak yüklenecek.
  • Öncelikle master nodda docker servisini ayaklandıralım.
sudo yum install -y docker-ce docker-ce-cli docker-compose-plugin
sudo systemctl enable --now docker
  • Şimdi de rancher’ı container olarak çalıştıralım. Container stop edilmedikçe otomatik başlatılacaktır.
sudo docker run -d --restart=unless-stopped \
-p 80:80 -p 443:443 \
--privileged \
rancher/rancher:latest
  • Web sayfasındaki talimatları uygulayarak yeni şifre belirleyeceğiz.
[kubeuser@k8smaster01 ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3dac68e2882e rancher/rancher:latest "entrypoint.sh" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp festive_bhabha

[kubeuser@k8smaster01 ~]$ sudo docker logs 3dac68e2882e 2>&1 | grep "Bootstrap Password:"
2022/11/20 13:53:34 [INFO] Bootstrap Password: djthn2rbdjdl5csmdq8l9m6tqpfr5945q8nxnq7vxgc5mwqlktdrjt
  • Yeni şifre belirledikten sonra rancher’ın kendi ayağakaldırdığı lokal cluster ile karşılaşırız. Şimdi mevcuttaki K8s clusterı’ını “İmport existing” menüsünden ekliyoruz.
  • Generic seçerek ilerliyoruz.
  • Cluster’ımıza isim verip ekliyoruz.
  • Bir sonraki ekranda kayıt seçenekleri olarak self-signed seçiyoruz.
[kubeuser@k8smaster01 ~]$ curl --insecure -sfL https://<master-ip>/v3/import/55p8ckwpjn7vf4mm7xqfzb6zgx2txvfzchshtqgkb6mmccww6tlmnr_c-m-vvfsw6m8.yaml | kubectl apply -f -
clusterrole.rbac.authorization.k8s.io/proxy-clusterrole-kubeapiserver created
clusterrolebinding.rbac.authorization.k8s.io/proxy-role-binding-kubernetes-master created
namespace/cattle-system created
serviceaccount/cattle created
clusterrolebinding.rbac.authorization.k8s.io/cattle-admin-binding created
secret/cattle-credentials-0fa868f created
clusterrole.rbac.authorization.k8s.io/cattle-admin created
Warning: spec.template.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].key: beta.kubernetes.io/os is deprecated since v1.14; use "kubernetes.io/os" instead
deployment.apps/cattle-cluster-agent created
service/cattle-cluster-agent created
  • Sonunda cluster’ımız rancher’ a eklendi.
  • Şimdi Cluster’ımızda bir namesapce oluşturup prometheus ve grafana’yı deploy edelim.
  • Öncelikle prometheus için admin privilege sahip bir cluster-rolü tanımlıyoruz. Cluster kurulumlarında kullandığımız “kubeuser” kullanıyoruz.

[kubeuser@k8smaster01 ~]$ kubectl create clusterrolebinding owner-cluster-admin-binding \
> --clusterrole cluster-admin \
> --user kubeuser
clusterrolebinding.rbac.authorization.k8s.io/owner-cluster-admin-binding created
  • prometheus’ı github’dan çekiyoruz.
git clone https://github.com/techiescamp/kubernetes-prometheus
  • Monitoring isminde bir namespace oluşturuyoruz.
kubectl create namespace monitoring
  • Prometheus container, pod, namespace gibi cluster objelerine ait bilgileri çekebilmesi için admin yetkili cluster rolüne ihtiyacı var. Aşağıdaki yaml ile bunu tanımlıyoruz.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups: [""]
resources:
- nodes
- nodes/proxy
- services
- endpoints
- pods
verbs: ["get", "list", "watch"]
- apiGroups:
- extensions
resources:
- ingresses
verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: default
namespace: monitoring

[kubeuser@k8smaster01 ~]$ kubectl create -f clusterRole.yaml
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
  • Şimdi prometheus’u config-map dosyasını çekiyoruz. Prometheus’un konfigurasyonunda ya da alarm kurallarında değişiklik olduğunda yeni baştan imajı build etmeyi önlemek için config-map dosyası ile bilgiler prometheus’un dışına alınmıştır. Konfigurasyonda değişiklik olduğunda config map yeniden çalıştırılır ve prometheus podları yeniden başlatılır.
[kubeuser@k8smaster01 ~]$ wget https://raw.githubusercontent.com/bibinwilson/kubernetes-prometheus/master/config-map.yaml
--2022-11-20 17:22:12-- https://raw.githubusercontent.com/bibinwilson/kubernetes-prometheus/master/config-map.yaml
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.109.133, 185.199.108.133, 185.199.111.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.109.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5093 (5.0K) [text/plain]
Saving to: ‘config-map.yaml’

100%[=========================================================================================================================================================================================================================================>] 5,093 --.-K/s in 0s

2022-11-20 17:22:12 (90.0 MB/s) - ‘config-map.yaml’ saved [5093/5093]
[kubeuser@k8smaster01 ~]$ kubectl create -f config-map.yaml
configmap/prometheus-server-conf created
  • Prometheus deployment dosyası kullanarak prometheus ayağa kaldırılacak. Web arayüzündeki down durumundaki instance aşağıdaki şekilde up edilecek.
[kubeuser@k8smaster01 ~]$ kubectl create  -f prometheus-deployment.yaml
deployment.apps/prometheus-deployment created
[kubeuser@k8smaster01 ~]$ kubectl get deployments --namespace=monitoring
NAME READY UP-TO-DATE AVAILABLE AGE
prometheus-deployment 1/1 1 1 53s
  • Şimdi de prometheus bağlanalım, bunun için servis tanımı yapacağız.
apiVersion: v1
kind: Service
metadata:
name: prometheus-service
namespace: monitoring
annotations:
prometheus.io/scrape: 'true'
prometheus.io/port: '9090'
spec:
selector:
app: prometheus-server
type: NodePort
ports:
- port: 8080
targetPort: 9090
nodePort: 30000
[kubeuser@k8smaster01 ~]$ kubectl create -f prometheus-service.yaml --namespace=monitoring
service/prometheus-service created
  • Prometheus hangi nod’un üzerinde olduğunu kontrol edip 30000 portunda bağlanıyoruz.
[kubeuser@k8smaster01 ~]$ kubectl get pods --namespace=monitoring -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
prometheus-deployment-75cff7d89f-sx5pf 1/1 Running 0 4m54s 182.80.145.4 k8sworker02 <none> <none>
[kubeuser@k8smaster01 ~]$
  • Şimdi down olan “kube-state-metrics” endpointi düzeltelim.
git clone https://github.com/devopscube/kube-state-metrics-configs.git
kubectl apply -f kube-state-metrics-configs/
kubectl get deployments kube-state-metrics -n kube-system
  • şimdi grafanayı ekleyelim. Bunun için yine config-map, deployment ve service yaml dosyalarından faydalanacağız.
[kubeuser@k8smaster01 ~]$   cat grafana-datasource-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: grafana-datasources
namespace: monitoring
data:
prometheus.yaml: |-
{
"apiVersion": 1,
"datasources": [
{
"access":"proxy",
"editable": true,
"name": "prometheus",
"orgId": 1,
"type": "prometheus",
"url": "http://prometheus-service.monitoring.svc:8080",
"version": 1
}
]
}
[kubeuser@k8smaster01 ~]$ kubectl create -f grafana-datasource-config.yaml
configmap/grafana-datasources created
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: grafana
template:
metadata:
name: grafana
labels:
app: grafana
spec:
containers:
- name: grafana
image: grafana/grafana:latest
ports:
- name: grafana
containerPort: 3000
resources:
limits:
memory: "1Gi"
cpu: "1000m"
requests:
memory: 500M
cpu: "500m"
volumeMounts:
- mountPath: /var/lib/grafana
name: grafana-storage
- mountPath: /etc/grafana/provisioning/datasources
name: grafana-datasources
readOnly: false
volumes:
- name: grafana-storage
emptyDir: {}
- name: grafana-datasources
configMap:
defaultMode: 420
name: grafana-datasources
[kubeuser@k8smaster01 ~]$ kubectl create -f deployment.yaml
deployment.apps/grafana created
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: monitoring
annotations:
prometheus.io/scrape: 'true'
prometheus.io/port: '3000'
spec:
selector:
app: grafana
type: NodePort
ports:
- port: 3000
targetPort: 3000
nodePort: 32000
[kubeuser@k8smaster01 ~]$ kubectl create -f service.yaml
service/grafana created
  • Sonunda grafana’ya da 32000 portunda ulaştık.
  • Son olarak K8s’i grafana ya prometheus datasource üzerinden ekleyelim. Bunun için grafana.com’da çok sayı da dashboard var. Ben aşağıdakini kullandım.
  • Prometheus datasource olarak eklerken hangi nodda çalıştığını bulup 30000 portu ile http ile eklememiz gerekiyor.
[kubeuser@k8smaster01 ~]$ kubectl get pods -n monitoring -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
grafana-5469c64c7d-xmq98 1/1 Running 0 6m42s 182.80.53.132 k8sworker03 <none> <none>
prometheus-deployment-75cff7d89f-sx5pf 1/1 Running 0 21m 182.80.145.4 k8sworker02 <none> <none>

Kaynaklar:

--

--