kubernetes의 Flannel 네트워크 플러그인 배치와 세 가지 작업 모드 설명

12742 단어 flannel
Kubernetes 시스템에서 Pod 네트워크의 실현은 제3자 플러그인에 의존한다. Flannel은 CoreOS가 주추하는 현재 비교적 주류적인 용기 네트워크 솔루션이다. CNI 플러그인은 두 가지 기능이 있는데 그것이 바로 네트워크 설정과 네트워크 전략이다. flannel은 비교적 간단하고 네트워크 전략을 지원하지 않기 때문에 flannel 프로젝트 자체는 하나의 구조일 뿐이다. 진정으로 네트워크 기능을 제공하는 것은 그의 백엔드 실현이다. 현재 Flannel은 세 가지 다른 백엔드 실현을 지원한다.각각: UDP VXLAN host-gw UDP는 Flannel 프로젝트가 최초로 지원한 방식이고 성능이 가장 나쁜 방식으로 현재 폐기되었다.VXLAN과 Host-gw 모드를 가장 많이 사용한 배포
Flannel VXLAN 모드 구성 Flannel은 k8s 클러스터가 설치된 즉시 Flannel을 배치합니다.
공식 yaml 파일을 직접 적용하려면:
root@k8s-master:~# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created

출력은 다음과 같이 정상적으로 작동합니다.
root@k8s-master:~# kubectl get ds -n kube-system
NAME                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                     AGE
kube-flannel-ds-amd64     2         2         2       2            2           beta.kubernetes.io/arch=amd64     98s
kube-flannel-ds-arm       0         0         0       0            0           beta.kubernetes.io/arch=arm       98s
kube-flannel-ds-arm64     0         0         0       0            0           beta.kubernetes.io/arch=arm64     98s
kube-flannel-ds-ppc64le   0         0         0       0            0           beta.kubernetes.io/arch=ppc64le   98s
kube-flannel-ds-s390x     0         0         0       0            0           beta.kubernetes.io/arch=s390x     98s

정상적으로 실행되면 flanneld는 호스트의/etc/cni/net에 있습니다.d 디렉터리에 자신의 프로필을 생성하면 kubelet에서 호출합니다.
Node 상태는 네트워크 플러그인이 성공적으로 실행된 후에만 Ready
root@k8s-master:~# kubectl get node
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   18m   v1.13.1
k8s-node01   Ready    <none>   16m   v1.13.1

flannel이 실행되면 Node 숙박 호스트에 네트워크 인터페이스가 하나 더 추가됩니다.
root@k8s-master:~# ifconfig 
flannel.1 Link encap:Ethernet  HWaddr 6a:43:8c:e4:2a:77  
          inet addr:10.244.0.0  Bcast:0.0.0.0  Mask:255.255.255.255
          inet6 addr: fe80::6843:8cff:fee4:2a77/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1

root@k8s-node01:~# ifconfig           
flannel.1 Link encap:Ethernet  HWaddr 7a:a1:2e:85:a9:1c  
          inet addr:10.244.1.0  Bcast:0.0.0.0  Mask:255.255.255.255
          inet6 addr: fe80::78a1:2eff:fe85:a91c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1

위의 결과에서 알 수 있듯이
flannel은 기본적으로 VXLAN 모드, 즉 Overlay Network입니다.flanneld에서 flannel을 만듭니다.1 인터페이스, 터널 프로토콜을 봉인하는 데 사용되는 것으로 집단에 나누어지는 Pod 세그먼트는 기본적으로 10.244.0.0/16이다.flannel이 k8s-master 노드에 설정한 Pod 네트워크는 10.244.0.0세그먼트이고 k8s-node01 노드에 설정한 Pod 네트워크는 10.244.1.0세그먼트입니다. 더 많은 노드가 있으면 이런 식으로 추정합니다.복사본이 3인 nginx 컨테이너를 시작합니다.
root@k8s-master:~# kubectl run nginx --image=nginx:1.10 --port=80 --replicas=3 

