Kubernetes Multus-CNI

10931 단어 kubernets

소개


Multus CNI는 K8S의 CNI 플러그인으로 K8S 환경에 여러 개의 네트워크 인터페이스를 동시에 추가하는 POD를 지원합니다.이러한 배치 방식은 사용자가 관리 네트워크와 업무 네트워크를 서로 격리하고 용기 집단 네트워크 구조를 효과적으로 제어하는 데 유리하다
다음 그림은 Multus CNI가 pod 네트워크 인터페이스를 구성하는 예입니다.그림에서 POD는 eth0, net0, net1 세 개의 인터페이스를 가지고 있음을 보여 준다.eth0은kubernetes 집단 네트워크를kubernetes 서버/서비스에 연결합니다 (예:kubernetesapi 서버,kubelet 등).net0과 net1은 추가 네트워크 첨부 파일로 다른 CNI 플러그인(예를 들어 vlan/vxlan/ptp)을 사용하여 다른 네트워크에 연결됩니다.

Multus CNI 배포


K8S 환경 배포

kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.13.2 --pod-network-cidr=192.168.0.0/16 
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
kubectl taint nodes --all node-role.kubernetes.io/master-

K8S에 Multus CNI 배포


multus 코드 다운로드
[root@develop k8s]# git clone https://github.com/intel/multus-cni.git
Cloning into 'multus-cni'...
remote: Enumerating objects: 26, done.
remote: Counting objects: 100% (26/26), done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 13356 (delta 8), reused 16 (delta 5), pack-reused 13330
Receiving objects: 100% (13356/13356), 22.65 MiB | 238.00 KiB/s, done.
Resolving deltas: 100% (4584/4584), done.
[root@develop k8s]# cd multus-cni/
[root@develop multus-cni]# ls
build  checkpoint  CONTRIBUTING.md  doc  Dockerfile  Dockerfile.openshift  examples  glide.lock  glide.yaml  images  k8sclient  LICENSE  logging  multus  README.md  testing  test.sh  types  vendor
[root@develop multus-cni]# 

image 디렉터리에 들어가면 Multus 환경을 배치하는 것은 주로'flannel-daemonset.yml multus-daemonset.yml'라는 두 개의 배열 파일로 이루어집니다.flannel-daemonset.yaml 배치flannel 네트워크에 필요한 기본 구성 요소입니다.Multus는 K8S 환경에서 CNI 플러그인으로 사용되기 때문에 일반적인 네트워크 플러그인을 배치하는 방식과 유사하다.yml 파일 배열 완료, 주요 동작은 권한 설정, K8S에 쓰기 설정, CNI 기능을 제공하는 용기 실행
[root@develop images]# pwd
/data/k8s/multus-cni/images
[root@develop images]# ls
70-multus.conf  entrypoint.sh  flannel-daemonset.yml  multus-crio-daemonset.yml  multus-daemonset.yml  README.md
[root@develop images]# kubectl get pod --all-namespaces
NAMESPACE     NAME                              READY   STATUS    RESTARTS   AGE
kube-system   coredns-78d4cf999f-4dcjq          0/1     Pending   0          21m
kube-system   coredns-78d4cf999f-76p5l          0/1     Pending   0          21m
kube-system   etcd-develop                      1/1     Running   0          20m
kube-system   kube-apiserver-develop            1/1     Running   0          20m
kube-system   kube-controller-manager-develop   1/1     Running   0          20m
kube-system   kube-proxy-f7n6d                  1/1     Running   0          21m
kube-system   kube-scheduler-develop            1/1     Running   0          20m
[root@develop images]# cat {flannel-daemonset.yml,multus-daemonset.yml} | kubectl apply -f -
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
customresourcedefinition.apiextensions.k8s.io/network-attachment-definitions.k8s.cni.cncf.io created
clusterrole.rbac.authorization.k8s.io/multus created
clusterrolebinding.rbac.authorization.k8s.io/multus created
serviceaccount/multus created
configmap/multus-cni-config created
daemonset.extensions/kube-multus-ds-amd64 created
[root@develop images]# kubectl get pod --all-namespaces                                     
NAMESPACE     NAME                              READY   STATUS    RESTARTS   AGE
kube-system   coredns-78d4cf999f-4dcjq          1/1     Running   0          22m
kube-system   coredns-78d4cf999f-76p5l          1/1     Running   0          22m
kube-system   etcd-develop                      1/1     Running   0          22m
kube-system   kube-apiserver-develop            1/1     Running   0          22m
kube-system   kube-controller-manager-develop   1/1     Running   0          22m
kube-system   kube-flannel-ds-amd64-wlc5m       1/1     Running   0          80s
kube-system   kube-multus-ds-amd64-f69xz        1/1     Running   0          80s
kube-system   kube-proxy-f7n6d                  1/1     Running   0          22m
kube-system   kube-scheduler-develop            1/1     Running   0          22m
[root@develop images]#  

K8S의 coredns는 flannel 플러그인이 작동했음을 나타냅니다.배치 Multus가 완료되면 "/etc/cni/net.d/"디렉터리에 다른 CNI 플러그인 설정 파일이 있는지 확인해야 합니다. 쿠블렛 호출 CNI 플러그인은 파일 이름의 크기에 따라 순서대로 호출됩니다. 현재 "70-multus.conf"파일만 있기 때문에 정상적으로 사용할 수 있습니다.
[root@develop images]# cat /etc/cni/net.d/
70-multus.conf  multus.d/       
[root@develop images]# cat /etc/cni/net.d/70-multus.conf 
{
  "name": "multus-cni-network",
  "type": "multus",
  "delegates": [
    {
      "type": "flannel",
      "name": "flannel.1",
      "delegate": {
        "isDefaultGateway": true,
        "hairpinMode": true
      }
    }
  ],
  "kubeconfig": "/etc/cni/net.d/multus.d/multus.kubeconfig"
}
[root@develop images]# 

