Calico Metrics 모니터링 하기

Calico 는 쿠버네티스(Kubernetes) 의 CNI 다. 쉽게 말해서 쿠버네티스의 네트워킹을 가능하게 해준다. 설치도 쉽게 할수 있는데, 프로메테우스에서 Calico 모니터링을 하기 위해서는 추가적인 작업이 필요한데 여기에 대해서 알아본다.

calicoctl

calicoctl 을 설치해야 한다. 이 파일은 바이너리이며 wget, curl 명령어를 이용해서 설치가 가능하다. 설치를 한 후에 이것을 사용하기 위해서는 다음과 같이 환경변수를 설정해 준다.

$ export DATASTORE_TYPE=kubernetes
$ export KUBECONFIG=~/.kube/config
$ calicoctl get nodes
NAME                     
kworker1.systemv.local   
kworker2.systemv.local   
kworker3.systemv.local
$ calicoctl get workloadendpoints
WORKLOAD                                 NODE                     NETWORKS          INTERFACE         
dnsutils                                 kworker2.systemv.local   10.31.168.71/32   calib3c61c3cba9   
springboot-deployment-77db875f78-9fshx   kworker3.systemv.local   10.31.4.57/32     cali11c98587cc4   
springboot-deployment-77db875f78-km8rd   kworker1.systemv.local   10.31.20.48/32    cali712f16523f2   
springboot-deployment-77db875f78-nj7t7   kworker1.systemv.local   10.31.20.57/32    calibcff04191b7
$ calicoctl get ippools
NAME                  CIDR           SELECTOR   
default-ipv4-ippool   10.31.0.0/16   all()

calicoctl 명령어는 다양한 질의를 할 수 있다.

Calico CRD

Calico 설치를 메니페스트로 설치를 하게 되면 CRD 가 생성되면서 CRD 에 정의된 오브젝트가 함께 생성된다.

$ kubectl get crd | grep calico
bgpconfigurations.crd.projectcalico.org               2021-04-18T17:42:07Z
bgppeers.crd.projectcalico.org                        2021-04-18T17:42:07Z
blockaffinities.crd.projectcalico.org                 2021-04-18T17:42:08Z
caliconodestatuses.crd.projectcalico.org              2022-01-28T16:00:01Z
clusterinformations.crd.projectcalico.org             2021-04-18T17:42:08Z
felixconfigurations.crd.projectcalico.org             2021-04-18T17:42:08Z
globalnetworkpolicies.crd.projectcalico.org           2021-04-18T17:42:08Z
globalnetworksets.crd.projectcalico.org               2021-04-18T17:42:08Z
hostendpoints.crd.projectcalico.org                   2021-04-18T17:42:08Z
ipamblocks.crd.projectcalico.org                      2021-04-18T17:42:09Z
ipamconfigs.crd.projectcalico.org                     2021-04-18T17:42:09Z
ipamhandles.crd.projectcalico.org                     2021-04-18T17:42:09Z
ippools.crd.projectcalico.org                         2021-04-18T17:42:09Z
ipreservations.crd.projectcalico.org                  2022-01-28T16:00:02Z
kubecontrollersconfigurations.crd.projectcalico.org   2021-04-18T17:42:09Z
networkpolicies.crd.projectcalico.org                 2021-04-18T17:42:09Z
networksets.crd.projectcalico.org                     2021-04-18T17:42:10Z

이것을 언급하는 이유는 Calico 홈페이지에 보면 이에 대한 언급이 많이 되어 있지 않은채, API 를 언급하고 있다. 만일 API 조회를 해봤는데 없다면 CRD 를 살펴보고 찾으면 된다.

Monitor Calico component metrics

Felix configuration

이제 Calico 의 컴포넌트 메트릭을 활성화 해보자. 이를 위해서는 felixconfigurations 의 설정을 먼저 바꿔야 한다. 이를 위해서 calicoctl 명령어를 활용한다.

