1. 程式人生 > >kubernetes cni網路詳解

kubernetes cni網路詳解

1.CNI介紹

一直以來,kubernetes 並沒有專門的網路模組負責網路配置,它需要使用者在主機上已經配置好網路。

kubernetes 對網路的要求是:

  • 容器之間(包括同一臺主機上的容器,和不同主機的容器)可以互相通訊
  • 容器和叢集中所有的節點也能直接通訊

kubernetes 網路的發展方向是希望通過外掛的方式來整合不同的網路方案, CNI 就是這一努力的結果。CNI只專注解決容器網路連線和容器銷燬時的資源釋放,提供一套框架,所以CNI可以支援大量不同的網路模式,並且容易實現。

2.網路建立步驟

在Kubernetes建立Pod後CNI提供網路的過程主要分三個步驟:

  • Kubelet runtime建立network namespace
  • Kubelete觸發CNI外掛,指定網路型別(網路型別決定哪一個CNI plugin將會被使用)
  • CNI外掛將建立veth pair, 檢查IPAM型別和資料,觸發IPAM外掛,獲取空閒的IP地址並將地址分配給容器的網路介面

2.1 kubelet runtime建立network namespace

kubelet先建立pause容器,併為這個pause容器生成一個network namespace,然後把這個network namespace關聯到pause容器上。
這裡寫圖片描述

2.2 Kubelet觸發CNI外掛

在觸發cni外掛的時候會將cni的配置load給cni外掛
執行CNI需要傳入以下變數:

# 新增或者刪除網絡卡
CNI_COMMAND=ADD/DEL

# 容器的ID
CNI_CONTAINERID=xxxxxxxxxxxxxxxxxxx

#  容器網路空間主機對映路徑
CNI_NETNS=/proc/4390/ns/net

# CNI引數,使用分號分開,主要是POD的一些相關資訊
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二進位制檔案路徑
CNI_PATH=/opt/cni/bin.

例:
這裡寫圖片描述

2.3 kubelet呼叫相應CNI外掛

  • CNI外掛建立veth pair
    這裡寫圖片描述
  • 通過IPAM外掛獲取空閒的ip地址
    這裡寫圖片描述
  • 將ip配置到容器net namespace的網路裝置
    這裡寫圖片描述

3.CNI網路外掛

3.1 flannel

flannel原理如下圖所示,flannel不是本文介紹重點,不做詳細介紹。
這裡寫圖片描述

3.2 calico

calico在CNM和CNI兩大陣營都扮演著比較重要的角色。既有著不俗的效能表現,提供了很好的隔離性,還有不錯的ACL控制能力。

Calico 是一個三層的資料中心網路方案,基於三層路由,不需要二層網橋。而且方便整合 OpenStack 這種 IaaS 雲架構,能夠提供高效可控的 VM、容器、裸機之間的通訊。

Calico的BGP模式在每一個計算節點利用Linux Kernel實現了一個高效的vRouter來負責資料轉發,而每個vRouter通過BGP協議負責把自己上執行的workload的路由資訊向整個Calico網路內傳播——小規模部署可以直接互聯,大規模下可通過指定的BGP route reflector來完成。所有的workload之間的資料流量都是通過IP路由的方式完成互聯的。

Calico 節點組網可以直接利用資料中心的網路結構(支援 L2 或者 L3),不需要額外的 NAT、埠對映、隧道或者 VXLAN overlay network,擴充套件性和效能都很好。與其他容器網路方案相比,Calico 還有一大優勢:豐富而靈活的network policy。使用者可以通過動態定義各個節點上的 ACL 規則,控制進出容器的資料包,來提供Workload的多租戶隔離、安全組以及其他可達性限制等功能,實現業務需求。

這裡寫圖片描述

如上圖所示,這樣保證這個方案的簡單可控,而且沒有封包解包,節約CPU計算資源的同時,提高了整個網路的效能。

3.2.1 Calico架構

這裡寫圖片描述

