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 #檢視防火牆狀態
備註:
- firewall的底層是使用iptables進行資料過濾,建立在iptables之上,這可能會與 Docker 產生衝突。比如,當 firewalld 啟動或者重啟的時候,將會從 iptables 中移除 DOCKER 的規則鏈,從而影響了 Docker 的正常工作(注意firewalld和docker的啟動順序可以規避這些問題,比如,保證firewalld在docker之前啟動。但是如果你在 docker啟動之後再啟動或者重啟firewalld,就需要再重啟docker程序)
- 為避免不必要的麻煩,這裡把firewalld關掉。
1.3 禁用SELINUX
臨時禁用(重啟後失效)
$ sudo setenforce 0 #0代表permissive 1代表enforcing
永久禁用
$ sudo vi /etc/selinux/config
SELINUX=permissive
備註:
- kubelet目前對selinux的支援還不好,需要禁用掉。
- 不禁用selinux的話有時還會出現明明容器裡是root身份執行,操作掛載進來的主機資料夾時沒有許可權的情況,這時候要麼配置selinux的許可權,要麼就禁掉selinux
- 另外,當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
備註:
- 什麼是ipv4轉發:出於安全考慮,Linux系統預設是禁止資料包轉發的。轉發即當主機擁有多於一塊的網絡卡時,其中一塊收到資料包,根據資料包的目的ip地址將資料包發往本機另一塊網絡卡,該網絡卡根據路由表繼續傳送資料包。這通常是路由器所要實現的功能。
- kube-proxy的ipvs模式和calico(都涉及路由轉發)都需要主機開啟ipv4轉發。
- 另外,不使用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
備註:
- 網路外掛需要為kube-proxy提供一些特定的支援,比如kube-proxy的iptables模式基於iptables,網路外掛就需要確保容器的流量可以流過iptables。比如一些網路外掛會用到網橋,而網橋工作在資料鏈路層,
iptables/netfilter
防火牆工作在網路層,以上配置則可以使得通過網橋的流量也進入iptables/netfilter防火牆中,確保iptables模式的kube-proxy可以正常工作。- 預設沒有指定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
備註:
- 此時kubelet的服務執行狀態是異常的(因為缺少主配置檔案kubelet.conf等,可以暫不處理,因為在完成Master節點的初始化後才會生成這個配置檔案)
- 假如機器在內網安裝,無法通過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節點時會用到。
備註:
- 確保沒有設定http_proxy和https_proxy代理,kubeadm init過程首先會檢查代理伺服器,確定跟
kube-apiserver
等的 http/https 連線方式,如果有代理設定可能會有問題導致不能訪問自身和內網。 需要在/etc/profile中增加kubeadm init指定的apiserver-advertise-address
、pod-network-cidr
、service-cidr
三個地址段到no_proxy裡後重試:export no_proxy=10.142.232.155,192.168.0.0/16,10.233.0.0/16
- 叢集初始化如果遇到問題,可以使用下面的命令進行清理再重新初始化:
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
如果覺得我的文章對您有用,請隨意打賞。您的支援將鼓勵我繼續創作!
支付寶: 微信: