Calico Metrics 모니터링 하기
Calico 는 쿠버네티스(Kubernetes) 의 CNI 다. 쉽게 말해서 쿠버네티스의 네트워킹을 가능하게 해준다. 설치도 쉽게 할수 있는데, 프로메테우스에서 Calico 모니터링을 하기 위해서는 추가적인 작업이 필요한데 여기에 대해서 알아본다.
calicoctl
calicoctl 을 설치해야 한다. 이 파일은 바이너리이며 wget, curl 명령어를 이용해서 설치가 가능하다. 설치를 한 후에 이것을 사용하기 위해서는 다음과 같이 환경변수를 설정해 준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ 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 에 정의된 오브젝트가 함께 생성된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ 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 명령어를 활용한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
$ 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
이제 프로메테우스에서 메트릭 수집을 위한 서비스를 다음과 같이 만든다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ 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로 정의 되어 있다. 이 포트를 이용하면 모든 메트릭의 엔드포이트를 가지고 올 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
$ 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 라고 한다면 이를 제어하는 것이 컨트롤러이다. 이를 위한 서비스를 다음과 같이 생성해 준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ 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 는 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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 는 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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 |
위와같이 한 후에 프로메테우스를 살펴보면 다음과 같이 나온다.