Kubernetes 이야기

kind + cilium + hubble 구성하기 ( without kube-proxy ) 본문

Kubernetes/모니터링

kind + cilium + hubble 구성하기 ( without kube-proxy )

kmaster 2022. 5. 16. 19:31
반응형

 

 

 

cilium

Cilium은 컨테이너 워크로드 간의 네트워크 연결을 제공, 보호 및 관찰하기 위한 오픈 소스 소프트웨어(클라우드 네이티브이며 혁신적인 커널 기술 eBPF로 구동됨)이다.

 

Cilium에는 강력한 보안, 가시성 및 네트워킹 제어 로직을 Linux 커널에 동적으로 삽입할 수 있는 eBPF라는 새로운 Linux 커널 기술이 있다. eBPF는 고성능 네트워킹, 다중 클러스터 및 다중 클라우드 기능, 고급 로드 밸런싱, 투명한 암호화, 광범위한 네트워크 보안 기능, 투명한 관찰 가능성 등을 제공하는 데 사용된다.

 

또한, cilium 의 또 다른 기능은 kube-proxy를 완전히 대체 할 수 있다는 것이다. 올바른 구성으로 Kind 클러스터를 설정하여 Cilium CNI를 사용하고 kube-proxy 비활성화된 상태로 실행할 수 있다.

 

Architecture

 

Cilium은 사용자 환경의 모든 클러스터 노드와 서버에서 실행되는 에이전트로 구성된다. 해당 노드에서 실행되는 워크로드에 네트워킹, 보안 및 관찰 가능성을 제공한다. 워크로드는 컨테이너화되거나 시스템에서 기본적으로 실행될 수 있다.

 

출처 : https://cilium.io/get-started

 

특히 cilium에는 Hubble이라는 Kubernetes용 네트워크, 서비스 및 보안 관찰을 하는 프로젝트가 있다. Hubble UI를 통해 이러한 시각화를 도와준다.

 

출처 : https://github.com/cilium/hubble

 

설치

 

이 글에서는 kind와 cilium CNI를 구성하여 Kubernetes Cluster를 만들어보겠다.

 

기본적인 Kind 소개는 아래의 글을 참고한다.

https://kmaster.tistory.com/26

 

로컬 Kubernetes 클러스터 - kind 설치

Kind Kind 는 Docker Container를 노드로 사용하여 로컬 Kubernetes 클러스터를 실행하기 위한 도구이다. 주로 Kubernetes 자체를 테스트하기 위해 설계되었지만 로컬 개발 또는 CI에 사용될 수 있다. kind의 기.

kmaster.tistory.com

 

우선 설치환경은 아래와 같다.

  • OS : CentOS 7.9
  • Kernel : 5.17.8

Kind 클러스터 생성 구성은 YAML 구성 파일을 사용하여 수행된다. 이 단계는 기본 CNI를 비활성화하고 이를 Cilium으로 교체하는 데 필요하다. 이 글에서는 싱글노드로 구성해 본다.

 

# cat <<EOF | kind create cluster --name=kind-cilium --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
networking:
  disableDefaultCNI: true
  kubeProxyMode: none
EOF

 

Kind를 배포했으면 이제 Cilium을 설치해 보자.

# helm repo add cilium https://helm.cilium.io/
# helm upgrade --install --namespace kube-system --repo https://helm.cilium.io cilium cilium --values - <<EOF
kubeProxyReplacement: strict
k8sServiceHost: kind-cilium-control-plane
k8sServicePort: 6443
hostServices:
  enabled: true
  protocols: TCP
externalIPs:
  enabled: true
nodePort:
  enabled: true
hostPort:
  enabled: true
image:
  pullPolicy: IfNotPresent
ipam:
  mode: kubernetes
hubble:
  enabled: true
  relay:
    enabled: true
  ui:
    enabled: true
EOF

 

cilium pod가 계속 재기동 되면 로그를 확인해 보고, selinux를 off시킨 후 다시 확인해 보자.
그래도, 계속 오류가 발생하면 kubeProxyReplacement=probe로 변경 후 로그을 조회한다.

 

이제 설치된 내역들을 확인해보자.

 

# kubectl get svc,po --all-namespaces
NAMESPACE       NAME                                         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
default         service/kubernetes                           ClusterIP   10.96.0.1      <none>        443/TCP                      10m
ingress-nginx   service/ingress-nginx-controller             NodePort    10.96.84.179   <none>        80:32560/TCP,443:30840/TCP   105s
ingress-nginx   service/ingress-nginx-controller-admission   ClusterIP   10.96.33.6     <none>        443/TCP                      105s
kube-system     service/hubble-relay                         ClusterIP   10.96.98.64    <none>        80/TCP                       9m9s
kube-system     service/hubble-ui                            ClusterIP   10.96.89.188   <none>        80/TCP                       9m9s
kube-system     service/kube-dns                             ClusterIP   10.96.0.10     <none>        53/UDP,53/TCP,9153/TCP       10m

