1. 程式人生 > >CentOS-7使用kubeadm安裝Kubernetes-1.12.0(how & why)

CentOS-7使用kubeadm安裝Kubernetes-1.12.0(how & why)

前言

安裝部署看似基礎,但其中蘊含許多值得深挖的原理。本篇文章不同於一般的部署文章的區別是,除了闡述基本的安裝部署過程,還詳細備註了每一步為何要如此配置,希望能讓讀者知其然更知其所以然。

1. 準備工作

1.1 環境資訊

作業系統:CentOS-7.5.1804
核心:4.4.123-1.el7

1.2 關閉防火牆

$ sudo systemctl stop firewalld.service       #停止firewall
$ sudo systemctl disable firewalld.service    #禁止firewall開機啟動
$ sudo firewall-cmd --state                   #檢視防火牆狀態

備註:

  1. firewall的底層是使用iptables進行資料過濾,建立在iptables之上,這可能會與 Docker 產生衝突。比如,當 firewalld 啟動或者重啟的時候,將會從 iptables 中移除 DOCKER 的規則鏈,從而影響了 Docker 的正常工作(注意firewalld和docker的啟動順序可以規避這些問題,比如,保證firewalld在docker之前啟動。但是如果你在 docker啟動之後再啟動或者重啟firewalld,就需要再重啟docker程序)
  2. 為避免不必要的麻煩,這裡把firewalld關掉。

1.3 禁用SELINUX

臨時禁用(重啟後失效)

$ sudo setenforce 0                 #0代表permissive 1代表enforcing

永久禁用

$ sudo vi /etc/selinux/config
SELINUX=permissive                            

備註:

  1. kubelet目前對selinux的支援還不好,需要禁用掉。
  2. 不禁用selinux的話有時還會出現明明容器裡是root身份執行,操作掛載進來的主機資料夾時沒有許可權的情況,這時候要麼配置selinux的許可權,要麼就禁掉selinux
  3. 另外,當docker的storage-driver使用overlay2的時候,低版本核心的selinux不支援overlay2檔案驅動,docker啟動時設定為--selinux-enabled
    會失敗報錯:“Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel”,需設定--selinux-enabled=false

1.4 開啟資料包轉發

1.4.1 核心開啟ipv4轉發

1.修改/etc/sysctl.conf,開啟ipv4轉發:

$ sudo vim /etc/sysctl.conf
net.ipv4.ip_forward = 1             #開啟ipv4轉發,允許內建路由

2.寫入後執行如下命令生效:

$ sudo sysctl -p

備註:

  1. 什麼是ipv4轉發:出於安全考慮,Linux系統預設是禁止資料包轉發的。轉發即當主機擁有多於一塊的網絡卡時,其中一塊收到資料包,根據資料包的目的ip地址將資料包發往本機另一塊網絡卡,該網絡卡根據路由表繼續傳送資料包。這通常是路由器所要實現的功能。
  2. kube-proxy的ipvs模式和calico(都涉及路由轉發)都需要主機開啟ipv4轉發。
  3. 另外,不使用k8s,即使只使用docker的時候,以下兩種情況也依賴ipv4轉發:
    <1>當同一主機上的兩個跨bridge(跨bridge相當於跨網段,跨網路需要路由)的容器互訪
    <2>從容器內訪問外部

1.4.2 防火牆修改FORWARD鏈預設策略

資料包經過路由後,假如不是發往本機的流量,下一步會走iptables的FORWARD鏈,而docker從1.13版本開始,將FORWARD鏈的預設策略設定為DROP,會導致出現一些例如跨主機的兩個pod使用podIP互訪失敗等問題。解決方案有2個:

  • 在所有節點上開機啟動時執行iptables -P FORWARD ACCEPT
  • 讓docker不操作iptables

方案一

臨時生效:

$ sudo iptables -P FORWARD ACCEPT

iptables的配置重啟後會丟失,可以將配置寫進/etc/rc.local中,重啟後自動執行:

/usr/sbin/iptables -P FORWARD ACCEPT

方案二

設定docker啟動引數新增--iptables=false選項,使docker不再操作iptables,比如1.10版以上可編輯docker daemon預設配置檔案/etc/docker/daemon.json:

{
    "iptables": false
}

備註:

1.5 禁用swap