結合上面這張圖,我們來過一遍BGP模式下Calico的核心元件:

  • Felix(Calico Agent):跑在每臺需要執行Workload的節點上的守護程序,主要負責配置路由及ACLs等資訊來確保Endpoint的連通狀態;根據對接的編排框架的不同,felix主要包含以下功能:
    • 網路介面管理:把介面的一些資訊告訴核心,讓核心正確的處理這個介面的鏈路,特殊情況下,會去響應ARP請求,允許ip forwarding等。
    • 路由管理:在節點上把endpoints的路由配置到Linux kernel FIB(forwarding information base), 保障包正確的到達節點的endpoint上,我的理解endpoints是節點上的虛擬網絡卡
    • ACL管理:准入控制列表,設定核心的ACL,保證只有合法的包才可以在鏈路上傳送,保障安全。
    • 狀態報告:把節點的網路狀態資訊寫入etcd。
  • The Orchestrator plugin:通過該外掛更好地與編排系統(k8s/mesos/openstack等)進行整合。(The purpose of these plugins is to bind Calico more tightly into the orchestrator, allowing users to manage the Calico network just as they’d manage network tools that were built into the orchestrator.)工作包括:
    • API轉化:編排系統 kubernetes openstack等有自己的API,編排外掛翻譯成calico的資料模型存到calico的資料庫中。
    • 資訊反饋:把網路狀態的一些資訊反饋給上層的編排排程系統
  • etcd:分散式鍵值儲存,主要負責網路元資料一致性,確保Calico網路狀態的準確性;用途有:

    • 資料儲存
    • 各元件之間通訊
  • BGP Client(BIRD):主要負責把Felix寫入Kernel的路由資訊分發到當前Calico網路,確保Workload間的通訊的有效性;BIRD Bird是一個BGP client,它會主動讀取felix在host上設定的路由資訊,然後通過BGP協議廣播出去。

  • BGP Route Reflector(BIRD):大規模部署時使用,摒棄所有節點互聯的 mesh 模式(每個BGP客戶端之間都會相互連線,會以 N^2次方增長),reflector負責client之間的連線,防止它們需要兩兩相連。通過一個或者多個BGP Route Reflector來完成集中式的路由分發;為了冗餘,可以部署多個reflectors, 它僅僅包含控制面,endpoint之間的資料不經過它們。

  • birdc是bird的client,可以用來檢視bird的狀態,例如
    • 檢視配置的協議: birdctl -s /var/run/calico/bird.ctl show protocols
    • 檢視所有的路由: birdctl -s /var/run/calico/bird.ctl show route
      可以到birdc中檢視更多的命令。

架構詳情請見官網

3.2.2 Calico模式

3.2.2.1 BGP模式

這裡寫圖片描述

BGP模式流量分析

<1>流量從容器中到達主機的過程
cni-plugin會在指定的network ns中建立veth pair。位於容器中的veth,將被設定ip,在容器中可以看到內部ip地址是啟動kube-proxy時指定的--cluster-cidr=192.168.0.0/16中的一個:
這裡寫圖片描述
並將169.254.1.1設定為預設路由,在容器內可以看到:
這裡寫圖片描述
因為169.254.1.1是無效IP,因此,cni-plugin還要在容器內設定一條靜態arp:
這裡寫圖片描述
在主機上檢視網路介面,可以找到和上述mac地址一致的一個calixxx介面:
這裡寫圖片描述
由以上可見:169.254.1.1的mac地址被設定為了veth裝置在host中的一端veth的mac地址,容器中所有的報文就會發送到主機的veth端。

<2>流量從主機到達其他pod的過程
檢視主機路由表:
這裡寫圖片描述
可以看到到10.233.64.0/18這個pod網段的流量主要走兩種iface:calixxxxx和eno16777984(主機網絡卡),走calixxxx的是訪問在同一主機的pod的流量;走eno16777984的是訪問其他主機的pod的流量,然後Gateway直接就是所要訪問的pod所在主機的ip。

<3>與docker bridge模式對比
單純使用docker bridge模式起容器的話可以看到內部ip地址是docker0網橋那個網段的內部地址:
這裡寫圖片描述

同樣會建立veth pair。位於容器中的veth,將被設定ip,並設定bridge0網橋172.17.0.1為預設路由,在容器內可以看到:
這裡寫圖片描述
因為172.17.0.1是docker0網橋的有效IP,因此,這裡就沒有再像calico模式一樣設設定一條靜態arp了。
在主機上檢視網路介面,可以找到對應在主機上的vethxxx介面:
這裡寫圖片描述

3.2.2.2 IP-in-IP模式

Calico的BGP模式在主機間跨子網的情況下要求閘道器的路由器也支援BGP協議才可以,當資料中心環境不滿足這個要求時,可以考慮使用ipip模式。