$ kubectl get felixconfigurations -o yaml
apiVersion: v1
items:
- apiVersion: crd.projectcalico.org/v1
  kind: FelixConfiguration
  metadata:
    annotations:
      projectcalico.org/metadata: '{"uid":"92e205c7-7ba5-48f2-997d-e6c50b9893df","creationTimestamp":"2021-04-18T17:42:57Z"}'
    creationTimestamp: "2021-04-18T17:42:57Z"
    generation: 2
    name: default
    resourceVersion: "35474"
    uid: 92e205c7-7ba5-48f2-997d-e6c50b9893df
  spec:
    bpfLogLevel: ""
    ipipEnabled: true
    logSeverityScreen: Info
    reportingInterval: 0s
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""
$ calicoctl patch felixConfiguration default  --patch '{"spec":{"prometheusMetricsEnabled": true}}'
Successfully patched 1 'FelixConfiguration' resource
$ kubectl get felixconfigurations -o yaml
apiVersion: v1
items:
- apiVersion: crd.projectcalico.org/v1
  kind: FelixConfiguration
  metadata:
    annotations:
      projectcalico.org/metadata: '{"uid":"92e205c7-7ba5-48f2-997d-e6c50b9893df","creationTimestamp":"2021-04-18T17:42:57Z"}'
    creationTimestamp: "2021-04-18T17:42:57Z"
    generation: 3
    name: default
    resourceVersion: "1015953"
    uid: 92e205c7-7ba5-48f2-997d-e6c50b9893df
  spec:
    bpfLogLevel: ""
    ipipEnabled: true
    logSeverityScreen: Info
    prometheusMetricsEnabled: true
    reportingInterval: 0s
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

Creating a service to expose Felix metrics

이제 프로메테우스에서 메트릭 수집을 위한 서비스를 다음과 같이 만든다.

$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
  name: calico-felix-metrics-svc
  namespace: kube-system
  labels:
    app.kubernetes.io/instance: calico
    app.kubernetes.io/name: felix
    k8s-app: felix-metrics
spec:
  selector:
    k8s-app: calico-node
  ports:
  - name: metrics
    port: 9091
    protocol: TCP
    targetPort: 9091
EOF
service/felix-metrics-svc created

Felix 는 쿠버네티스 WorkerNode 에서 실행되는 CNI 를 말한다. 셀렉터를 보면 k8s-app: calico-node 를 설정하고 있는데, Calico Node 의 Pods 를 지정한 것이다.

또, 나중에 ServiceMonitor 설정을 위해서 Labels 를 잘 설정해줘야 한다.

Typha 설정은 하지 않는다. 50개 노드 이하로 설치를 했기 때문에 Typha 가 없다.

Confirm prometheus metrics port

쿠버네티스는 컨트롤 설정을 하나로 모아 놨다. 이 설정을 보면 여러가지 오브젝트에 대한 내용도 나오는데, 이 오브젝트에 대한 프로메테우스 엔드포인트는 9094로 정의 되어 있다. 이 포트를 이용하면 모든 메트릭의 엔드포이트를 가지고 올 수 있다.

$ kubectl get kubecontrollersconfiguration -o yaml
apiVersion: v1
items:
- apiVersion: crd.projectcalico.org/v1
  kind: KubeControllersConfiguration
  metadata:
    annotations:
      projectcalico.org/metadata: '{"uid":"d2a63152-c0ba-407c-9d2e-8be8d559d941","creationTimestamp":"2021-04-18T17:43:07Z"}'
    creationTimestamp: "2021-04-18T17:43:07Z"
    generation: 4
    name: default
    resourceVersion: "797517"
    uid: d2a63152-c0ba-407c-9d2e-8be8d559d941
  spec:
    controllers:
      namespace:
        reconcilerPeriod: 5m0s
      node:
        leakGracePeriod: 15m0s
        reconcilerPeriod: 5m0s
        syncLabels: Enabled
      policy:
        reconcilerPeriod: 5m0s
      serviceAccount:
        reconcilerPeriod: 5m0s
      workloadEndpoint:
        reconcilerPeriod: 5m0s
    etcdV3CompactionPeriod: 10m0s
    healthChecks: Enabled
    logSeverityScreen: Info
    prometheusMetricsPort: 9094
  status:
    environmentVars:
      DATASTORE_TYPE: kubernetes
      ENABLED_CONTROLLERS: node
    runningConfig:
      controllers:
        node:
          hostEndpoint:
            autoCreate: Disabled
          leakGracePeriod: 15m0s
          syncLabels: Disabled
      etcdV3CompactionPeriod: 10m0s
      healthChecks: Enabled
      logSeverityScreen: Info
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