1.禁掉所有的swap分割槽

$ sudo swapoff -a

2.同時還需要修改/etc/fstab檔案,註釋掉 SWAP 的自動掛載,防止機子重啟後swap啟用。

備註:

1.6 配置iptables引數,使得流經網橋的流量也經過iptables/netfilter防火牆

$ sudo tee /etc/sysctl.d/k8s.conf <<-'EOF'
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

$ sudo sysctl --system

備註:

  1. 網路外掛需要為kube-proxy提供一些特定的支援,比如kube-proxy的iptables模式基於iptables,網路外掛就需要確保容器的流量可以流過iptables。比如一些網路外掛會用到網橋,而網橋工作在資料鏈路層,iptables/netfilter防火牆工作在網路層,以上配置則可以使得通過網橋的流量也進入iptables/netfilter防火牆中,確保iptables模式的kube-proxy可以正常工作。
  2. 預設沒有指定kubelet網路外掛的情況下,會使用noop外掛,它也會設定net/bridge/bridge-nf-call-iptables=1來確保iptables模式的kube-proxy可以正常工作。

2. 安裝docker

2.1 安裝docker-17.03.1

1.解除安裝舊docker

$ sudo yum -y remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine \
                  docker-ce \
                  docker-ce-selinux  
                                 
 $ sudo rm -rf /var/lib/docker /etc/systemd/system/docker.service.d

2.安裝依賴

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

備註:

device-mapper-persistent-data和lvm2是Docker CE的devicemapper儲存驅動程式需要的依賴包

3.設定docker映象源

$ sudo yum-config-manager --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo

國內訪問download.docker.com不穩定的話可以使用阿里雲映象源

 $ sudo yum-config-manager --add-repo \
        https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.安裝指定版本docker-ce
檢視源中都有哪些版本:

$ yum list docker-ce --showduplicates
 可安裝的軟體包
docker-ce.x86_64                  17.03.0.ce-1.el7.centos                   docker-ce-stable
docker-ce.x86_64                  17.03.1.ce-1.el7.centos                   docker-ce-stable
docker-ce.x86_64                  17.03.2.ce-1.el7.centos                   docker-ce-stable
docker-ce.x86_64                  17.03.3.ce-1.el7                          docker-ce-stable
docker-ce.x86_64                  17.06.0.ce-1.el7.centos                   docker-ce-stable
docker-ce.x86_64                  17.06.1.ce-1.el7.centos                   docker-ce-stable
docker-ce.x86_64                  17.06.2.ce-1.el7.centos                   docker-ce-stable
docker-ce.x86_64                  17.09.0.ce-1.el7.centos                   docker-ce-stable
docker-ce.x86_64                  17.09.1.ce-1.el7.centos                   docker-ce-stable
docker-ce.x86_64                  17.12.0.ce-1.el7.centos                   docker-ce-stable
docker-ce.x86_64                  17.12.1.ce-1.el7.centos                   docker-ce-stable
docker-ce.x86_64                  18.03.0.ce-1.el7.centos                   docker-ce-stable
docker-ce.x86_64                  18.03.1.ce-1.el7.centos                   docker-ce-stable
docker-ce.x86_64                  18.06.0.ce-3.el7                          docker-ce-stable
docker-ce.x86_64                  18.06.1.ce-3.el7                          docker-ce-stable

安裝17.03.1版:

$ sudo yum install -y --setopt=obsoletes=0 \
        docker-ce-17.03.1.ce-1.el7.centos \
        docker-ce-selinux-17.03.1.ce-1.el7.centos

5.啟動並設定開機自啟動docker

$ sudo systemctl enable docker && sudo systemctl start docker

6.將當前登入使用者加入docker使用者組中

$ sudo usermod -aG docker $(whoami)

然後退出,重新登入,使用docker命令就不用加sudo了。

備註:

2.2 docker啟動引數配置

為docker做如下配置:

  • 設定阿里雲映象庫加速dockerhub的映象。國內訪問dockerhub不穩定,將對dockerhub的映象拉取代理到阿里雲映象庫
  • 配上1.3.2的禁用iptables的設定
  • 如果想讓podIP可路由的話,設定docker不再對podIP做MASQUERADE,否則docker會將podIP這個源地址SNAT成nodeIP
  • 設定docker儲存驅動為overlay2(需要linux kernel版本在4.0以上,docker版本大於1.12)
  • 根據業務規劃修改容器例項儲存根路徑(預設路徑是/var/lib/docker)