IPIP從字面來理解,就是把一個IP資料包又套在一個IP包裡。是把 IP 層封裝到 IP 層的一個 tunnel,看起來似乎是浪費,實則不然。它的作用其實基本上就相當於一個基於IP層的網橋!我們知道,普通的網橋是基於mac層的,根本不需 IP,而這個 ipip 則是通過兩端的路由做一個 tunnel,把兩個本來不通的網路通過點對點連線起來。啟用IPIP模式時,Calico將在各Node上建立一個名為”tunl0”的虛擬網路介面。ipip 的原始碼在核心 net/ipv4/ipip.c 中可以找到。

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

ipip模式流量分析

<1>流量從容器中到達主機的過程
同BGP模式

<2>流量從主機到達其他pod的過程
啟用IPIP模式時,Calico將在node上建立一個tunl0的虛擬網絡卡做隧道使用,如以下2圖所示:
這裡寫圖片描述
這裡寫圖片描述
檢視主機路由表:
這裡寫圖片描述
可以看到到192.168.x.x這個pod網段的流量主要走兩種iface:calixxxxx和tunl0,走calixxxx的是訪問在同一主機的pod的流量;走tunl0的是訪問其他主機的pod的流量,然後Gateway直接就是所要訪問的pod所在主機的ip。

配置方法請見官網

3.2.2.3 cross-subnet模式

同子網內的機器間採用bgp模式,跨子網的機器間採用ipip模式。要想使用cross-subnet模式,需要配置如下兩項:

  • 配置ipPool,具體配置方式請見官網Configuring cross-subnet IP-in-IP部分
  • 配置calico-node,具體配置方式請見官網,尤其注意可能需要手動修改node子網掩碼(雖然calico會自動探測並設定主機ip和子網掩碼,但很多時候設定的子網掩碼是32,因此需要手動改一下)。

4.calico部署

4.1 前提

根據官方文件,calico部署前,已有的k8s叢集需做好以下配置:

  • kubelet需要新增如下啟動引數:
    • --network-plugin=cni //指定網路外掛型別
    • --cni-conf-dir=/etc/cni/net.d //指定cni配置檔案目錄
    • --cni-bin-dir=/opt/cni/bin //指定cni可執行檔案目錄
  • kube-proxy必須採用iptables proxy mode --proxy-mode=iptables(1.2 以後是預設模式)
  • kubec-proxy 元件啟動方式不能採用 --masquerade-all 啟動,因為會與 Calico policy 衝突

備註:
1.--cni-conf-dir--cni-bin-dir這兩個引數在啟動calico-node pod的install-cni容器的時候也會指定掛載進容器,需要和這裡設定的一樣。
2.net.d下有如下內容:

[[email protected] net.d]# ll
總用量 12
-rw-rw-r--. 1 root root 1490 125 21:47 10-calico.conf
-rw-r--r--. 1 root root  273 125 21:47 calico-kubeconfig
drwxr-xr-x. 2 root root 4096 12月  5 21:47 calico-tls

其中,10-calico.conf是一些calico的基本配置項,內容如下:

{
    "name": "k8s-pod-network",
    "cniVersion": "0.1.0",
    "type": "calico",
    "etcd_endpoints": "https://10.142.21.21:2379",
    "etcd_key_file": "/etc/cni/net.d/calico-tls/etcd-key",
    "etcd_cert_file": "/etc/cni/net.d/calico-tls/etcd-cert",
    "etcd_ca_cert_file": "/etc/cni/net.d/calico-tls/etcd-ca",
    "log_level": "info",
    "mtu": 1500,
    "ipam": {
        "type": "calico-ipam"
    },
    "policy": {
        "type": "k8s",
        "k8s_api_root": "https://10.233.0.1:443",
        "k8s_auth_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJjYWxpY28tbm9kZS10b2tlbi1qNHg0bSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJjYWxpY28tbm9kZSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImE4N2ZiZjY1LWQzNTctMTFlNy1hZTVkLTAwNTA1Njk0ZWI2YSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTpjYWxpY28tbm9kZSJ9.om9TzY_4uYSx2b0kVooTmlA_xrHlL0vpGd4m6Pxq4s--CwQHQb5yvOy3qtMqpRlQrSliDRSLUi1O5QQXfjWNrbyk206B4F0k9NsZi0s-1ZzNVhwI6hsatXl8NZ0qb4LQ2rulm5uM9ykKwXnGpQyCghtwlcBGqQmY63VrBdZHxD3NeyCJ9HqM8BfhclpfzepN-ADADhNn59m96cSaXPJbogVOoMdntXn9x9kn_VaQn5A-XIBNQDMGrUhz1dWCOFfG3nVlxAbo24UcxurvtX4gWyxlUTrkc195i_cnuTbYlIMfBCgKsnuf9QMryn5EWULC5IMB8hPW9Bm1e8fUIHeMvQ"
    },
    "kubernetes": {
        "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
    }
}

