k8s網絡插件cni

    CNI(Container Network Interface)1容器網絡接口,是Linux容器網絡配置的一組標準和庫,用戶需要根據這些標準和庫來開發自己的容器網絡插件。在github裏已經提供了一些常用的插件。CNI只專注解決容器網絡連接和容器銷燬時的資源釋放,提供一套框架,所以CNI可以支持大量不同的網絡模式,並且容易實現

相對於k8s exec直接執行可執行程序,cni 插件是對執行程序的封裝,規定了可執行程序的框架,當然最後還是和exec 插件一樣,執行可執行程序。只不過exec 插件通過命令行數據讀取參數,cni插件通過環境變量以及配置文件讀入參數.

相對於exec 的4個 subcommand,cni 只有2 subcommand,執行CNI插件需要傳入以下環境變量

CNI_COMMAND=ADD/DEL

CNI_CONTAINERID=xxxxxxxxxxxxxxxxxxx

CNI_NETNS=/proc/4390/ns/net

CNI_ARGS=IgnoreUnknown=1;K8S_POD_NAMESPACE=default;K8S_POD_NAME=22-my-nginx-2523304718-7stgs;K8S_POD_INFRA_CONTAINER_ID=xxxxxxxxxxxxxxxx

CNI_IFNAME=eth0

CNI_PATH=/opt/cni/bin.

 

最終的執行是./plugin netconfpath 其中plugin是二進制可執行cni插件,netconf 是配置文件路徑

一般配置文件文件夾在 /etc/cni/net.d/

 

cni插件的開發可以模仿github上面的例子,主要實現兩個函數

funccmdAdd(args *skel.CmdArgs) funccmdDel(args *skel.CmdArgs)

 

下面bridge配置文件例子

 {

    "cniVersion": "0.2.0",

    "name": "mynet",

    "type": "bridge",   //使用的cni插件類型,cni根據這個調用相應二進制文件

    "bridge": "cni0",

    "isGateway": true,    //其他配置信息比如IP地址等

    "ipMasq": true,

    "ipam": {

        "type":"host-local",

        "subnet":"10.22.0.0/16",

        "routes": [

            { "dst":"0.0.0.0/0" }

        ]

    }

}

下面calico配置文件例子

{

    "name":"k8s-pod-network",

    "type": "calico",

    "etcd_endpoints":"http://10.255.13.121:2379",

    "etcd_key_file": "",

    "etcd_cert_file": "",

    "etcd_ca_cert_file":"",

    "log_level": "info",

    "ipam": {

        "type":"calico-ipam"

    },

    "policy": {

        "type": "k8s",

        "k8s_api_root":"https://10.255.0.1:443",

        "k8s_auth_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZWZhdWx0LXRva2VuLTN4d2NjIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRlZmF1bHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI3MGQ5Y2YyNS1jNzU2LTExZTYtYWVhNi1kMDBkYTBmNGQ0ZTIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06ZGVmYXVsdCJ9.OqEBj0cofXDKvQiioRkt1RKuF5QSPRweYRsmKXsacDFq10jJmBzgJUZtiIysu5CDov-6OR4p2HzmBfjfWkNFuldvOMKdjZP4KmJ8C1ZAOJ20f7Rr0-hyiG3Hnem6RBK41QsIUz0dwB-SmGWR9Mx-HY3LHITFp6nn3UcaDVESIFuRLge3KSnWBlalTlI5zyxJJ5Bfuxh9J26hw8wCaZce53pkE9g2fcjxJkXdUPEzB1MZw8egu7FiQ6_WaiaYgu6uD9TQovjb8uewWR3Jq5aYvCOrwnegm2MxC8Ndt_3EUJRVNgYnf2yzaXmkDSqAtgR-PQQ2SmYWKu45MjPPiyJn3w"

    },

    "kubernetes": {

        "kubeconfig":"/etc/cni/net.d/calico-kubeconfig"

    }

}

Calico這邊數據是從Calico服務端獲取相應的網絡信息。

像簡單的插件,對於容器網絡信息,比如容器應該分配的IP,可以直接從dnsmasq分配出來;如果更簡單一些,可以直接從CNI_ARGS 環境變量傳過來;複雜的插件,比如Calico,就需要從服務端傳遞數據過來。

發佈了41 篇原創文章 · 獲贊 9 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章