[cilium] flannel 설치하기

 

먼저 flannel 배포를 위한 네임스페이스를 생성합니다. 

kubectl create ns kube-flannel

 

helm차트로 배포하는 가이드에는 다음과 같은 라벨을 추가하게 되어있습니다.

네임스페이스에 라벨을 붙여 파드 시큐리티 스텐다드를 강제할 수 있습니다. 3가지 권한이 있는데 cni이기 때문에 privileged을 부여합니다. 

kubectl label --overwrite ns kube-flannel pod-security.kubernetes.io/enforce=privileged

 

https://kubernetes.io/ko/docs/concepts/security/pod-security-standards/

 

파드 시큐리티 스탠다드

파드 시큐리티 스탠다드에 정의된 여러 가지 정책 레벨에 대한 세부사항

kubernetes.io

 

 

이제 flannel 배포를 위한 helm 차트 추가 합니다. 

helm repo add flannel https://flannel-io.github.io/flannel/
helm repo update

 

 

flannel에 pod 대역을 10.244.0.0/16으로 설정하고 인터페이스가 여러개 있을 경우 아래처럼 특정 인터페이스를 사용하여 통신하도록 지정할 수 있습니다. 

cat << EOF > flannel-values.yaml
podCidr: "10.244.0.0/16"

flannel:
  args:
  - "--ip-masq"
  - "--kube-subnet-mgr"
  - "--iface=eth1"  
EOF

 

이 설정을 이용해서 kube-flannel 넴스페이스에 배포합니다. 

helm install flannel --namespace kube-flannel flannel/flannel -f flannel-values.yaml

 

이제 확인해보면 새로운 설정 파일들과 바이너리들이 설치된 것을 확인할 수 있습니다. 

 

인터페이스 정보에도 lo와 eth0이외에도 flannel과 관련된 인터페이스가 구성되었습니다.  

 

마지막으로 샘플 애플리케이션을 설치해보겠습니다.

cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webpod
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webpod
  template:
    metadata:
      labels:
        app: webpod
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - sample-app
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: webpod
        image: traefik/whoami
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: webpod
  labels:
    app: webpod
spec:
  selector:
    app: webpod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP
EOF


# k8s-ctr 노드에 curl-pod 파드 배포
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: curl-pod
  labels:
    app: curl
spec:
  nodeName: flannel-worker
  containers:
    - name: curl
      image: alpine/curl
      command: ["sleep", "36000"]
EOF

 

잘 설치 되었는지 확인해보겠습니다. 

kubectl get deploy,svc,ep webpod -owide

kubectl get endpointslices -l app=webpod

 

파드 대역도 설정한대로 10.244.0.0/16으로 생성된것을 확인할 수 있습니다.