3.我部署的是calico2.6.2版本,該版本涉及的各元件版本資訊請見:https://docs.projectcalico.org/v2.6/releases/#v2.6.2
Calico 依賴 etcd 在不同主機間共享和交換資訊,儲存 Calico 網路狀態。Calico 網路中的每個主機都需要執行 Calico 元件,提供容器 interface 管理、動態路由、動態 ACL、報告狀態等功能。

4.2 calicoctl部署

4.2.1 calicoctl安裝

sudo wget -O /usr/local/bin/calicoctl https://github.com/projectcalico/calicoctl/releases/download/v1.6.3/calicoctl
sudo chmod a+x /usr/local/bin/calicoctl

4.2.2 calicoctl配置

calicoctl預設是會讀取/etc/calico/calicoctl.cfg的配置檔案(也可以通過--config選項來指定要讀取的配置檔案),配置裡指定etcd叢集的地址,檔案的格式請見官網
示例:

apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
  datastoreType: "etcdv2"
  etcdEndpoints: "https://10.142.232.21:2379,https://10.142.232.22:2379,https://10.142.232.23:2379"
  etcdKeyFile: "/etc/calico/certs/key.pem"
  etcdCertFile: "/etc/calico/certs/cert.crt"
  etcdCACertFile: "/etc/calico/certs/ca_cert.crt"

4.2.3 常用calicoctl命令

檢視ip pool

calicoctl get ipPool

檢視節點狀態資訊

calicoctl node status

建立ipPool

calicoctl apply -f - << EOF
apiVersion: v1
kind: ipPool
metadata:
  cidr: 192.168.0.0/16
spec:
  ipip:
    enabled: true
  nat-outgoing: true
EOF

修改calico網路模式,由BGP改為ipip:

calicoctl apply -f - << EOF
apiVersion: v1
kind: ipPool
metadata:
  cidr: 192.168.0.0/16
spec:
  ipip:
    enabled: true
    mode: always
  nat-outgoing: true
EOF

4.3 calico核心元件部署

主要涉及3個元件:

  • calico/node:v2.6.2
  • calico/cni:v1.11.0
  • calico/kube-controllers:v1.0.0

4.3.1 calico-config(configmap)

kind: ConfigMap
apiVersion: v1
metadata:
  name: calico-config
  namespace: kube-system
data:
  # Configure this with the location of your etcd cluster.
  etcd_endpoints: "https://10.142.21.21:2379"

  # Configure the Calico backend to use.
  calico_backend: "bird"

  # The CNI network configuration to install on each node.
  cni_network_config: |-
    {
        "name": "k8s-pod-network",
        "cniVersion": "0.1.0",
        "type": "calico",
        "etcd_endpoints": "__ETCD_ENDPOINTS__",
        "etcd_key_file": "__ETCD_KEY_FILE__",
        "etcd_cert_file": "__ETCD_CERT_FILE__",
        "etcd_ca_cert_file": "__ETCD_CA_CERT_FILE__",
        "log_level": "info",
        "mtu": 1500,
        "ipam": {
            "type": "calico-ipam"
        },
        "policy": {
            "type": "k8s",
            "k8s_api_root": "https://__KUBERNETES_SERVICE_HOST__:__KUBERNETES_SERVICE_PORT__",
            "k8s_auth_token": "__SERVICEACCOUNT_TOKEN__"
        },
        "kubernetes": {
            "kubeconfig": "__KUBECONFIG_FILEPATH__"
        }
    }

  # If you're using TLS enabled etcd uncomment the following.
  # You must also populate the Secret below with these files.
  etcd_ca: "/calico-secrets/etcd-ca"
  etcd_cert: "/calico-secrets/etcd-cert"
  etcd_key: "/calico-secrets/etcd-key"

說明:
1.這個configmap給calico-node配置env使用
2.calico-config的data.etcd_endpoints(endpoints為etcd的真實環境地址)

