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关掉。
  3. 参考:
    https://docs.docker.com/v1.6/installation/centos/#installing-docker-centos-7
    https://github.com/moby/moby/issues/16137

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>从容器内访问外部

参考: https://docs.docker.com/v17.09/engine/userguide/networking/default_network/container-communication/#communicating-to-the-outside-world

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. 建议方案二
  2. kubernetes官网建议和k8s结合的时候docker的启动参数设置--iptables=false使得docker不再操作iptables,完全由kube-proxy来操作iptables。
  3. 参考:
    <1>https://docs.docker.com/v17.09/engine/userguide/networking/default_network/container-communication/#container-communication-between-hosts
    <2>https://github.com/kubernetes/kubernetes/issues/40182
    <3>https://kubernetes.io/docs/setup/scratch/#docker
    <4>https://github.com/moby/moby/pull/28257

1.5 禁用swap

1.禁掉所有的swap分区

$ sudo swapoff -a

2.同时还需要修改/etc/fstab文件,注释掉 SWAP 的自动挂载,防止机子重启后swap启用。

备注:

  1. Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动,虽然可以通过kubelet的启动参数--fail-swap-on=false更改这个限制,但不建议,最好还是不要开启swap。
  2. 一些为什么要关闭swap的讨论:
    <1>https://github.com/kubernetes/kubernetes/issues/7294
    <2>https://github.com/kubernetes/kubernetes/issues/53533

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可以正常工作。
  3. 参考:
    <1>https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#network-plugin-requirements
    <2>https://kubernetes.io/docs/setup/independent/install-kubeadm/

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

安装18.06.1版:

$ sudo yum install -y --setopt=obsoletes=0 \
        docker-ce-18.06.1.ce-3.el7 \
        docker-ce-selinux-18.06.1.ce-3.el7

5.启动并设置开机自启动docker

$ sudo systemctl enable docker && sudo systemctl start docker

6.将当前登录用户加入docker用户组中

$ sudo usermod -aG docker $(whoami)

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

备注:

  1. 至于上面yum安装18.06.1版docker的时候为什么要加--setopt=obsoletes=0参数,请见:https://github.com/moby/moby/issues/33930中andrewhsu的回答
  2. 未联网的机器也可以事先下载好指定版本rpm包进行安装(下载地址:https://download.docker.com/linux/centos/7/x86_64/stable/Packages)
  3. docker部署参考:https://docs.docker.com/install/linux/docker-ce/centos

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

备注:

  1. docker的所有启动参数可见:https://docs.docker.com/engine/reference/commandline/dockerd/
  2. 将xxxxxxxx替换成阿里云为你生成的镜像代理仓库前缀

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

参考: https://kubernetes.io/docs/setup/independent/install-kubeadm/

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如下:

apiVersion: 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: 0.0.0.0
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
address: 0.0.0.0

配置文件写法参考:
https://unofficial-kubernetes.readthedocs.io/en/latest/admin/kubeadm/
http://pwittrock.github.io/docs/admin/kubeadm/

4.创建集群

sudo kubeadm 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=    
$ sudo systemctl daemon-reload
$ sudo systemctl restart kubelet

参考:https://kubernetes.io/docs/setup/independent/install-kubeadm/#configure-cgroup-driver-used-by-kubelet-on-master-node

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

备注:

  1. 假如之后想改回默认禁止master部署pod:kubectl taint nodes k8s node-role.kubernetes.io/master=true:NoSchedule
  2. 本部分参考:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/

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

备注:

  1. calico从v3.0开始默认使用的是etcd v3 API,v2的API不再支持
  2. 部署参考:https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/calico

方案二 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

2.到release页面下载二进制文件

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

添加了如下插件:

[docker@k8s ]$ 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

可以参考这个issue:https://github.com/coreos/flannel/issues/1044

3.镜像下载
下载yaml文件中所需镜像。quay.io镜像被墙下不了可以从这里下载:https://hub.docker.com/r/jmgao1983/flannel/tags/ , 之后再打回原tag。

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

注意:默认token的有效期为24小时,当过期之后,该token就不可用了。此时可以重新生成token:

kubeadm token generate
kubeadm token create  --print-join-command --ttl=0

设置–ttl=0代表永不过期


更多精彩内容,请订阅本人微信公众号:K8SPractice
CentOS-7使用kubeadm安装Kubernetes-1.12.0(how & why)_第1张图片


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

支付宝:                                                      微信:
CentOS-7使用kubeadm安装Kubernetes-1.12.0(how & why)_第2张图片                       CentOS-7使用kubeadm安装Kubernetes-1.12.0(how & why)_第3张图片

你可能感兴趣的:(kubernetes)