NAMESPACE            NAME                                                    READY   STATUS      RESTARTS   AGE
ingress-nginx        pod/ingress-nginx-admission-create-82h4x                0/1     Completed   0          105s
ingress-nginx        pod/ingress-nginx-admission-patch-j5fkl                 0/1     Completed   0          105s
ingress-nginx        pod/ingress-nginx-controller-5977cb6769-6jznf           1/1     Running     0          105s
kube-system          pod/cilium-ghftx                                        1/1     Running     0          3m17s
kube-system          pod/cilium-operator-596dcd987c-8bj27                    1/1     Running     0          3m17s
kube-system          pod/coredns-6d4b75cb6d-2j95j                            1/1     Running     0          10m
kube-system          pod/coredns-6d4b75cb6d-vq9h7                            1/1     Running     0          10m
kube-system          pod/etcd-kind-cilium-control-plane                      1/1     Running     0          10m
kube-system          pod/hubble-relay-cdf4c8cdd-69bpx                        1/1     Running     0          9m9s
kube-system          pod/hubble-ui-86856f9f6c-l9t7n                          3/3     Running     0          9m9s
kube-system          pod/kube-apiserver-kind-cilium-control-plane            1/1     Running     0          10m
kube-system          pod/kube-controller-manager-kind-cilium-control-plane   1/1     Running     0          10m
kube-system          pod/kube-scheduler-kind-cilium-control-plane            1/1     Running     0          10m
local-path-storage   pod/local-path-provisioner-8687fd6488-p4tqr             1/1     Running     0          10m

 

이제, 마지막으로 ingress controller를 설치하자.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml

 

cilium CLI 다운로드

 

# curl -L --remote-name-all https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz{,.sha256sum}
# sha256sum --check cilium-linux-amd64.tar.gz.sha256sum
# sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
# rm cilium-linux-amd64.tar.gz{,.sha256sum}

 

다운로드 받은 후 상태를 체크해 보자.

# cilium status --wait
    /¯¯\
 /¯¯\__/¯¯\    Cilium:         OK
 \__/¯¯\__/    Operator:       OK
 /¯¯\__/¯¯\    Hubble:         OK
 \__/¯¯\__/    ClusterMesh:    disabled
    \__/

Deployment        hubble-ui          Desired: 1, Ready: 1/1, Available: 1/1
Deployment        hubble-relay       Desired: 1, Ready: 1/1, Available: 1/1
Deployment        cilium-operator    Desired: 1, Ready: 1/1, Available: 1/1
DaemonSet         cilium             Desired: 1, Ready: 1/1, Available: 1/1
Containers:       cilium             Running: 1
                  hubble-ui          Running: 1
                  hubble-relay       Running: 1
                  cilium-operator    Running: 1
Cluster Pods:     6/8 managed by Cilium
Image versions    cilium             quay.io/cilium/cilium:v1.11.4@sha256:d9d4c7759175db31aa32eaa68274bb9355d468fbc87e23123c80052e3ed63116: 1
                  hubble-ui          quay.io/cilium/hubble-ui:v0.8.5@sha256:4eaca1ec1741043cfba6066a165b3bf251590cf4ac66371c4f63fbed2224ebb4: 1
                  hubble-ui          quay.io/cilium/hubble-ui-backend:v0.8.5@sha256:2bce50cf6c32719d072706f7ceccad654bfa907b2745a496da99610776fe31ed: 1
                  hubble-ui          docker.io/envoyproxy/envoy:v1.18.4@sha256:e5c2bb2870d0e59ce917a5100311813b4ede96ce4eb0c6bfa879e3fbe3e83935: 1
                  hubble-relay       quay.io/cilium/hubble-relay:v1.11.4@sha256:460d50bd0c6bcdfa3c62b0488541c102a4079f5def07d2649ff67bc24fd0dd3f: 1
                  cilium-operator    quay.io/cilium/operator-generic:v1.11.4@sha256:bf75ad0dc47691a3a519b8ab148ed3a792ffa2f1e309e6efa955f30a40e95adc: 1

 

Hubble ingress를 생성해보자.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hubble-ingress
  namespace: kube-system
spec:
  rules:
  - host: "hubble.10.10.100.10.nip.io"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: hubble-ui
            port:
              number: 80

 

호출하면 아래와 같이 화면이 나타난다.

 

다음 시간에 간단한 msa application을 배포하여 hubble에서 어떻게 조회되는지 알아보자.

 

참고

https://docs.cilium.io/en/stable/gettingstarted/kind/

 

 

 

반응형
Comments