4.3.2 calico-etcd-secrets(secret)

# The following contains k8s Secrets for use with a TLS enabled etcd cluster.
# For information on populating Secrets, see http://kubernetes.io/docs/user-guide/secrets/
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: calico-etcd-secrets
  namespace: kube-system
data:
  # Populate the following files with etcd TLS configuration if desired, but leave blank if
  # not using TLS for etcd.
  # This self-hosted install expects three files with the following names.  The values
  # should be base64 encoded strings of the entire contents of each file.
  etcd-key: 太長了,省略...
  etcd-cert: 太長了,省略...
  etcd-ca: 太長了,省略...

說明:
1. 這個secret用來給calico-node和kube-controller連線etcd使用
2. calico-etcd-secrets的etcd-key、etcd-cert、etcd-ca,分別使用/etc/ssl/etcd/ssl/目錄下的node-k8smaster01-key.pem、node-k8smaster01.pem、ca.pem(根據實際環境的證書資料填寫。)的base64編碼(生成base64編碼:base64 /etc/ssl/etcd/ssl/node-k8smaster01-key.pem)

4.3.3 calico-node(daemonset)

# This manifest installs the calico/node container, as well
# as the Calico CNI plugins and network config on
# each master and worker node in a Kubernetes cluster.
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: calico-node
  namespace: kube-system
  labels:
    k8s-app: calico-node
spec:
  selector:
    matchLabels:
      k8s-app: calico-node
  template:
    metadata:
      labels:
        k8s-app: calico-node
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
        /cheduler.alpha.kubernetes.io/tolerations: |
          [{"key": "dedicated", "value": "master", "effect": "NoSchedule" },
           {"key":"CriticalAddonsOnly", "operator":"Exists"}]
    spec:
      hostNetwork: true
      serviceAccountName: calico-node
      # Minimize downtime during a rolling upgrade or deletion; tell Kubernetes to do a "force
      # deletion": https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods.
      terminationGracePeriodSeconds: 0
      containers:
        # Runs calico/node container on each Kubernetes node.  This
        # container programs network policy and routes on each
        # host.
        - name: calico-node
          image: quay.io/calico/node:v2.6.2
          env:
            # The location of the Calico etcd cluster.
            - name: ETCD_ENDPOINTS
              valueFrom:
                configMapKeyRef:
                  name: calico-config
                  key: etcd_endpoints
            # Choose the backend to use.
            - name: CALICO_NETWORKING_BACKEND
              valueFrom:
                configMapKeyRef:
                  name: calico-config
                  key: calico_backend
            # Cluster type to identify the deployment type
            - name: CLUSTER_TYPE
              value: "k8s,bgp"
            # Disable file logging so `kubectl logs` works.
            - name: CALICO_DISABLE_FILE_LOGGING
              value: "true"
            # Set Felix endpoint to host default action to ACCEPT.
            - name: FELIX_DEFAULTENDPOINTTOHOSTACTION
              value: "ACCEPT"
            # Disable IPv6 on Kubernetes.
            - name: FELIX_IPV6SUPPORT
              value: "false"
            # Set Felix logging to "info"
            - name: FELIX_LOGSEVERITYSCREEN
              value: "info"
            # Set MTU for tunnel device used if ipip is enabled
            - name: FELIX_IPINIPMTU
              value: "1440"
            # Location of the CA certificate for etcd.
            - name: ETCD_CA_CERT_FILE
              valueFrom:
                configMapKeyRef:
                  name: calico-config
                  key: etcd_ca
            # Location of the client key for etcd.
            - name: ETCD_KEY_FILE
              valueFrom:
                configMapKeyRef:
                  name: calico-config
                  key: etcd_key
            # Location of the client certificate for etcd.
            - name: ETCD_CERT_FILE
              valueFrom:
                configMapKeyRef:
                  name: calico-config
                  key: etcd_cert
            # Auto-detect the BGP IP address.
            - name: IP
              value: ""
            - name: FELIX_HEALTHENABLED
              value: "true"
          securityContext:
            privileged: true
          resources:
            requests:
              cpu: 250m
          livenessProbe:
            httpGet:
              path: /liveness
              port: 9099
            periodSeconds: 10
            initialDelaySeconds: 10
            failureThreshold: 6
          readinessProbe:
            httpGet:
              path: /readiness
              port: 9099
            periodSeconds: 10
          volumeMounts:
            - mountPath: /lib/modules
              name: lib-modules
              readOnly: true
            - mountPath: /var/run/calico
              name: var-run-calico
              readOnly: false
            - mountPath: /calico-secrets
              name: etcd-certs
        # This container installs the Calico CNI binaries
        # and CNI network config file on each node.
        - name: install-cni
          image: quay.io/calico/cni:v1.11.0
          command: ["/install-cni.sh"]
          env:
            # The location of the Calico etcd cluster.
            - name: ETCD_ENDPOINTS
              valueFrom:
                configMapKeyRef:
                  name: calico-config
                  key: etcd_endpoints
            # The CNI network config to install on each node.
            - name: CNI_NETWORK_CONFIG
              valueFrom:
                configMapKeyRef:
                  name: calico-config
                  key: cni_network_config
          volumeMounts:
            - mountPath: /host/opt/cni/bin
              name: cni-bin-dir
            - mountPath: /host/etc/cni/net.d
              name: cni-net-dir
            - mountPath: /calico-secrets
              name: etcd-certs
      volumes:
        # Used by calico/node.
        - name: lib-modules
          hostPath:
            path: /lib/modules
        - name: var-run-calico
          hostPath:
            path: /var/run/calico
        # Used to install CNI.
        - name: cni-bin-dir
          hostPath:
            path: /opt/cni/bin
        - name: cni-net-dir
          hostPath:
            path: /etc/cni/net.d
        # Mount in the etcd TLS secrets.
        - name: etcd-certs
          secret:
            secretName: calico-etcd-secrets

