Setup Prometheus and Grafana to scrap Cilium metrics This will create a new namespace cilium-monitoring
kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/1.15.1/examples/kubernetes/addons/prometheus/monitoring-example.yaml Some warnings… namespace/cilium-monitoring created serviceaccount/prometheus-k8s created configmap/grafana-config created configmap/grafana-cilium-dashboard created configmap/grafana-cilium-operator-dashboard created configmap/grafana-hubble-dashboard created configmap/grafana-hubble-l7-http-metrics-by-workload created configmap/prometheus created clusterrole.rbac.authorization.k8s.io/prometheus created clusterrolebinding.rbac.authorization.k8s.io/prometheus created service/grafana created service/prometheus created Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "grafana-core" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "grafana-core" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "grafana-core" must set securityContext.
Why not Agollia algolla 는 site indexing 을 위해 Algollia 서버로 정보를 보내는 듯 함. 대신 hugo에 아주 seamless 하게 연동이 되는데. 좀 아쉽네. (Privacy 건은 좀 더 확인해 봐야겠다)
Algollia를 잘 결합해서 사용하는 사이트 하나 https://inchan.dev Search를 클릭하면 입력 창의 크기가 자동으로 커져서 결과가 보여지는 창도 적당해서 보기 좋다.
Install Pagefind 설치는 npx를 이용해서 설치하거나, cargo build하거나. 혹은 github에 올려져 있는 바이너리 다운받아 설치하거나. 이 중에 마지막 방법 선택
homelab 서버로 사용할 PC를 당근마켓을 통해 구입. 제품 사양에 비해 저렴하고,, 구입 과정도 매끄러워서 기분좋게 구입한 제품이다.
오랜만에 AMD CPU를 사용하는 PC를 사용하게 되었네. 조립 PC를 사본 지가 언제인지. 최근 10년 넘게는 맥만 구입해서 궁금하다. 완성품(특히 애플 노트북)에 비해 좋은 점은 원하는 사양으로 변경할 수 있다는 거 일텐데, 그래서 그 장점을 십분 활용하고자, 중고로 얻어온 제품이 이미 16 GiB 메모리가 실장되어 있지만, 32 GiB를 하나 추가로 구입했다. 다른 건 못해도 RAM Flex라도 해 보자.
문제점 Traefik 로그에 time 정보가 제대로 나오게 하려면
helm chart에 환경 변수에 TZ를 설정해도 로그 시간이 제대로 나오지 않음.
192.168.0.101 - - [06/Jan/2022:1:18:17 +0000] "GET /ping HTTP/1.1" 200 2 "-" "-" 100 "ping@internal" "-" 0ms env: - name: TZ value: Asia/Seoul kubectl describe 명령으로 확인하면 환경변수가 제대로 설정된 것으로 나옴
Environment: TZ: Asia/Seoul 해결책 https://doc.traefik.io/traefik/observability/access-logs/#time-zones 위 페이지를 보니 다음과 같이 몇 가지 설정을 해야 한다고.
Traefik will timestamp each log line in UTC time by default.
홈 블로그에 사용하는 텍스트로 된 포스트와 포스트에서 사용하는 이미지 파일을 각자 다른 github repo에서 관리해 오고 있었다. 혻시나 포스트만 클론해서 글을 수정하고 싶을 때 수 GB에 달하는 이미지를 다운받아야 하는 건 아닌 것 같아서.
특정 서비스를 외부에 공개하고 싶지 않고, 내부 망에서만 접근하게 하려면 Traefik의 middleware가 제공하는 ipWhilteList 기능을 활용할 수 있다.
(이름은 요즘 추세에 맞게 ipAllowList 정도로 변경되어야 할 것 같은데..)
전체적인 동작은 IpWhitelist - Traefik 페이지에 있는 그림으로 간단하게 요약이 가능할 듯. 사이트에 접근하려는 client가 미리 정의된 list에 있는 경우에만 접근을 허용한다는.
middleware 정의 접근을 허용할 client들의 CIDR을 정의한다. 특정 subnet을 정의하거나, 특정 host를 정의할 수 있다. 당연히 복수 정의도 가능하고.
아래 예는 192.
mini1에서 mini3로의 이전을 준비 중. 기존에 mini3에는 재미삼아 k3s를 설치해 놓았는데 왠지 새로운 설정 방식을 알아야 할 필요가 있나 하는 생각이 들어 이전처럼 다시 vanilla kubernetes 를 설치하기로 했다. minkkube처럼 VM을 만들어야 설치가 되는 것도 아니고 그냥 host OS에 설치하면 되니까 설치도 간단하고(물론 바이너리 하나 설치하면 되는 k3s와는 비교하기 어렵지만) 부하를 감당하기 어려운 정도의 CPU도 아니라서.
Installing kubeadm | Kubernetes
# /etc/modules-load.d/k8s.conf br_netfilter # /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 $ sudo sysctl --system Install Containerd as a Container Runtime docker를 CRI로 사용하는 것은 곧 deprecated예정이니까 containerd를 사용해 보자.
Traefik을 이용한 Ingress/Ingress Controller를 이용해서 nginx 기반 Pod를 cluster 외부에서 접속할 수 있도록 설정했는데 곰곰히 생각해 보니 그렇다면 nginx service에 굳이 NodePort를 사용해야 하나 라는 생각이 들었다. 이제 외부로부터의 요청은 든든한 Traefik이 처리해 줄 테니 직접 각 pod가 서비스를 NodePort를 이용해서 외부에 오픈할 필요가 없어 보였다.
이를 위해 기존에 사용하던 nginx의 value 파일을 다음과 같이 수정했다. NodePort를 위해 필요했던 정보들이 사라지고, 수신하고 싶은 Port만 지정하면 되니설정 파일이 무척 깔끔해졌다.
service: # type: NodePort # targetPort: 80 # container app.
Ingress Controller 를 설치(Helm으로 Traefik 설치하기)했으니 이제 Ingress를 설정해서 실제 cluster 외부로부터의 http/https 메시지를 nginx pod에 전달되게 해 본다.
Ingress Ingress는 Cluster 외부에서 접근하는 http/https request에 대한 라우팅을 제어하는 기능을 제공한다. Ingress | Kubernetes
ingress.yaml 파일을 다음과 같이 작성한다. . 아래는 두 가지 rule을 설정하고 있는데 host가 ‘mini1’이고, URL path가 /ost면 podcast-nginx라는 서비스로 전달하게 하는 것과 host는 상관없이 path가 /ost면 역시 같은 podcast-nginx로 보내는 것이다.
kind: Ingress apiVersion: extensions/v1beta1 metadata: name: "test" namespace: default spec: rules: - host: mini1 http: paths: - path: /ost backend: serviceName: podcast-nginx servicePort: 8099 - http: paths: - path: /ost backend: serviceName: podcast-nginx servicePort: 8099 Kubectl 명령을 이용해 적용해 본다.