最終配置如下:

$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
 "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"],
 "iptables": false,
 "ip-masq": false,
 "storage-driver": "overlay2",
 "graph": "/app/dcos/docker"
}
EOF

$ sudo systemctl restart docker

備註:

2.3 為docker設定http代理

假如機器在內網環境無法直接訪問外網的話,還需要為docker設定一個http_proxy。

$ sudo mkdir /etc/systemd/system/docker.service.d

$ sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<-'EOF'
[Service]
Environment="HTTP_PROXY=http://xxx.xxx.xxx.xxx:xxxx"
Environment="NO_PROXY=localhost,127.0.0.0/8"
EOF

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

3. 安裝kubeadm、kubelet、kubectl

3.1 yum安裝

3.1.1 建立kubernetes的repo

建立kubernetes的repo檔案:

$ sudo tee /etc/yum.repos.d/kubernetes.repo <<-'EOF'
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

google地址被牆的情況下可以使用阿里雲或者中科大的映象站:

$ sudo tee /etc/yum.repos.d/kubernetes.repo <<-'EOF'
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
EOF

3.1.2 安裝kubeadm、kubelet、kubectl

1.檢視可用軟體版本:

$ yum list kubelet --showduplicates
可安裝的軟體包
kubelet.x86_64              1.5.4-0             kubernetes
kubelet.x86_64              1.5.4-1             kubernetes
kubelet.x86_64              1.6.0-0             kubernetes
kubelet.x86_64              1.6.0-1             kubernetes
......
kubelet.x86_64              1.11.0-0            kubernetes
kubelet.x86_64              1.11.1-0            kubernetes
kubelet.x86_64              1.11.2-0            kubernetes
kubelet.x86_64              1.11.3-0            kubernetes
kubelet.x86_64              1.12.0-0            kubernetes

2.安裝指定版本:

$ sudo yum install -y kubelet-1.12.0 kubeadm-1.12.0 kubectl-1.12.0 --disableexcludes=kubernetes
總計                                       5.5 MB/s |  43 MB  00:07
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安裝    : kubelet-1.12.0-0.x86_64                         1/4
  正在安裝    : kubernetes-cni-0.6.0-0.x86_64                   2/4
  正在安裝    : kubectl-1.12.0-0.x86_64                         3/4
  正在安裝    : kubeadm-1.12.0-0.x86_64                         4/4
  驗證中      : kubeadm-1.12.0-0.x86_64                         1/4
  驗證中      : kubernetes-cni-0.6.0-0.x86_64                   2/4
  驗證中      : kubelet-1.12.0-0.x86_64                         3/4
  驗證中      : kubectl-1.12.0-0.x86_64                         4/4
已安裝:
  kubeadm.x86_64 0:1.12.0-0    kubectl.x86_64 0:1.12.0-0    kubelet.x86_64 0:1.12.0-0
作為依賴被安裝:
  kubernetes-cni.x86_64 0:0.6.0-0

3.設定開機自啟動並執行kubelet:

sudo systemctl enable kubelet && sudo systemctl start kubelet

備註:

  1. 此時kubelet的服務執行狀態是異常的(因為缺少主配置檔案kubelet.conf等,可以暫不處理,因為在完成Master節點的初始化後才會生成這個配置檔案)
  2. 假如機器在內網安裝,無法通過yum下載軟體包的話,可以通過提前獲取rpm包離線安裝。如在聯網的一臺機器上通過--downloadonly下載rpm包:
    sudo yum install --disablerepo=updates --downloadonly --downloaddir=/home/docker/rpm kubelet-1.12.0 kubeadm-1.12.0 kubectl-1.12.0

4. Kubernetes叢集安裝

4.1 master節點部署

4.1.1 提前下載所需映象

看一下kubernetes v1.12.0需要哪些映象:

$ kubeadm config images list --kubernetes-version=v1.12.0

k8s.gcr.io/kube-apiserver:v1.12.0
k8s.gcr.io/kube-controller-manager:v1.12.0
k8s.gcr.io/kube-scheduler:v1.12.0
k8s.gcr.io/kube-proxy:v1.12.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.2