備註:
1.calico-node的CALICO_IPV4POOL_CIDR引數(注:需要根據實際環境更改)
2.每個pod裡除pause外有兩個容器:calico-node和install-cni,其中calico-node這個容器裡起了多個程序,有:calico-felix、bird、bird6、confd(confd根據etcd上狀態資訊,與本地模板,生成並更新BIRD配置)
3.根據環境裡的所有節點的taints,為daemon/calico-node新增tolerations引數,使其能在每個節點上都能部署。例如如下引數:

spec:
   tolerations:
- key: "nginx-ingress-controller"
  operator: "Equal"
      value: "true"
    effect: "NoSchedule"
   hostNetwork: true

這是為了taints的節點能夠部署calico-node。其中的key和value為標記的taints。

4.3.4 calico-kube-controllers(deployment)

# This manifest deploys the Calico Kubernetes controllers.
# See https://github.com/projectcalico/kube-controllers
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: calico-kube-controllers
  namespace: kube-system
  labels:
    k8s-app: calico-kube-controllers
  annotations:
    scheduler.alpha.kubernetes.io/critical-pod: ''
    scheduler.alpha.kubernetes.io/tolerations: |
      [{"key": "dedicated", "value": "master", "effect": "NoSchedule" },
       {"key":"CriticalAddonsOnly", "operator":"Exists"}]
spec:
  # The controllers can only have a single active instance.
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      name: calico-kube-controllers
      namespace: kube-system
      labels:
        k8s-app: calico-kube-controllers
    spec:
      # The controllers must run in the host network namespace so that
      # it isn't governed by policy that would prevent it from working.
      hostNetwork: true
      serviceAccountName: calico-kube-controllers
      containers:
        - name: calico-kube-controllers
          image: quay.io/calico/kube-controllers:v1.0.0
          env:
            # The location of the Calico etcd cluster.
            - name: ETCD_ENDPOINTS
              valueFrom:
                configMapKeyRef:
                  name: calico-config
                  key: etcd_endpoints
            # Location of the CA certificate for etcd.
            - name: ETCD_CA_CERT_FILE
              valueFrom:
                configMapKeyRef:
                  name: calico-config
                  key: etcd_ca
            # Location of the client key for etcd.
            - name: ETCD_KEY_FILE
              valueFrom:
                configMapKeyRef:
                  name: calico-config
                  key: etcd_key
            # Location of the client certificate for etcd.
            - name: ETCD_CERT_FILE
              valueFrom:
                configMapKeyRef:
                  name: calico-config
                  key: etcd_cert
          volumeMounts:
            # Mount in the etcd TLS secrets.
            - mountPath: /calico-secrets
              name: etcd-certs
      volumes:
        # Mount in the etcd TLS secrets.
        - name: etcd-certs
          secret:
            secretName: calico-etcd-secrets