pod를 보려면:
root@k8s-master:~# kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE   READINESS GATES
nginx-6b647cb88-24j29   1/1     Running   0          23m   10.244.0.3   k8s-master   <none>           <none>
nginx-6b647cb88-ft8wc   1/1     Running   0          23m   10.244.0.2   k8s-master   <none>           <none>
nginx-6b647cb88-g4mqt   1/1     Running   0          33m   10.244.1.4   k8s-node01   <none>           <none>

그 중에서 두 개의 Pod는 노드 k8s-master에서 실행되고 그 중 한 개의 Pod가 설정한 IP는 10.244.0.2이다.
현재, 이 node에서 네트워크 인터페이스를 보십시오
root@k8s-master:~# ifconfig 
cni0      Link encap:Ethernet  HWaddr 0a:58:0a:f4:01:01  
          inet addr:10.244.0.1  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::c048:c9ff:fe09:f54e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:3316 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3387 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 

용기가 실행된 후 노드 위에 가상 인터페이스 cni0이 하나 더 생겼는데 그 IP는 10.244.0.1이다. 이것은 flanneld가 만든 가상 브리지인 cni0이고Pod 로컬 통신에서 사용된다.
flanneld는 모든 Pod에 한 쌍의veth 가상 장치를 만들고 한 쌍은 용기 인터페이스에 놓고 한 쌍은 cni0 다리에 놓는다.
브릿지를 보려면 brctl을 사용하십시오.
root@k8s-master:~# brctl show cni0
bridge name bridge id       STP enabled interfaces
cni0        8000.0a580af40001   no      veth0fda9673
                                         veth6388ea61
#               cni0    。

일반 액세스 테스트:
#       
root@k8s-master:~# ping 10.244.0.2
PING 10.244.1.4 (10.244.1.4) 56(84) bytes of data.
64 bytes from 10.244.1.4: icmp_seq=1 ttl=63 time=2.01 ms

기존의 flannel VXLAN 네트워크에서 두 호스트의pod 간 통신은 틀림없이 가능할 것이다. 아래와 같은pod:
#  Pod  
root@k8s-master:~# kubectl exec -it nginx-6b647cb88-ft8wc -- /bin/sh

# ping 10.244.1.4
PING 10.244.1.4 (10.244.1.4): 56 data bytes
64 bytes from 10.244.1.4: icmp_seq=0 ttl=62 time=2.587 ms
64 bytes from 10.244.1.4: icmp_seq=1 ttl=62 time=3.880 ms

컨테이너가 호스트 간에 어떻게 통신되는지 라우팅 정보를 확인합니다.
root@k8s-master:~# ip route 
10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink 

10.244.1.0/24 네트워크의 데이터 패키지로 본 컴퓨터의 플래너에게 보냅니다.1 인터페이스, 즉 2층 터널에 들어간 다음에 VXLAN 패키지를 봉하여 목표 Node에 도착한 후 목표 Node의 flannel.포장을 풀다.
Node가 시작하고 Flannel 네트워크에 가입하면 다른 Node의 flanneld에 이와 같은 루트 규칙이 추가됩니다. 이것이 기본 VXLAN 네트워크입니다.
k8s-master에서 다른 사람의 것을 핑하기 때문에 k8s-master는 VXLAN 패키지를 봉한 적이 있습니다. 클러치:
#k8s-master       

tcpdump -i ens33 -nn host 10.3.1.20 

16:46:09.302335 IP 10.3.1.20.53051 > 10.3.1.21.8472: OTV, flags [I] (0x08), overlay 0, instance 1
IP 10.244.0.2 > 10.244.1.4: ICMP echo request, id 20, seq 360, length 64
16:46:09.302395 IP 10.3.1.20.59519 > 10.3.1.21.8472: OTV, flags [I] (0x08), overlay 0, instance 1
IP 10.244.1.4 > 10.244.0.2: ICMP echo reply, id 20, seq 360, length 64