1.由於gcr.io被牆,從anjia0532映象地址下載:

docker pull anjia0532/google-containers.kube-apiserver:v1.12.0
docker pull anjia0532/google-containers.kube-controller-manager:v1.12.0
docker pull anjia0532/google-containers.kube-scheduler:v1.12.0
docker pull anjia0532/google-containers.kube-proxy:v1.12.0
docker pull anjia0532/google-containers.pause:3.1
docker pull anjia0532/google-containers.etcd:3.2.24
docker pull anjia0532/google-containers.coredns:1.2.2

2.重新打回k8s.gcr.io的映象tag:

docker tag anjia0532/google-containers.kube-apiserver:v1.12.0 k8s.gcr.io/kube-apiserver:v1.12.0
docker tag anjia0532/google-containers.kube-controller-manager:v1.12.0 k8s.gcr.io/kube-controller-manager:v1.12.0
docker tag anjia0532/google-containers.kube-scheduler:v1.12.0 k8s.gcr.io/kube-scheduler:v1.12.0
docker tag anjia0532/google-containers.kube-proxy:v1.12.0 k8s.gcr.io/kube-proxy:v1.12.0
docker tag anjia0532/google-containers.pause:3.1 k8s.gcr.io/pause:3.1
docker tag anjia0532/google-containers.etcd:3.2.24 k8s.gcr.io/etcd:3.2.24
docker tag anjia0532/google-containers.coredns:1.2.2 k8s.gcr.io/coredns:1.2.2

以上兩步也可以直接通過以下指令碼image-process.sh完成:

#!/bin/bash
images=(kube-proxy:v1.12.0 kube-scheduler:v1.12.0 kube-controller-manager:v1.12.0 kube-apiserver:v1.12.0 etcd:3.2.24 pause:3.1 coredns:1.2.2)
for imageName in ${images[@]} ; do
  docker pull anjia0532/google-containers.$imageName
  docker tag anjia0532/google-containers.$imageName k8s.gcr.io/$imageName
  docker rmi anjia0532/google-containers.$imageName
done

4.1.2 kubeadm init初始化叢集

方式一:使用命令列初始化

sudo kubeadm init --apiserver-advertise-address=10.142.232.155 --pod-network-cidr=192.168.0.0/16 --service-cidr=10.233.0.0/16 --kubernetes-version=v1.12.0

方式二:使用配置檔案初始化

更多的個性化配置可以使用配置檔案。使用配置檔案的好處是可以固化啟動配置,使得啟動引數有跡可循。目前使用配置檔案初始化的方式只是實驗性的。

配置檔案kubeadm.yaml如下:

piVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
api:
  advertiseAddress: 10.142.232.155
  bindPort: 8443
controllerManagerExtraArgs:
  bind-address: 10.142.232.155
  address: 10.142.232.155
schedulerExtraArgs:
  address: 10.142.232.155
kubernetesVersion: v1.12.0
networking:
  podSubnet: 192.168.0.0/16
  serviceSubnet: 10.233.0.0/16
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
metricsBindAddress: 10.142.232.155
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
address: 10.142.232.155

4.建立叢集

sudo kubectl init --config kubeadm.yaml

####部署成功會輸出如下內容:

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 10.142.232.155:6443 --token 3c0mp2.ls0pso8cmdyf60z7 --discovery-token-ca-cert-hash sha256:cfdb1c1c0c902885c805bf3f7b98d7e25ef4f6cd2fed15099cd6fbf4d6fa937b

記下其中的token,加入node節點時會用到。

備註:

  1. 確保沒有設定http_proxy和https_proxy代理,kubeadm init過程首先會檢查代理伺服器,確定跟kube-apiserver等的 http/https 連線方式,如果有代理設定可能會有問題導致不能訪問自身和內網。 需要在/etc/profile中增加kubeadm init指定的apiserver-advertise-addresspod-network-cidrservice-cidr三個地址段到no_proxy裡後重試:export no_proxy=10.142.232.155,192.168.0.0/16,10.233.0.0/16
  2. 叢集初始化如果遇到問題,可以使用下面的命令進行清理再重新初始化:
    sudo kubeadm reset

4.1.3 檢查kubelet使用的cgroup driver