4.3.5 calico-policy-controller(deployment)

# This deployment turns off the old "policy-controller". It should remain at 0 replicas, and then
# be removed entirely once the new kube-controllers deployment has been deployed above.
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: calico-policy-controller
  namespace: kube-system
  labels:
    k8s-app: calico-policy
spec:
  # Turn this deployment off in favor of the kube-controllers deployment above.
  replicas: 0
  strategy:
    type: Recreate
  template:
    metadata:
      name: calico-policy-controller
      namespace: kube-system
      labels:
        k8s-app: calico-policy
    spec:
      hostNetwork: true
      serviceAccountName: calico-kube-controllers
      containers:
        - name: calico-policy-controller
          image: quay.io/calico/kube-controllers:v1.0.0
          env:
            # The location of the Calico etcd cluster.
            - name: ETCD_ENDPOINTS
              valueFrom:
                configMapKeyRef:
                  name: calico-config
                  key: etcd_endpoints

4.3.6 calico-kube-controllers(serviceaccount)

apiVersion: v1
kind: ServiceAccount
metadata:
  name: calico-kube-controllers
  namespace: kube-system

4.3.7 calico-node(serviceaccount)

apiVersion: v1
kind: ServiceAccount
metadata:
  name: calico-node
  namespace: kube-system

參考

更多精彩內容,請訂閱本人微信公眾號:K8SPractice
這裡寫圖片描述

相關推薦

kubernetes cni網路

1.CNI介紹 一直以來,kubernetes 並沒有專門的網路模組負責網路配置,它需要使用者在主機上已經配置好網路。 kubernetes 對網路的要求是: 容器之間(包括同一臺主機上的容器,和不同主機的容器)可以互相通訊 容器和叢集中所有的節點也能直

kubernetes之StatefulSet

part 更新 實現 ati partition code 自動創建 svc 解決 概述 RC、Deployment、DaemonSetStatefulSet都是面向無狀態的服務,它們所管理的Pod的IP、名字,啟停順序等都是隨機的,而StatefulSet是什麽?顧名思義

計算機系統結構之互連網路

一、基本概念 互連網路是一種由開關元件按照一定的拓撲結構和控制方式構成的網路,用來實現計算機系統中結點之間的相互連線。這些結點可以是處理器、儲存模組或其他裝置。 1.1 互連網路的種類 靜態互連網路:連線通路是固定的,一般不能實現任意結點到結點之間的互連。 迴圈互連網路:通過多次重複使

深度學習 --- Hopfield神經網路(吸引子的性質、網路的權值的設計、網路的資訊儲存容量)

上一節我們詳細的講解了Hopfield神經網路的工作過程,引出了吸引子的概念,簡單來說,吸引子就是Hopfield神經網路穩定時其中一個狀態,不懂的請看 Hopfield神經網路詳解,下面我們就開始看看吸引子有什麼性質: 1.吸引子的性質       &nb

深度學習 --- Hopfield神經網路

       前面幾節我們詳細探討了BP神經網路,基本上很全面深入的探討了BP,BP屬於前饋式型別,但是和BP同一時期的另外一個神經網路也很重要,那就是Hopfield神經網路,他是反饋式型別。這個網路比BP出現的還早一點,他的學習規則是基於灌輸式學習,即

深度學習 --- 隨機神經網路(玻爾茲曼機學習演算法、執行演算法)

BM網路的學習演算法 (1)  學習過程       通過有導師學習,BM網路可以對訓練集中各模式的概率分佈進行模擬,從而實現聯想記憶.學習的目的是通過調整網路權值使訓練集中的模式在網路狀態中以相同的概率再現.學習過程可分為兩個階段;第一階段

SCSI匯流排和協議以及SAN儲存網路

在講解SAN儲存網路之前,我想先在物理層面為大家講解一下乙太網網絡卡,FC-HBA卡(光纖網絡卡),iSCSi-HBA卡的區別。         乙太網卡:就是我們平常見到的電腦或伺服器上面的網絡卡,它傳輸的是IP協議,通過

Faster R-CNN網路的另一種優化思路:cascade R-CNN網路

論文:Cascade R-CNN: Delving into High Quality Object Detection 論文地址:https://arxiv.org/pdf/1712.00726.pdf Github專案地址:https://github.com/zhaoweicai/

Keras入門教程06——CapsNet膠囊神經網路及Keras實現