Creating a service to expose kube-controllers metrics

앞에 Felix 는 Node 의 CNI 라고 한다면 이를 제어하는 것이 컨트롤러이다. 이를 위한 서비스를 다음과 같이 생성해 준다.

$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
  name: calico-kube-controllers-metrics-svc
  namespace: kube-system
  labels:
    app.kubernetes.io/instance: calico
    app.kubernetes.io/name: calico-kube-controllers-metrics-svc
    k8s-app: calico-kube-controllers-metrics-metrics
spec:
  selector:
    k8s-app: calico-kube-controllers
  ports:
  - name: metrics
    port: 9094
    protocol: TCP
    targetPort: 9094
EOF

Calico-kube-controllers 의 Pods 를 찾기 위해서 셀렉터 k8s-app: calico-kube-controllers 지정해 준다. 그리고 ServiceMonitor 에서 찾을 수 있도록 Labels 를 설정해 줬다.

Prometheus ServiceMonitor 생성

나는 프로메테우스를 Operator 로 설치했다. Prometheus-Operator 설치를 할 경우에 메트릭 수집은 ServiceMonitor 를 통해서 이루어진다. 이 ServiceMonitor 는 Prometheus 의 설정을 함께 적용하면서 동작한다. Prometheus 의 Scape 을 ServiceMonitor 가 대신하는 것이라고 생각하면 쉽다.

Felix 를 위한 ServiceMonitor

Felix 를 위한 ServiceMonitor 는 다음과 같다.

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    serviceapp: calico-felix-servicemonitor
    release: prometheus
  name: prometheus-kube-prometheus-calico-felix
  namespace: monitoring
spec:
  namespaceSelector:
    matchNames:
    - kube-system
  selector:
    matchLabels:
      app.kubernetes.io/instance: calico
      app.kubernetes.io/name: felix
      k8s-app: felix-metrics
  jobLabel: felix_metrics
  endpoints:
  - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
    interval: 15s
    port: metrics
    relabelings:
    - sourceLabels: [__meta_kubernetes_service_name]
      regex: calico-felix-metrics-svc
      action: keep
      replacement: $1

셀렉터를 이용해서 Service 의 Felix 를 지정해줬고, 스크랩에서도 Felix 를 인식하도록 서비스 이름을 지정해 줬다.

Calico Kube Controller ServiceMonitor

Calico kube controller 를 위한 ServiceMonitor 는 다음과 같다.

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    serviceapp: calico-kube-controller-servicemonitor
    release: prometheus
  name: prometheus-kube-prometheus-calico-controller
  namespace: monitoring
spec:
  namespaceSelector:
    matchNames:
    - kube-system
  selector:
    matchLabels:
      app.kubernetes.io/instance: calico
      app.kubernetes.io/name: calico-kube-controllers-metrics-svc
      k8s-app: calico-kube-controllers-metrics-metrics
  jobLabel: calico_kube_controller_metrics
  endpoints:
  - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
    interval: 15s
    port: metrics
    relabelings:
    - sourceLabels: [__meta_kubernetes_service_name]
      regex: calico-kube-controllers-metrics-svc
      action: keep
      replacement: $1

위와같이 한 후에 프로메테우스를 살펴보면 다음과 같이 나온다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다