Table of Contents
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
위와같이 한 후에 프로메테우스를 살펴보면 다음과 같이 나온다.
