Ubuntu-18.04使用kubeadm安装kubernetes-1.12.0
1. 准备工作
node结点只需执行1,2,3操作,master结点需要执行1,2,3,4操作
1.1 环境信息
操作系统:Ubuntu 18.04.1 LTS
内核:4.15.0-36-generic
1.2 关闭防火墙
关闭ufw防火墙,Ubuntu默认未启用,无需设置。
$ sudo ufw disable
备注:
ufw的底层是使用iptables进行数据过滤,建立在iptables之上,这可能会与 Docker 产生冲突。
为避免不必要的麻烦,这里把firewalld关掉。
1.3 禁用SELINUX
ubuntu默认不安装selinux,假如安装了的话,按如下步骤禁用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 }
备注:
建议方案二
kubernetes官网建议和k8s结合的时候docker的启动参数设置--iptables=false使得docker不再操作iptables,完全由kube-proxy来操作iptables。
参考:
<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启用。
备注:
Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动,虽然可以通过kubelet的启动参数
--fail-swap-on=false更改这个限制,但不建议,最好还是不要开启swap。
一些为什么要关闭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
备注:
网络插件需要为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可以正常工作。
参考:
<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-18.03.1
1.卸载旧docker
$ sudo apt-get remove docker docker-engine docker.io
2.安装依赖,使得apt可以使用https
sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
3.添加docker的GPG key:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
国内访问download.docker.com不稳定的话可以使用阿里云的
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
4.设置docker镜像源
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
国内访问download.docker.com不稳定的话可以使用阿里云镜像源
$ sudo add-apt-repository \ "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \ $(lsb_release -cs) \ stable"
5.安装指定版本docker-ce
查看源中都有哪些版本:
$ apt-cache madison docker-ce docker-ce | 18.06.1~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages docker-ce | 18.06.0~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages docker-ce | 18.03.1~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
安装18.03.1版:
$ sudo apt-get install -y docker-ce=18.03.1~ce~3-0~ubuntu
6.启动并设置开机自启动docker
$ sudo systemctl enable docker && sudo systemctl start docker
7.将当前登录用户加入docker用户组中
$ sudo usermod -aG docker <you username>
然后退出,重新登录,使用docker命令就不用加sudo了。
备注:
docker部署参考:https://docs.docker.com/install/linux/docker-ce/ubuntu
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": "/home/lk/docker" } EOF $ sudo systemctl restart docker
备注:
docker的所有启动参数可见:https://docs.docker.com/engine/reference/commandline/dockerd/
将xxxxxxxx替换成阿里云为你生成的镜像代理仓库前缀
阿里云地址:https://cr.console.aliyun.com/cn-hangzhou/mirrors?accounttraceid=7a15d868-f97f-4068-ba64-7628c1146bd6
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 apt安装
3.1.1 创建kubernetes的repo
创建kubernetes的source文件:
sudo apt-get update && sudo apt-get install -y apt-transport-https curl sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF' deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main EOF sudo apt-get update
google地址被墙的情况下可以使用阿里云或者中科大的镜像站:
sudo apt-get update && sudo apt-get install -y apt-transport-https curl sudo curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add - sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF' deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main EOF sudo apt-get update
备注:
虽然我的ubuntu版本是18.04.1(bionic),但k8s的apt包目前还没支持到这么高,使用xenial。
3.1.2 安装kubeadm、kubelet、kubectl
1.查看可用软件版本:
$ apt-cache madison kubeadm kubeadm | 1.12.1-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages kubeadm | 1.12.0-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages kubeadm | 1.11.3-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages ......
2.安装指定版本:
$ sudo apt-get install -y kubelet=1.12.0-00 kubeadm=1.12.0-00 kubectl=1.12.0-00 $ sudo apt-mark hold kubelet=1.12.0-00 kubeadm=1.12.0-00 kubectl=1.12.0-00
3.设置开机自启动并运行kubelet:
sudo systemctl enable kubelet && sudo systemctl start kubelet
备注:
此时kubelet的服务运行状态是异常的(因为缺少主配置文件kubelet.conf等,可以暂不处理,因为在完成Master节点的初始化后才会生成这个配置文件)
本章节参考: 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初始化集群
方式一:使用命令行初始化
使用kubeadm.yaml配置文件初始化master节点。
sudo kubeadm init --apiserver-advertise-address=192.168.1.175 --pod-network-cidr=172.16.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/
部署成功会输出如下内容:
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 192.168.1.175:6443 --token v1nj22.l30dctzysf2jynly --discovery-token-ca-cert-hash sha256:0170607e7e069ffde2f2b6b440e7982f066887e59db49e9a62ac9518924af690
记下其中的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/lk-thinkpad-t470 untainted
备注:
本部分参考: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: "172.16.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
备注:
calico从v3.0开始默认使用的是etcd v3 API,v2的API不再支持
部署参考: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插件部署(所有节点)
1.创建cni插件目录
sudo mkdir -p /opt/cni/bin cd /opt/cni/bin
2.到release页面下载二进制文件
sudo 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文件
$ cd ~/kubeadm $ 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节点上执行以下命令即可加入集群:
kubeadm join 192.168.1.175:6443 --token w2ks3i.13l40j8ux38oz31r --discovery-token-ca-cert-hash sha256:387a9081b55dbed4263c22c9a8ffd5e7270c1bcdcca4299c2a69cba7d3df74e7
注意:默认token的有效期为24小时,当过期之后,该token就不可用了。此时可以重新生成token:
kubeadm token generate kubeadm token create <generated-token> --print-join-command --ttl=0
设置–ttl=0代表永不过期
- 使用kubeadm 安装 kubernetes 1.12.0
- Ubuntu 下安装 Nginx_1.12.0及简单使用
- Ubuntu 18 使用docker安装rancher/server:stable并运行kubernetes
- k8s技术预研3--使用kubeadm安装、配置Kubernetes集群以及进行故障排查的方法
- 使用kubeadm安装kubernetes集群
- 使用kubeadm安装kubernetes1.12.1
- CentOS 7.6 使用kubeadm安装Kubernetes 13
- 使用kubeadm安装kubernetes
- Ubuntu 18.04下安装最新CMake及CMake简单使用
- 使用kubeadm在ububtu16.04安装kubernetes1.6.1-flannel
- Ubuntu 18.04 nvidia driver 390.48 安装 TensorFlow 1.12.0 和 PyTorch 1.0.0 详细教程
- Ubuntu 18.04下安装最新CMake及CMake简单使用(转)
- 使用kubeadm安装Kubernetes1.13
- 使用kubeadm在ububtu16.04安装kubernetes1.5.5-flannel
- 使用kubeadm在Ubuntu 16.04上搭建Kubernetes1.5集群
- Ubuntu 16.04下kubeadm安装Kubernetes
- 使用kubeadm安装Kubernetes 1.9
- Ubuntu18.04使用Anaconda安装Tensorflow-gpu
- 在 Ubuntu 18.04上安装 Neovim以及安装使用配置
- Ubuntu 18.04 使用Docker镜像方式安装GitLab