論文《Dynamic Routing Between Capsules》 參考了一篇部落格還有Keras官方的程式碼,結合程式碼給大家講解下膠囊神經網路。 1. 膠囊神經網路詳解 1.1 膠囊神經網路直觀理解 CNN存在的問題 影象分類中,一旦卷積核檢測到類

深度學習 --- 深度殘差網路ResNet

本來打算本節開始迴圈神經網路RNN,LSTM等,但是覺得還是應該把商用比較火的網路介紹一下,同時詳細介紹一下深度殘差網路,因為他是基於卷積的。而後面的迴圈神經網路更多偏向於序列問題,偏向語音識別,自然語言處理等的應用,而卷積神經網路更偏向於影象識別方面的應用,因此在本節就介紹幾種常用的神經網路,

深度學習 --- 深度卷積神經網路(AlexNet 網路

  本篇將解釋另外一個卷積神經網路,該網路是Hinton率領的谷歌團隊(Alex Krizhevsky,Ilya Sutskever,Geoffrey E. Hinton)在2010年的ImageNet大賽獲得冠軍的一個神經網路,因此本節主要參考的論文也是這次大賽的論文即“Imag

深度學習 --- 卷積神經網路CNN(LeNet-5網路

卷積神經網路(Convolutional Neural Network,CNN)是一種前饋型的神經網路,其在大型影象處理方面有出色的表現,目前已經被大範圍使用到影象分類、定位等領域中。相比於其他神經網路結構,卷積神經網路需要的引數相對較少,使的其能夠廣泛應用。 本節打算先介紹背景和簡單的基本

計算機網路--P2P對等網路(一)—BitTorrent協議

注:本篇文章內容借鑑自:淺入淺出BitTorrent協議,其中加入了博主的部分原創,感謝,侵刪~ 對等網路的概念 以下定義主要摘抄自維基百科與中科院計算技術研究所: 對等式網路(peer-to-peer,簡稱P2P),又稱點對點技術,是無中心伺服器、

Kubernetes的Configmap

ConfigMap是用來儲存配置檔案的kubernetes資源物件,所有的配置內容都儲存在etcd中。 1.建立ConfigMap 建立ConfigMap的方式有4種: 通過直接在命令列中指定configmap引數建立,即--from-literal

計算機網路--CDN

注:本文內容摘抄自CDN詳解 — 不挑食的程式設計師,博主在其基礎上進行了少量修改並加入了部分原創,感謝,侵刪~ 之前我們已經學習過快取機制以及Web代理,但對於大型網站的構建,這些還遠遠不夠。要想真正的構建一個流行的網站,內容分發網路(Content Del

CNN(卷積神經網路)

Why CNN 首先回答這樣一個問題,為什麼我們要學CNN,或者說CNN為什麼在很多領域收穫成功?還是先拿MNIST來當例子說。MNIST資料結構不清楚的話自行百度。。 我自己實驗用兩個hidden layer的DNN(全連線深度神經網路)在MNIST上也能

雙向長短時記憶迴圈神經網路(Bi-directional LSTM RNN)

1. Recurrent Neural Network (RNN) 儘管從多層感知器(MLP)到迴圈神經網路(RNN)的擴充套件看起來微不足道,但是這對於序列的學習具有深遠的意義。迴圈神經網路(RNN)的使用是用來處理序列資料的。在傳統的神經網路中模型中,層與

資深實踐篇 |基於Kubernetes 1.61的Kubernetes Scheduler排程

資深實踐篇 |基於Kubernetes 1.61的Kubernetes Scheduler排程詳解 關鍵字標籤:騰訊雲,效能優化,Github 說明:該文轉載自騰訊雲技術社群騰雲閣,已徵求作者本人同意。 原始碼為 k8s v1.6.1 版本,github 上對應的 com

SENet(Squeeze-and-Excitation Networks)網路

      論文:《Squeeze-and-Excitation Networks》一、SENet概述    Squeeze-and-Excitation Networks(簡稱 SENet)是 Momenta 胡杰團隊(WMW)提出的新的網路結構,利用SENet,一舉取得最

kubernetes容器啟動

如果大家對kubernetes元件以及架構相關分析,可以看我之前的原始碼閱讀,今天只從一個函式分析容器的啟動過程,這個函式就是SyncPod,這個是建立kubelet裡面最核心的一個函數了。這個方法分為五步: // 1. Compute sandbox