kubelet啟動時指定的cgroup driver需要和docker所使用的保持一致。

1.檢視 Docker 使用的 cgroup driver:

$ docker info | grep -i cgroup
-> Cgroup Driver: cgroupfs

可以看出docker 17.03預設使用的Cgroup Driver為cgroupfs。

2.檢視kubelet指定的cgroup driver

Kubernetes文件中kubelet的啟動引數--cgroup-driver string Driver that the kubelet uses to manipulate cgroups on the host. Possible values: 'cgroupfs', 'systemd' (default "cgroupfs")。預設值為cgroupfs。yum安裝kubelet、kubeadm時生成10-kubeadm.conf檔案中可能將這個引數值改成了systemd。

檢視kubelet的配置檔案(1.12.0版本的封裝在/var/lib/kubelet/kubeadm-flags.env檔案中),如果是預設的cgroupfs,不需要修改。否則需要修改/etc/default/kubelet(或者/var/lib/kubelet/kubeadm-flags.env)檔案:

$ sudo vim /etc/default/kubelet
    KUBELET_KUBEADM_EXTRA_ARGS=--cgroup-driver=<value>    
$ sudo systemctl daemon-reload
$ sudo systemctl restart kubelet

4.1.4 建立kubectl使用的kubeconfig檔案

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

建立完成即可使用kubectl操作叢集。

4.1.5 設定master參與工作負載

使用kubeadm初始化的叢集,將master節點做了taint(汙點),使得預設情況下(不設定容忍)Pod不會被排程到master上。這裡搭建的是測試環境可以使用下面的命令去掉master的taint,使master參與工作負載:

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

備註:

4.2 網路部署

可以選擇不同的網路外掛,本文介紹calico和flannel。注意,同時只能使用一種網路外掛。

4.2.1 calico部署

calico的資料儲存可以有兩種方式:

  • calico直接與etcd進行互動,使用etcd作為datastore的方式
  • calico和其他k8s元件一樣通過kube-apiserver與etcd進行互動,將資料儲存在etcd中(通過CRD實現)

方案一 etcd as datastore

1.到release頁面獲取安裝包,這裡用的是v3.2.3版本

wget https://github.com/projectcalico/calico/releases/download/v3.2.3/release-v3.2.3.tgz

2.解壓後load release-v3.2.3/images下的映象

calico-cni.tar
alico-kube-controllers.tar
calico-node.tar
calico-typha.tar

load後發現映象都是calico/為字首,而yaml檔案裡配置的映象字首是quay.io/calico/,所以需要重新打一下tag或改一下yaml裡的字首。

3.建立rbac

kubectl apply -f release-v3.2.3/k8s-manifests/rbac.yaml

4.建立calico相關pod

修改release-v3.2.3/k8s-manifests/hosted/calico.yaml

##############################
  #配置etcd地址
  etcd_endpoints: "https://localhost:2379"
############################## 
  #配置etcd相關證書和key 
  etcd_ca: "/calico-secrets/ca.crt"   # "/calico-secrets/etcd-ca"
  etcd_cert: "/calico-secrets/server.crt" # "/calico-secrets/etcd-cert"
  etcd_key: "/calico-secrets/server.key"  # "/calico-secrets/etcd-key"
##############################
          #配置etcd的相關證書和key在主機上的位置
          "etcd_key_file": "/etc/kubernetes/pki/etcd/server.key",
          "etcd_cert_file": "/etc/kubernetes/pki/etcd/server.crt",
          "etcd_ca_cert_file": "/etc/kubernetes/pki/etcd/ca.crt",
##############################
            #配置叢集內pod的地址範圍,要和kubeadm啟動時指定的一致
            - name: CALICO_IPV4POOL_CIDR
              value: "192.168.0.0/16"
##############################
        #配置calico-node使用主機上kubeadm生成的etcd相關證書和key
        - name: etcd-certs
          hostPath:
            path: /etc/kubernetes/pki/etcd
#          secret:
#            secretName: calico-etcd-secrets
#            defaultMode: 0400
##############################
        #配置calico-kube-controllers使用主機上kubeadm生成的etcd相關證書和key
        - name: etcd-certs
          hostPath:
            path: /etc/kubernetes/pki/etcd
#          secret:
#            secretName: calico-etcd-secrets
#            defaultMode: 0400