보시다시피 오버레이 안에는 위에 핑한 ICMP 가방이 있습니다.
VXLAN은 Linux 내부 핵 자체가 지원하는 네트워크 가상화 기술로 내부 핵의 한 모듈로 내부 핵 상태에서 봉인 해제와 봉인을 실현하고 커버 네트워크를 구축하는데 사실은 각 숙박 호스트의 Flannel이다.1 장치로 구성된 가상 2층 네트워크.
VXLAN은 추가적인 패키지 해제로 인해 성능이 떨어지기 때문에 Flannel에는host-gw 모드가 생겼다. 즉, 숙박 호스트를 스위치로 하고 로컬 루트를 제외하고는 추가 비용이 없고 성능과calico의 차이가 많지 않다. 중첩되어 메시지 전송을 실현하지 않았기 때문에 루트 테이블이 방대하게 될 수 있다.하나의 노드가 하나의 네트워크에 대응하고, 또한 하나의 루트 항목에 대응하기 때문이다.
host-gw는 VXLAN 네트워크의 성능이 훨씬 강하지만,그러나 한 가지 방식은 결함이 있다. 각 물리 노드가 반드시 같은 2층 네트워크에 있어야 한다는 것이다.물리적 노드는 동일한 세그먼트에 있어야 합니다.이렇게 하면 한 네트워크 구간의 호스트 양이 매우 많아서 만일 라디오 메시지를 보내면 방해가 생길 수 있다.개인 클라우드 장면에서 숙박 호스트가 같은 네트워크에 있지 않은 것은 매우 흔한 상태이기 때문에host-gw를 사용할 수 없다.
VXLAN은 또 다른 기능이 있다. VXLAN도 host-gw와 유사한 게임 방법을 지원한다. 만약에 두 노드가 같은 구역에 있을 때host-gw 통신을 사용하고 같은 구역에 있지 않으면 현재pod가 있는 노드와 목표pod가 있는 노드 사이에 공유기가 있으면 VXLAN과 같은 방식으로 중첩 네트워크를 사용한다.Host-gw와 VXLAN을 결합시켰는데 이것이 바로 VXLAN의 Directrouting 모델이다. 그래서 Flnnel의 VXLAN 모델은 두 가지가 있다.
VXLAN: 기본 VXLAN, 즉 확장된 가상 LAN Directrouting: 직접 라우팅
Flannel VXLAN의 Directrouting 모드 설정 수정 다운로드한kube-flannel.yml, flannel의 configmap 객체를 다음과 같이 변경합니다.
net-conf.json: |
    {
      "Network": "10.244.0.0/16",  #    
      "Backend": {
        "Type": "VXLAN",
        "Directrouting": true  #  
      }
    }

그리고 원래의 flannel을 삭제하고 다시 apply:
root@k8s-master:~# kubectl apply -f kube-flannel.yml 
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created

삭제 재배치는 원래의 Flannel을 삭제해야 하기 때문에 처음부터 Flannel을 계획해야 합니다.라우트를 다시 보려면 다음과 같이 하십시오.
root@k8s-master:~# ip route show
default via 10.3.1.1 dev ens33 onlink 
10.244.0.0/24 dev cni0  proto kernel  scope link  src 10.244.0.1 
10.244.1.0/24 via 10.3.1.21 dev ens33 

10.244.1.0/24 네트워크로 가는 다음 점프는 10.3.1.21로 본 컴퓨터의 물리적 인터페이스인ens33에서 나간다.이것이 Directrouting입니다.두 노드가 네트워크 세그먼트에 걸쳐 있는 경우 flannel은 자동으로 VXLAN 모드로 다운그레이드됩니다.Flannel host-gw 구성
net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "host-gw" #  
      }
    }

라우팅 정보는 Directrouting과 동일하게 표시됩니다.이것이 바로 flannel의 설정 방식입니다.

좋은 웹페이지 즐겨찾기