真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

kubernetes的CNI怎么安裝

今天小編給大家分享一下kubernetes的CNI怎么安裝的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

在任縣等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營(yíng)銷(xiāo)推廣,成都外貿(mào)網(wǎng)站制作,任縣網(wǎng)站建設(shè)費(fèi)用合理。

環(huán)境介紹

我們安裝kubernetes時(shí)先不安裝CNI. 如果使用了sealyun離線包 那么修改下 kube/conf/master.sh

只留如下內(nèi)容即可:

[root@helix105 shell]# cat master.sh 
kubeadm init --config ../conf/kubeadm.yaml
mkdir ~/.kube
cp /etc/kubernetes/admin.conf ~/.kube/config

kubectl taint nodes --all node-role.kubernetes.io/master-

清空CNI相關(guān)目錄:

rm -rf /opt/cni/bin/*
rm -rf /etc/cni/net.d/*

啟動(dòng)kubernetes, 如果已經(jīng)裝過(guò)那么kubeadm reset一下:

cd kube/shell && sh init.sh && sh master.sh

此時(shí)你的節(jié)點(diǎn)是notready的,你的coreDNS也沒(méi)有辦法分配到地址:

[root@helix105 shell]# kubectl get pod -n kube-system -o wide
NAME                                            READY   STATUS    RESTARTS   AGE   IP              NODE                    NOMINATED NODE   READINESS GATES
coredns-5c98db65d4-5fh7c                        0/1     Pending   0          54s                                          
coredns-5c98db65d4-dbwmq                        0/1     Pending   0          54s                                          
kube-controller-manager-helix105.hfa.chenqian   1/1     Running   0          19s   172.16.60.105   helix105.hfa.chenqian              
kube-proxy-k74ld                                1/1     Running   0          54s   172.16.60.105   helix105.hfa.chenqian              
kube-scheduler-helix105.hfa.chenqian            1/1     Running   0          14s   172.16.60.105   helix105.hfa.chenqian              
[root@helix105 shell]# kubectl get node
NAME                    STATUS     ROLES    AGE   VERSION
helix105.hfa.chenqian   NotReady   master   86s   v1.15.0

安裝CNI

創(chuàng)建CNI配置文件

$ mkdir -p /etc/cni/net.d
$ cat >/etc/cni/net.d/10-mynet.conf </etc/cni/net.d/99-loopback.conf <

這里兩個(gè)配置一個(gè)是給容器塞一個(gè)網(wǎng)卡掛在網(wǎng)橋上的,另外一個(gè)配置負(fù)責(zé)擼(本地回環(huán))。。

配置完后會(huì)發(fā)現(xiàn)節(jié)點(diǎn)ready:

[root@helix105 shell]# kubectl get node
NAME                    STATUS   ROLES    AGE   VERSION
helix105.hfa.chenqian   Ready    master   15m   v1.15.0

但是coredns會(huì)一直處于ContainerCreating狀態(tài),是因?yàn)閎in文件還沒(méi)有:

failed to find plugin "bridge" in path [/opt/cni/bin]

plugins里實(shí)現(xiàn)了很多的CNI,如我們上面配置的bridge.

$ cd $GOPATH/src/github.com/containernetworking/plugins
$ ./build_linux.sh
$ cp bin/* /opt/cni/bin
$ ls bin/
bandwidth  dhcp      flannel      host-local  loopback  portmap  sbr     tuning
bridge     firewall  host-device  ipvlan      macvlan   ptp      static  vlan

這里有很多二進(jìn)制,我們學(xué)習(xí)的話不需要關(guān)注所有的,就看ptp(就簡(jiǎn)單的創(chuàng)建了設(shè)備對(duì))或者bridge

再看coredns已經(jīng)能分配到地址了:

[root@helix105 plugins]# kubectl get pod -n kube-system -o wide
NAME                                            READY   STATUS    RESTARTS   AGE     IP              NODE                    NOMINATED NODE   READINESS GATES
coredns-5c98db65d4-5fh7c                        1/1     Running   0          3h20m   10.22.0.8       helix105.hfa.chenqian              
coredns-5c98db65d4-dbwmq                        1/1     Running   0          3h20m   10.22.0.9

看一下網(wǎng)橋,cni0上掛了兩個(gè)設(shè)備,與我們上面的cni配置里配置的一樣,type字段指定用哪個(gè)bin文件,bridge字段指定網(wǎng)橋名:

[root@helix105 plugins]# brctl show
bridge name	bridge id		STP enabled	interfaces
cni0		8000.8ef6ac49c2f7	no		veth2b28b06f
            							veth2c093940

原理

為了更好理解kubelet干嘛了,我們可以找一個(gè)腳本來(lái)解釋 script 這個(gè)腳本也可以用來(lái)測(cè)試你的CNI:

為了易讀,我刪除一些不重要的東西,原版腳本可以在連接中去拿

# 先創(chuàng)建一個(gè)容器,這里只為了拿到一個(gè)net namespace
contid=$(docker run -d --net=none golang:1.12.7 /bin/sleep 10000000) 
pid=$(docker inspect -f '{{ .State.Pid }}' $contid)
netnspath=/proc/$pid/ns/net # 這個(gè)我們需要

kubelet啟動(dòng)pod時(shí)也是創(chuàng)建好容器就有了pod的network namespaces,再去把ns傳給cni 讓cni去配置

./exec-plugins.sh add $contid $netnspath # 傳入兩個(gè)參數(shù)給下一個(gè)腳本,containerid和net namespace路徑

docker run --net=container:$contid $@
NETCONFPATH=${NETCONFPATH-/etc/cni/net.d}

i=0
# 獲取容器id和網(wǎng)絡(luò)ns
contid=$2 
netns=$3

# 這里設(shè)置了幾個(gè)環(huán)境變量,CNI命令行工具就可以獲取到這些參數(shù)
export CNI_COMMAND=$(echo $1 | tr '[:lower:]' '[:upper:]')
export PATH=$CNI_PATH:$PATH # 這個(gè)指定CNI bin文件的路徑
export CNI_CONTAINERID=$contid 
export CNI_NETNS=$netns

for netconf in $(echo $NETCONFPATH/10-mynet.conf | sort); do
        name=$(jq -r '.name' <$netconf)
        plugin=$(jq -r '.type' <$netconf) # CNI配置文件的type字段對(duì)應(yīng)二進(jìn)制程序名
        export CNI_IFNAME=$(printf eth%d $i) # 容器內(nèi)網(wǎng)卡名

        # 這里執(zhí)行了命令行工具
        res=$($plugin <$netconf) # 這里把CNI的配置文件通過(guò)標(biāo)準(zhǔn)輸入也傳給CNI命令行工具
        if [ $? -ne 0 ]; then
                # 把結(jié)果輸出到標(biāo)準(zhǔn)輸出,這樣kubelet就可以拿到容器地址等一些信息
                errmsg=$(echo $res | jq -r '.msg')
                if [ -z "$errmsg" ]; then
                        errmsg=$res
                fi

                echo "${name} : error executing $CNI_COMMAND: $errmsg"
                exit 1
        let "i=i+1"
done

總結(jié)一下:

         CNI配置文件
         容器ID
         網(wǎng)絡(luò)ns
kubelet -------------->  CNI command
   ^                        |
   |                        |
   +------------------------+
       結(jié)果標(biāo)準(zhǔn)輸出

bridge CNI實(shí)現(xiàn)

既然這么簡(jiǎn)單,那么就可以去看看實(shí)現(xiàn)了:

bridge CNI代碼

//cmdAdd 負(fù)責(zé)創(chuàng)建網(wǎng)絡(luò)
func cmdAdd(args *skel.CmdArgs) error 

//入?yún)?shù)都已經(jīng)寫(xiě)到這里面了,前面的參數(shù)從環(huán)境變量讀取的,CNI配置從stdin讀取的
type CmdArgs struct {
	ContainerID string
	Netns       string
	IfName      string
	Args        string
	Path        string
	StdinData   []byte
}

所以CNI配置文件除了name type這些特定字段,你自己也可以加自己的一些字段.然后自己去解析

然后啥事都得靠自己了

//這里創(chuàng)建了設(shè)備對(duì),并掛載到cni0王橋上
hostInterface, containerInterface, err := setupVeth(netns, br, args.IfName, n.MTU, n.HairpinMode, n.Vlan)

具體怎么掛的就是調(diào)用了netlink 這個(gè)庫(kù),sealos在做內(nèi)核負(fù)載時(shí)同樣用了該庫(kù)。

err := netns.Do(func(hostNS ns.NetNS) error { //創(chuàng)建設(shè)備對(duì)
	hostVeth, containerVeth, err := ip.SetupVeth(ifName, mtu, hostNS)
    ...
    //配置容器內(nèi)的網(wǎng)卡名mac地址等
	contIface.Name = containerVeth.Name
	contIface.Mac = containerVeth.HardwareAddr.String()
	contIface.Sandbox = netns.Path()
	hostIface.Name = hostVeth.Name
	return nil
})
...

// 根據(jù)index找到宿主機(jī)設(shè)備對(duì)名
hostVeth, err := netlink.LinkByName(hostIface.Name)
...
hostIface.Mac = hostVeth.Attrs().HardwareAddr.String()

// 把宿主機(jī)端設(shè)備對(duì)掛給網(wǎng)橋
if err := netlink.LinkSetMaster(hostVeth, br); err != nil {}

// 設(shè)置hairpin mode
if err = netlink.LinkSetHairpin(hostVeth, hairpinMode); err != nil {
}

// 設(shè)置vlanid
if vlanID != 0 {
	err = netlink.BridgeVlanAdd(hostVeth, uint16(vlanID), true, true, false, true)
}

return hostIface, contIface, nil

最后把結(jié)果返回:

type Result struct {
	CNIVersion string         `json:"cniVersion,omitempty"`
	Interfaces []*Interface   `json:"interfaces,omitempty"`
	IPs        []*IPConfig    `json:"ips,omitempty"`
	Routes     []*types.Route `json:"routes,omitempty"`
	DNS        types.DNS      `json:"dns,omitempty"`
}

// 這樣kubelet就收到返回信息了
func (r *Result) PrintTo(writer io.Writer) error {
	data, err := json.MarshalIndent(r, "", "    ")
	if err != nil {
		return err
	}
	_, err = writer.Write(data)
	return err
}

如:

{
  "cniVersion": "0.4.0",
  "interfaces": [                                            (this key omitted by IPAM plugins)
      {
          "name": "",
          "mac": "",                            (required if L2 addresses are meaningful)
          "sandbox": "" (required for container/hypervisor interfaces, empty/omitted for host interfaces)
      }
  ],
  "ips": [
      {
          "version": "<4-or-6>",
          "address": "",
          "gateway": "",          (optional)
          "interface": 
      },
      ...
  ],
  "routes": [                                                (optional)
      {
          "dst": "",
          "gw": ""                           (optional)
      },
      ...
  ],
  "dns": {                                                   (optional)
    "nameservers":                      (optional)
    "domain":                          (optional)
    "search":             (optional)
    "options":                              (optional)
  }
}

以上就是“kubernetes的CNI怎么安裝”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站題目:kubernetes的CNI怎么安裝
當(dāng)前地址:http://weahome.cn/article/psgpss.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部