다음은 K8S 환경에서 추가 CNI 플러그인을 설정하여 생성된 POD에 여러 개의 네트워크 인터페이스가 있습니다.Network AttachmentDefinition 사용자는 네트워크 자원 대상을 사용자 정의합니다. 이 대상은pod를 대상이 인용하는 논리적 또는 물리적 네트워크에 연결하는 방법을 설명합니다.macvlan CNI 플러그인 파일 만들기
[root@develop k8s]# cat macvlan-conf-1.yaml 
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: macvlan-conf-1
spec:
  config: '{
            "cniVersion": "0.3.0",
            "type": "macvlan",
            "master": "ens15f1",
            "mode": "bridge",
            "ipam": {
                "type": "host-local",
                "ranges": [
                    [ {
                         "subnet": "10.10.0.0/16",
                         "rangeStart": "10.10.1.20",
                         "rangeEnd": "10.10.3.50",
                         "gateway": "10.10.0.254"
                    } ]
                ]
            }
        }'
[root@develop k8s]# kubectl apply -f macvlan-conf-1.yaml 
networkattachmentdefinition.k8s.cni.cncf.io/macvlan-conf-1 created
[root@develop k8s]# 

다음 명령을 사용하여 Network AttachmentDefinition 생성 상태를 볼 수 있습니다.
[root@develop k8s]# kubectl get network-attachment-definitions
NAME             AGE
macvlan-conf-1   48s
[root@develop k8s]# kubectl describe network-attachment-definitions macvlan-conf-1
Name:         macvlan-conf-1
Namespace:    default
Labels:       
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"k8s.cni.cncf.io/v1","kind":"NetworkAttachmentDefinition","metadata":{"annotations":{},"name":"macvlan-conf-1","namespace":"...
API Version:  k8s.cni.cncf.io/v1
Kind:         NetworkAttachmentDefinition
Metadata:
  Creation Timestamp:  2019-02-09T09:27:20Z
  Generation:          1
  Resource Version:    2371
  Self Link:           /apis/k8s.cni.cncf.io/v1/namespaces/default/network-attachment-definitions/macvlan-conf-1
  UID:                 e68a99b7-2c4c-11e9-9baa-0024ecf14b1f
Spec:
  Config:  { "cniVersion": "0.3.0", "type": "macvlan", "master": "ens15f1", "mode": "bridge", "ipam": { "type": "host-local", "ranges": [ [ { "subnet": "10.10.0.0/16", "rangeStart": "10.10.1.20", "rangeEnd": "10.10.3.50", "gateway": "10.10.0.254" } ] ] } }
Events:    
[root@develop k8s]# 

멀티 인터페이스 POD를 Multus CNI로 배포


간단한 POD를 만듭니다. POD의 YAML 파일은 일반적인 POD 파일과 마찬가지로 메타데이터'annotations'가 하나 더 추가되었습니다. 이 메타데이터의 값은 K8S에 알려줍니다. POD를 만들 때 macvlan-conf-1이라는 설정을 추가해야 합니다. 이렇게 하면 이전에 설정한 Network AttachmentDefinition 자원에 대응하고 상대방 방식은 자원 이름을 사용합니다.
[root@develop k8s]# cat pod-case-01.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-case-01
  annotations:
    k8s.v1.cni.cncf.io/networks: macvlan-conf-1
spec:
  containers:
  - name: pod-case-01
    image: docker.io/centos/tools:latest
    command:
    - /sbin/init
[root@develop k8s]# 

POD 배치, 배치 완료 후 POD 인터페이스 보기, eth0은flannel 플러그인에 제공, net1은macvlan에서 제공
[root@develop k8s]# kubectl apply -f pod-case-01.yaml 
pod/pod-case-01 created
[root@develop k8s]# kubectl get pod 
NAME          READY   STATUS    RESTARTS   AGE
pod-case-01   1/1     Running   0          21s
[root@develop k8s]# kubectl exec pod-case-01 ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
3: eth0@if110:  mtu 1450 qdisc noqueue state UP group default 
    link/ether 0a:58:c0:a8:00:0e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.0.14/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::2ccf:72ff:fe18:bf16/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
4: net1@if3:  mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default 
    link/ether de:25:34:bb:33:0d brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.10.1.25/16 scope global net1
       valid_lft forever preferred_lft forever
[root@develop k8s]# brctl show 
bridge name     bridge id               STP enabled     interfaces
br0             8000.000000000000       no
cni0            8000.0a58c0a80001       no              veth8c34cca9
                                                        vethae2601ad
                                                        vethb19ed751
docker0         8000.024276d139c2       no
virbr0          8000.5254005a2c64       yes             virbr0-nic
[root@develop k8s]# ip a | grep cni0        
31: cni0:  mtu 1450 qdisc noqueue state UP group default qlen 1000
    inet 192.168.0.1/24 scope global cni0
108: vethb19ed751@if3:  mtu 1450 qdisc noqueue master cni0 state UP group default 
109: veth8c34cca9@if3:  mtu 1450 qdisc noqueue master cni0 state UP group default 
110: vethae2601ad@if3:  mtu 1450 qdisc noqueue master cni0 state UP group default 
[root@develop k8s]# 

좋은 웹페이지 즐겨찾기