From d9b4dc25d4e56773f724b4e6d8f7109b70aaf3c9 Mon Sep 17 00:00:00 2001 From: kkumtree Date: Sat, 26 Oct 2024 20:29:28 +0900 Subject: [PATCH] draft: cilium --- content/post/kans-8w-cilium-trial/index.md | 192 +++++++++++++++++++++ content/post/kans-8w-why-ebpf/index.md | 2 + 2 files changed, 194 insertions(+) create mode 100644 content/post/kans-8w-cilium-trial/index.md diff --git a/content/post/kans-8w-cilium-trial/index.md b/content/post/kans-8w-cilium-trial/index.md new file mode 100644 index 0000000..75755d0 --- /dev/null +++ b/content/post/kans-8w-cilium-trial/index.md @@ -0,0 +1,192 @@ +--- +date: 2024-10-26T01:35:59+09:00 +title: "" +tags: + - kans + - ebpf + - cilium + - kubeadm + - kubernetes +authors: + - name: kkumtree + bio: plumber for infra + email: mscho7969@ubuntu.com + launchpad: mscho7969 + github: kkumtree + profile: https://avatars.githubusercontent.com/u/52643858?v=4 +image: cover.png # 커버 이미지 URL +draft: true # 글 초안 여부 +--- + +그럼 매번 실패만 했던 Cilium 배포를 한번 해볼까요? + +[CloudNet@](https://gasidaseo.notion.site/CloudNet-Blog-c9dfa44a27ff431dafdd2edacc8a1863)에서 진행하고 있는 **K**8s **A**dvanced **N**etwork **S**tudy(이하, KANS)를 통해 학습한 내용을 정리합니다. + +## 1. CSP VM 골라보기 + +이렇게 쓴 이유는 결국 네트워크를 `잘` 알아야하는데, +작년에 할 때는 그런거 생각도 안하고 그냥 올려보려 했으니 당연히 안 돌아가겠죠? + +- [trying2adult/What Is XDP And How Do You Use It In Linux](https://trying2adult.com/what-is-xdp-and-how-do-you-use-it-in-linux-amazon-ec2-example/) + +그냥 곰곰히 오리~~duckduckgo~~랑 투닥거리다보니, 비록 연식이 되긴 했지만 +클릭을 안하고는 못배길 위의 블로그 제목이 눈에 띄였습니다. + +### a. 사전 조사 + +1. 커널: + - 현재 리눅스 커널 버전이 마이너 버전은 못 외우겠지만, 대충 메이저가 6버전이니 PASS +2. NIC: + - ENA(Elastic Network Adapter) 드라이버 언급이 나온 것으로 봐선, + 지원 인스턴스를 올리면 덜 헤멜 것 같은 느낌이 듭니다. +3. MTU 상한: + - cilium 최신 버전도 상한값이 3818인지 확인하면 좋을 듯합니다. +4. NIC channels for RX/TX Queue: + - 절반 이상을 비워야한다는데, 채널 수 모르면 좀 많이 헤맬 것 같습니다. + +### b. AWS CLI로 확인 + +- Docs: + - [Test whether enhanced networking is enabled](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/enhanced-networking-ena.html#test-enhanced-networking-ena) + - [Query for the latest Amazon Linux AMI IDs using AWS Systems Manager Parameter Store](https://aws.amazon.com/blogs/compute/query-for-the-latest-amazon-linux-ami-ids-using-aws-systems-manager-parameter-store/) + +스터디에서 제공된 CloudFormation파일 중 AMI은 +Canonical에서 관리하는 SSM 파라미터를 통해 최신화를 할 수 있었습니다. +그래서 그냥 이 SSM 파라미터를 통해 AMI ID를 얻어와 보죠. + +```bash +aws ssm get-parameters --names /aws/service/canonical/ubuntu/server/22.04/stable/current/amd64/hvm/ebs-gp2/ami-id --region ap-northeast-2 +``` + +```json +{ + "Parameters": [ + { + "Name": "/aws/service/canonical/ubuntu/server/22.04/stable/current/amd64/hvm/ebs-gp2/ami-id", + "Type": "String", + "Value": "ami-042e76978adeb8c48", + "Version": 30, + "LastModifiedDate": "2024-09-27T13:11:50.127000+09:00", + "ARN": "arn:aws:ssm:ap-northeast-2::parameter/aws/service/canonical/ubuntu/server/22.04/stable/current/amd64/hvm/ebs-gp2/ami-id", + "DataType": "aws:ec2:image" + } + ], + "InvalidParameters": [] +} +``` + +당연히 `enaSupport`가 `true`로 나오네요. + +```bash +aws ec2 describe-images --image-id ami-042e76978adeb8c48 --query "Images[].EnaSupport" +# [ +# true +# ] +``` + +눈감고 `c5.16xlarge` 를 띄워볼까 싶긴한데, 아래 문서에서 Nitro v2 버전 탭에 T3도 있는 것을 확인했네요. +Cloudformation YAML에 기본 정의된 `t3.xlarge`를 써보겠습니다. +- [Virtualized instances +/AWS](https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html#nitro-instance-types) + +### c. 배포 후 기본 체크 + +- 스터디에서 제공된 대로, `kube-proxy` 없이 운용 테스트를 할 것이기에 확인을 해보겠습니다. +- 이미 `kubeadm` 배포 시, `--skip-phases=addon/kube-proxy` param이 적용되어 있습니다. + +- No `kube-proxy` + +```bash +# Access to Control Plane Node +ssh -i $Keypair ubuntu@$ControlPlaneIP + +# Not ready because of no kube-proxy +kubectl get nodes +# NAME STATUS ROLES AGE VERSION +# k8s-s NotReady control-plane 14m v1.30.6 +# k8s-w1 NotReady 13m v1.30.6 +# k8s-w2 NotReady 13m v1.30.6 + +# No kube-proxy +kubectl cluster-info +# Kubernetes control plane is running at https://192.168.10.10:6443 +# CoreDNS is running at https://192.168.10.10:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy + +# No kube-proxy +kubectl get pod -A +# NAMESPACE NAME READY STATUS RESTARTS AGE +# kube-system coredns-55cb58b774-h9dnm 0/1 Pending 0 14m +# kube-system coredns-55cb58b774-vjzrk 0/1 Pending 0 14m +# kube-system etcd-k8s-s 1/1 Running 0 14m +# kube-system kube-apiserver-k8s-s 1/1 Running 0 14m +# kube-system kube-controller-manager-k8s-s 1/1 Running 0 14m +# kube-system kube-scheduler-k8s-s 1/1 Running 0 14m +``` + +- 커널 확인: 안해도 되지만, 한번 보겠습니다. + +```bash +# Kernel Version +uname -a +# Linux k8s-s 6.8.0-1015-aws #16~22.04.1-Ubuntu SMP Mon Aug 19 19:38:17 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux +hostnamectl | grep Kernel + # Kernel: Linux 6.8.0-1015-aws + +# XDP Support +grep -i CONFIG_XDP_SOCKETS /boot/config-$(uname -r) +# CONFIG_XDP_SOCKETS=y +# CONFIG_XDP_SOCKETS_DIAG=m +``` + +- NIC 확인 + +```bash +netplan status | grep ethernet +# ● 1: lo ethernet UNKNOWN/UP (unmanaged) +# ● 2: ens5 ethernet UP (networkd: ens5) + +# MTU +ip link show ens5 | grep mtu +# 2: ens5: mtu 9001 qdisc mq state UP mode DEFAULT group default qlen 1000 + + +# RX/TX Queue +ethtool -l ens5 +# Channel parameters for ens5: +# Pre-set maximums: +# RX: n/a +# TX: n/a +# Other: n/a +# Combined: 4 +# Current hardware settings: +# RX: n/a +# TX: n/a +# Other: n/a +# Combined: 4 + +# Driver +ethtool -i ens5 | grep ena +# driver: ena +``` + +Cilium에서 요구사항을 따로 살펴봐야겠지만, +MTU 및 RX/TX Queue 관련 채널 값을 바꿔야할 것으로 보입니다. + +## 2. Cilium 설치 + +```bash +helm repo add cilium https://helm.cilium.io/ +helm repo update + +elm install cilium cilium/cilium --version 1.16.3 --namespace kube-system \ +--set k8sServiceHost=192.168.10.10 --set k8sServicePort=6443 --set debug.enabled=true \ +--set rollOutCiliumPods=true --set routingMode=native --set autoDirectNodeRoutes=true \ +--set bpf.masquerade=true --set bpf.hostRouting=true --set endpointRoutes.enabled=true \ +--set ipam.mode=kubernetes --set k8s.requireIPv4PodCIDR=true --set kubeProxyReplacement=true \ +--set ipv4NativeRoutingCIDR=192.168.0.0/16 --set installNoConntrackIptablesRules=true \ +--set hubble.ui.enabled=true --set hubble.relay.enabled=true --set prometheus.enabled=true --set operator.prometheus.enabled=true --set hubble.metrics.enableOpenMetrics=true \ +--set hubble.metrics.enabled="{dns:query;ignoreAAAA,drop,tcp,flow,port-distribution,icmp,httpV2:exemplars=true;labelsContext=source_ip\,source_namespace\,source_workload\,destination_ip\,destination_namespace\,destination_workload\,traffic_direction}" \ +--set operator.replicas=1 +``` + +이후 파라미터 설명 \ No newline at end of file diff --git a/content/post/kans-8w-why-ebpf/index.md b/content/post/kans-8w-why-ebpf/index.md index 167b664..bd8aa79 100644 --- a/content/post/kans-8w-why-ebpf/index.md +++ b/content/post/kans-8w-why-ebpf/index.md @@ -17,6 +17,8 @@ image: cover.png draft: false # 글 초안 여부 --- +> 고쳐야할 부분이 `너무` 많아서 나중에 해당 부분만 글을 작성할 예정입니다. + 어느덧 이번 스터디도 대망의 Cilium을 다루기 시작합니다. Cilium에 이렇게도 (저를 포함한) 모?두가 열광하는지 알아보기 전에 근간이 되는 eBPF를 먼저 가볍게 알아보고 가려합니다.