5.為calico-node建立clusterrolebinding

kubectl create clusterrolebinding kube-system-default-role-binding --clusterrole=cluster-admin --serviceaccount=kube-system:calico-node

6.啟動

kubectl apply -f release-v3.2.3/k8s-manifests/hosted/calico.yaml

啟動了兩類pod:

  • 名為calico-kube-controllers的Deployment
  • 名為calico-node的Daemonset

備註:

方案二 Kubernetes API datastore

1.建立rbac

kubectl apply -f release-v3.2.3/k8s-manifests/hosted/rbac-kdd.yaml

2.建立calico相關pod

kubectl apply -f release-v3.2.3/k8s-manifests/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml

4.2.2 flannel網路部署

calico部署會同時部署cni外掛以及calico元件兩部分,而flannel的部署只會初始化一些cni的配置檔案,並不會部署cni的可執行檔案,需要手動部署,所以flannel部署分為兩步:

  • CNI外掛部署
  • flannel組價部署

步驟一.CNI外掛部署(所有節點)

1.建立cni外掛目錄

sudo mkdir -p /opt/cni/bin 
cd /opt/cni/bin
wget https://github.com/containernetworking/plugins/releases/download/v0.7.1/cni-plugins-amd64-v0.7.1.tgz

3.在/opt/cni/bin目錄下解壓即安裝好

sudo tar -zxvf cni-plugins-amd64-v0.7.1.tgz

添加了如下外掛:

[[email protected] ]$ ll /opt/cni/bin
總用量 65716
-rwxr-xr-x 1 root   root    4028260 4月  12 17:21 bridge
-rwxr-xr-x 1 root   root   10232415 4月  12 17:22 dhcp
-rwxr-xr-x 1 root   root    2856252 4月  12 17:21 flannel
-rwxr-xr-x 1 root   root    3127363 4月  12 17:21 host-device
-rwxr-xr-x 1 root   root    3036768 4月  12 17:22 host-local
-rwxr-xr-x 1 root   root    3572685 4月  12 17:21 ipvlan
-rwxr-xr-x 1 root   root    3084347 4月  12 17:21 loopback
-rwxr-xr-x 1 root   root    3613497 4月  12 17:21 macvlan
-rwxr-xr-x 1 root   root    3550877 4月  12 17:21 portmap
-rwxr-xr-x 1 root   root    3993428 4月  12 17:21 ptp
-rwxr-xr-x 1 root   root    2641877 4月  12 17:22 sample
-rwxr-xr-x 1 root   root    2850029 4月  12 17:21 tuning
-rwxr-xr-x 1 root   root    3568537 4月  12 17:21 vlan

步驟二.flannel部署

1.獲取yaml檔案

$ wget https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml

2.修改配置檔案
<1>修改其中net-conf.json中的Network引數使其與kubeadm init時指定的--pod-network-cidr保持一致。
<2>這裡v0.10.0版有一個bug,需要為啟動flannel的daemonset新增toleration,以允許在尚未Ready的節點上部署flannel pod:

      tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      #新增下面這個toleration
      - key: node.kubernetes.io/not-ready
        operator: Exists
        effect: NoSchedule

4.部署

kubectl apply -f kube-flannel.yml

部署好後集群可以正常運行了。

備註:

假如網路部署失敗或出問題需要重新部署,執行以下內容清除生成的網路介面:
sudo ifconfig cni0 down
sudo ip link delete cni0
sudo ifconfig flannel.1 down
sudo ip link delete flannel.1
sudo rm -rf /var/lib/cni/

4.3 slave節點部署

同樣按照上述步驟安裝好docker、kubelet,並將master節點上的/etc/kubernetes/pki/etcd拷貝到slave相同位置,用於calico-node連線etcd使用,然後在slave節點上執行以下命令即可加入叢集:

sudo kubeadm join 10.142.232.155:6443 --token dgq17e.lxmpeqtdv49km4lx --discovery-token-ca-cert-hash sha256:c5ece844732920a5673388df14011dcd58c7420ac782d7c86ef89074fc77e129

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

如果覺得我的文章對您有用,請隨意打賞。您的支援將鼓勵我繼續創作!

支付寶:                                                      微信:
這裡寫圖片描述                       這裡寫圖片描述