Skip to content

Commit

Permalink
draft: basic calico endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
kkumtree committed Sep 18, 2024
1 parent 42b50f7 commit 6c243c6
Showing 1 changed file with 220 additions and 16 deletions.
236 changes: 220 additions & 16 deletions content/post/kans-3w-calico-overview/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ draft: true

## 1. Calico 설치

> 스터디에서 AWS CF 및 Calico 설치 스크립트를 제공하였기에, 이 부분은 참고만 하시기 바랍니다.
> 스터디에서 AWS CF 및 Calico 설치 스크립트(Manifest)를 제공하였기에, 이 부분은 참고만 하시기 바랍니다.
CNI가 설치되지 않았기에 NotReady 상태에 있다가, Calico 설치하면 CoreDNS가 설정되며, Ready 상태로 변경된다.

Expand Down Expand Up @@ -91,8 +91,8 @@ CNI가 설치되지 않았기에 NotReady 상태에 있다가, Calico 설치하
kube-system calico-node-cqjxm 1/1 Running 0 56s
```

- Calico 설치 스크립트를 통해 아래와 같은 변화가 주어집니다. 이외에도 Calico 사용을 위해 [calicoctl](https://docs.tigera.io/calico/latest/operations/calicoctl/install#install-calicoctl-as-a-binary-on-a-single-host) 을 설치했습니다.

- Calico 설치 스크립트를 통해 아래와 같은 변화가 주어집니다.
```bash
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
Expand Down Expand Up @@ -127,20 +127,224 @@ CNI가 설치되지 않았기에 NotReady 상태에 있다가, Calico 설치하
deployment.apps/calico-kube-controllers created
```

```bash
chmod +x calicoctl && mv calicoctl /usr/bin
calicoctl version
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 64.4M 100 64.4M 0 0 21.2M 0 0:00:03 0:00:03 --:--:-- 40.4M
Client Version: v3.28.1
Git commit: 601856343
Cluster Version: v3.28.1
Cluster Type: k8s,bgp,kubeadm,kdd
```
### (Optional) calicoctl 설치

이외에도 Calico 사용을 위해 [calicoctl](https://docs.tigera.io/calico/latest/operations/calicoctl/install#install-calicoctl-as-a-binary-on-a-single-host) 을 설치했습니다.

이후에 Calico 메트릭을 p8s로 전송하기 위해 Calico에서 설정을 해야하는데, kubectl 대신 calicoctl을 사용해보기로 했습니다.

```bash
chmod +x calicoctl && mv calicoctl /usr/bin
calicoctl version
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 64.4M 100 64.4M 0 0 21.2M 0 0:00:03 0:00:03 --:--:-- 40.4M
Client Version: v3.28.1
Git commit: 601856343
Cluster Version: v3.28.1
Cluster Type: k8s,bgp,kubeadm,kdd
```

## 2. Calico to Prometheus 연동

Docs: [Tigera/Calico](https://docs.tigera.io/calico/latest/operations/monitor/monitor-component-metrics#about-calico-felix-typha-and-kube-controllers-components)

Prometheus(이하, p8s)에 Calico 메트릭을 전송하기 위해 설정을 해야합니다.

Calico 문서에는 전송할 수 있는 3가지 요소에 대해서 설명하고 있습니다.
문서를 기반으로 의역해보면

1. Felix: Calico의 두뇌라고 하는걸로 봐서는 핵심요소로 보입니다. Network Policy를 적용할 모든 머신에서 각각 구동되는 데몬이라고 합니다.
2. Typha: Calico 노드와 Datastore 사이의 통신을 Felix에게 전달하도록 하는 Pods의 옵션 세트라고 합니다.
3. kube-controllers: k8s API 돝기화를 비롯하여 가비지 리소스 수집 등 다양한 control-plane 기능을 담당하는 컨트롤러 세트를 실행하는 파드라고 합니다.

Felix 하나만 연결하면 그만일 줄 알았더니 그건 아닌 것 같습니다.

아래와 같이, 문서와 동일하게 진행해보겠습니다.

1. (Calico) Metric Reporting 활성화
2. (p8s) NS 및 SA 생성
3. (p8s) 배포 및 구성
4. (p8s) 대시보드에서 메트릭 확인 및 간단한 그래프 생성

> calicoctl 및 Manifest 기준으로 기술합니다.

- 이후에는, 앞서 언급한 3가지의 요소의 설정을 수정하여, Felix의 메트릭을 exposed(노출되도록) 설정합니다.
다만 작업시, 유의해야할 것이 각자 사용 중인 기본 포트가 정해져 있다는 점입니다.

| Component | Default Port | Protocol | Prerequisites | Memo |
| --- | --- | --- | --- |
| Felix | 9091 | TCP | Y | - |
| Typha | 9091 | TCP | N | Default Setting |
| Typha(Amazon) | 9093 | TCP | N | TYPHA_PROMETHEUS_METRICS_PORT |
| kube-controllers | 9094 | TCP | `calico-kube-controllers` |

- 특히, Typha의 경우, 위에 기술한 것과 같이 Amazon vpc-cni 설정에서 custom 포트가 별도 지정된다고 합니다. 다음 링크를 참조하시기 바랍니다. ([Github/amazon-vpc-cni-k8s](https://github.com/aws/amazon-vpc-cni-k8s/blob/b001dc6a8fff52926ed9a93ee6c4104f02d365ab/config/v1.6/calico.yaml#L569): v1.6-b001dc6)
Typha 도 활성하여 했으나, 선택사항이거니와 설치가 되어있지 않아 다루지 않습니다.

### (1) Metric Reporting 활성화

기존 Felix 설정을 확인합니다. 기본값은 비활성화되어 있습니다. (아예 명시되어 있지 않습니다)

```bash
calicoctl get felixconfiguration -o yaml
```

#### a. Felix 메트릭 노출을 위한 활성화 및 svc 생성

```bash
calicoctl patch felixconfiguration default --patch '{"spec":{"prometheusMetricsEnabled": true}}'
# Successfully patched 1 'FelixConfiguration' resource
```

다시 확인합니다. (items.spec.prometheusMetricsEnabled: true)

```bash
calicoctl get felixconfiguration -o yaml | grep prom
# prometheusMetricsEnabled: true
```

Manifest로 Calico를 설칠했기 때문에, `kube-system` ns에 생성합니다.

```bash
cat <<EOF>felix.yaml
apiVersion: v1
kind: Service
metadata:
name: felix-metrics-svc
namespace: kube-system
spec:
clusterIP: None
selector:
k8s-app: calico-node
ports:
- port: 9091
targetPort: 9091
EOF
kubectl apply -f felix.yaml
# service/felix-metrics-svc created
```
```bash
kubectl get svc,ep -n kube-system felix-metrics-svc
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# service/felix-metrics-svc ClusterIP None <none> 9091/TCP 101s
# NAME ENDPOINTS AGE
# endpoints/felix-metrics-svc 192.168.10.10:9091,192.168.10.101:9091,192.168.10.102:9091 + 1 more... 101s
```
#### b. Typha 메트릭 노출을 위한 활성화 및 svc 생성
- Typha는 배포되지 않은 것으로 파악되어 생략합니다.
#### c. kube-controllers 메트릭 노출을 위한 svc 생성
현재 사용 중인 포트를 확인합니다. ([tigera/calico](https://docs.tigera.io/calico/latest/reference/resources/kubecontrollersconfig#sample-yaml): Kubernetes controllers configuration )
```bash
calicoctl get KubeControllersConfiguration -o yaml | grep prom
# prometheusMetricsPort: 9094
#
# calicoctl get kubecontollersconfiguration -o yaml
# Failed to get resources: resource type 'kubecontollersconfiguration' is not supported
```
> (Opt.) calicoctl을 통해 해당 포트를 패치할 수 있습니다.
```bash
# custom port: 9095
calicoctl patch kubecontrollersconfiguration default --patch '{"spec":{"prometheusMetricsPort": 9095}}'
```
아래와 같이 서비스를 배포합니다.
해보니, 이미 있었고 기본값이라 바뀌지 않았다고 확인됩니다.
```bash
cat <<EOF>kube-controller.yaml
apiVersion: v1
kind: Service
metadata:
name: kube-controllers-metrics-svc
namespace: kube-system
spec:
clusterIP: None
selector:
k8s-app: calico-kube-controllers
ports:
- port: 9094
targetPort: 9094
EOF
kubectl apply -f kube-controller.yaml
```
### (2) NS 및 SA 생성
- NS: `calico-monitoring`
- CR/SA/CRB: `calico-prometheus-user`
```bash
cat <<EOF>calico-monitoring.yaml
apiVersion: v1
kind: Namespace
metadata:
name: calico-monitoring
labels:
app: ns-calico-monitoring
role: monitoring
EOF
kubectl apply -f calico-monitoring.yaml
```
```bash
cat <<EOF>calico-prometheus-user.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: calico-prometheus-user
rules:
- apiGroups: [""]
resources:
- endpoints
- services
- pods
verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]
verbs: ["get"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: calico-prometheus-user
namespace: calico-monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: calico-prometheus-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: calico-prometheus-user
subjects:
- kind: ServiceAccount
name: calico-prometheus-user
namespace: calico-monitoring
EOF
kubectl apply -f calico-prometheus-user.yaml
# clusterrole.rbac.authorization.k8s.io/calico-prometheus-user created
# serviceaccount/calico-prometheus-user created
# clusterrolebinding.rbac.authorization.k8s.io/calico-prometheus-user created
```
## 2. Retina 설치
## 3. Retina 설치 <재구성 필요>
> Network Monitoring Tool인 [Retina](https://github.com/microsoft/retina)를 설치해봅니다.
Expand Down

0 comments on commit 6c243c6

Please sign in to comment.