热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Ubuntu18.04使用kubeadm安装kubernetes1.12.0

1.准备工作node结点只需执行1,2,3操作,master结点需要执行1,2,3,4操作1.1

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相当于跨网段&#xff0c;跨网络需要路由)的容器互访
<2>从容器内访问外部


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


1.4.2 防火墙修改FORWARD链默认策略

数据包经过路由后&#xff0c;假如不是发往本机的流量&#xff0c;下一步会走iptables的FORWARD链&#xff0c;而docker从1.13版本开始&#xff0c;将FORWARD链的默认策略设置为DROP&#xff0c;会导致出现一些例如跨主机的两个pod使用podIP互访失败等问题。解决方案有2个&#xff1a;

在所有节点上开机启动时执行iptables -P FORWARD ACCEPT
让docker不操作iptables

方案一

临时生效&#xff1a;

$ sudo iptables -P FORWARD ACCEPT

iptables的配置重启后会丢失&#xff0c;可以将配置写进/etc/rc.local中&#xff0c;重启后自动执行&#xff1a;

/usr/sbin/iptables -P FORWARD ACCEPT

方案二

设置docker启动参数添加--iptables&#61;false选项&#xff0c;使docker不再操作iptables&#xff0c;比如1.10版以上可编辑docker daemon默认配置文件/etc/docker/daemon.json:

{"iptables": false
}

备注&#xff1a;


建议方案二
kubernetes官网建议和k8s结合的时候docker的启动参数设置--iptables&#61;false使得docker不再操作iptables&#xff0c;完全由kube-proxy来操作iptables。
参考&#xff1a;
<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文件&#xff0c;注释掉 SWAP 的自动挂载&#xff0c;防止机子重启后swap启用。

备注&#xff1a;


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



1.6 配置iptables参数&#xff0c;使得流经网桥的流量也经过iptables/netfilter防火墙

$ sudo tee /etc/sysctl.d/k8s.conf <<-&#39;EOF&#39;
net.bridge.bridge-nf-call-ip6tables &#61; 1
net.bridge.bridge-nf-call-iptables &#61; 1
EOF$ sudo sysctl --system

备注&#xff1a;


网络插件需要为kube-proxy提供一些特定的支持&#xff0c;比如kube-proxy的iptables模式基于iptables&#xff0c;网络插件就需要确保容器的流量可以流过iptables。比如一些网络插件会用到网桥&#xff0c;而网桥工作在数据链路层&#xff0c;iptables/netfilter防火墙工作在网络层&#xff0c;以上配置则可以使得通过网桥的流量也进入iptables/netfilter防火墙中&#xff0c;确保iptables模式的kube-proxy可以正常工作。
默认没有指定kubelet网络插件的情况下&#xff0c;会使用noop插件&#xff0c;它也会设置net/bridge/bridge-nf-call-iptables&#61;1来确保iptables模式的kube-proxy可以正常工作。
参考&#xff1a;
<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.安装依赖&#xff0c;使得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&#61;amd64] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) \stable"

国内访问download.docker.com不稳定的话可以使用阿里云镜像源

$ sudo add-apt-repository \"deb [arch&#61;amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \$(lsb_release -cs) \stable"

5.安装指定版本docker-ce
查看源中都有哪些版本&#xff1a;

$ apt-cache madison docker-cedocker-ce | 18.06.1~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packagesdocker-ce | 18.06.0~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packagesdocker-ce | 18.03.1~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages

安装18.03.1版&#xff1a;

$ sudo apt-get install -y docker-ce&#61;18.03.1~ce~3-0~ubuntu

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

$ sudo systemctl enable docker && sudo systemctl start docker

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

$ sudo usermod -aG docker

然后退出&#xff0c;重新登录&#xff0c;使用docker命令就不用加sudo了。

备注&#xff1a;


docker部署参考&#xff1a;https://docs.docker.com/install/linux/docker-ce/ubuntu



2.2 docker启动参数配置

为docker做如下配置&#xff1a;

设置阿里云镜像库加速dockerhub的镜像。国内访问dockerhub不稳定&#xff0c;将对dockerhub的镜像拉取代理到阿里云镜像库
配上1.3.2的禁用iptables的设置
如果想让podIP可路由的话&#xff0c;设置docker不再对podIP做MASQUERADE&#xff0c;否则docker会将podIP这个源地址SNAT成nodeIP
设置docker存储驱动为overlay2&#xff08;需要linux kernel版本在4.0以上&#xff0c;docker版本大于1.12&#xff09;
根据业务规划修改容器实例存储根路径&#xff08;默认路径是/var/lib/docker&#xff09;

最终配置如下&#xff1a;

$ sudo tee /etc/docker/daemon.json <<-&#39;EOF&#39;
{"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"],"iptables": false,"ip-masq": false,"storage-driver": "overlay2","graph": "/home/lk/docker"
}
EOF$ sudo systemctl restart docker

备注&#xff1a;


docker的所有启动参数可见&#xff1a;https://docs.docker.com/engine/reference/commandline/dockerd/
将xxxxxxxx替换成阿里云为你生成的镜像代理仓库前缀
阿里云地址&#xff1a;https://cr.console.aliyun.com/cn-hangzhou/mirrors?accounttraceid&#61;7a15d868-f97f-4068-ba64-7628c1146bd6



2.3 为docker设置http代理

假如机器在内网环境无法直接访问外网的话&#xff0c;还需要为docker设置一个http_proxy。

$ sudo mkdir /etc/systemd/system/docker.service.d$ sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<-&#39;EOF&#39;
[Service]
Environment&#61;"HTTP_PROXY&#61;http://xxx.xxx.xxx.xxx:xxxx"
Environment&#61;"NO_PROXY&#61;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文件&#xff1a;

sudo apt-get update && sudo apt-get install -y apt-transport-https curlsudo 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 <<-&#39;EOF&#39;
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOFsudo apt-get update

google地址被墙的情况下可以使用阿里云或者中科大的镜像站&#xff1a;

sudo apt-get update && sudo apt-get install -y apt-transport-https curlsudo 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 <<-&#39;EOF&#39;
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOFsudo apt-get update

备注&#xff1a;


虽然我的ubuntu版本是18.04.1&#xff08;bionic&#xff09;&#xff0c;但k8s的apt包目前还没支持到这么高&#xff0c;使用xenial。



3.1.2 安装kubeadm、kubelet、kubectl

1.查看可用软件版本&#xff1a;

$ apt-cache madison kubeadmkubeadm | 1.12.1-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packageskubeadm | 1.12.0-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packageskubeadm | 1.11.3-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages......

2.安装指定版本&#xff1a;

$ sudo apt-get install -y kubelet&#61;1.12.0-00 kubeadm&#61;1.12.0-00 kubectl&#61;1.12.0-00
$ sudo apt-mark hold kubelet&#61;1.12.0-00 kubeadm&#61;1.12.0-00 kubectl&#61;1.12.0-00

3.设置开机自启动并运行kubelet&#xff1a;

sudo systemctl enable kubelet && sudo systemctl start kubelet

备注&#xff1a;


此时kubelet的服务运行状态是异常的(因为缺少主配置文件kubelet.conf等&#xff0c;可以暂不处理&#xff0c;因为在完成Master节点的初始化后才会生成这个配置文件&#xff09;


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


4. Kubernetes集群安装


4.1 master节点部署


4.1.1 提前下载所需镜像

看一下kubernetes v1.12.0需要哪些镜像&#xff1a;

$ kubeadm config images list --kubernetes-version&#61;v1.12.0k8s.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被墙&#xff0c;从anjia0532镜像地址下载&#xff1a;

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完成&#xff1a;

#!/bin/bash
images&#61;(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[&#64;]} ; dodocker pull anjia0532/google-containers.$imageNamedocker tag anjia0532/google-containers.$imageName k8s.gcr.io/$imageNamedocker rmi anjia0532/google-containers.$imageName
done

4.1.2 kubeadm init初始化集群


方式一&#xff1a;使用命令行初始化

使用kubeadm.yaml配置文件初始化master节点。

sudo kubeadm init --apiserver-advertise-address&#61;192.168.1.175 --pod-network-cidr&#61;172.16.0.0/16 --service-cidr&#61;10.233.0.0/16 --kubernetes-version&#61;v1.12.0

如果该命令不能初始化&#xff0c;可以使用以下命令

sudo kubeadm init --pod-network-cidr&#61;192.168.0.0/16 --kubernetes-version&#61;v1.12.0

方式二&#xff1a;使用配置文件初始化

更多的个性化配置可以使用配置文件。使用配置文件的好处是可以固化启动配置&#xff0c;使得启动参数有迹可循。目前使用配置文件初始化的方式只是实验性的。

配置文件kubeadm.yaml如下&#xff1a;

apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
api:advertiseAddress: 10.142.232.155bindPort: 8443
controllerManagerExtraArgs:bind-address: 10.142.232.155address: 10.142.232.155
schedulerExtraArgs:address: 10.142.232.155
kubernetesVersion: v1.12.0
networking:podSubnet: 192.168.0.0/16serviceSubnet: 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

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


部署成功会输出如下内容&#xff1a;

Your Kubernetes master has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou 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&#xff0c;加入node节点时会用到。

备注&#xff1a;


确保没有设置http_proxy和https_proxy代理&#xff0c;kubeadm init过程首先会检查代理服务器&#xff0c;确定跟kube-apiserver等的 http/https 连接方式&#xff0c;如果有代理设置可能会有问题导致不能访问自身和内网。 需要在/etc/profile中增加kubeadm init指定的apiserver-advertise-addresspod-network-cidrservice-cidr三个地址段到no_proxy里后重试:export no_proxy&#61;10.142.232.155,192.168.0.0/16,10.233.0.0/16
集群初始化如果遇到问题&#xff0c;可以使用下面的命令进行清理再重新初始化&#xff1a;
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: &#39;cgroupfs&#39;, &#39;systemd&#39; (default "cgroupfs")。默认值为cgroupfs。yum安装kubelet、kubeadm时生成10-kubeadm.conf文件中可能将这个参数值改成了systemd。

查看kubelet的配置文件&#xff08;1.12.0版本的封装在/var/lib/kubelet/kubeadm-flags.env文件中&#xff09;&#xff0c;如果是默认的cgroupfs&#xff0c;不需要修改。否则需要修改/etc/default/kubelet&#xff08;或者/var/lib/kubelet/kubeadm-flags.env&#xff09;文件

$ sudo vim /etc/default/kubeletKUBELET_KUBEADM_EXTRA_ARGS&#61;--cgroup-driver&#61;
$ sudo systemctl daemon-reload
$ sudo systemctl restart kubelet

参考&#xff1a;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初始化的集群&#xff0c;将master节点做了taint&#xff08;污点&#xff09;&#xff0c;使得默认情况下&#xff08;不设置容忍&#xff09;Pod不会被调度到master上。这里搭建的是测试环境可以使用下面的命令去掉master的taint&#xff0c;使master参与工作负载&#xff1a;

$ kubectl taint nodes --all node-role.kubernetes.io/master-node/lk-thinkpad-t470 untainted

备注&#xff1a;


本部分参考&#xff1a;https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/
4.2 网络部署
可以选择不同的网络插件&#xff0c;本文介绍calico和flannel。注意&#xff0c;同时只能使用一种网络插件。



4.2.1 calico部署

calico的数据存储可以有两种方式&#xff1a;

calico直接与etcd进行交互&#xff0c;使用etcd作为datastore的方式
calico和其他k8s组件一样通过kube-apiserver与etcd进行交互&#xff0c;将数据存储在etcd中(通过CRD实现)


方案一 etcd as datastore

1.到release页面获取安装包&#xff0c;这里用的是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/为前缀&#xff0c;而yaml文件里配置的镜像前缀是quay.io/calico/&#xff0c;所以需要重新打一下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&#xff1a;

###############################配置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的地址范围&#xff0c;要和kubeadm启动时指定的一致- name: CALICO_IPV4POOL_CIDRvalue: "172.16.0.0/16"
###############################配置calico-node使用主机上kubeadm生成的etcd相关证书和key- name: etcd-certshostPath:path: /etc/kubernetes/pki/etcd
# secret:
# secretName: calico-etcd-secrets
# defaultMode: 0400
###############################配置calico-kube-controllers使用主机上kubeadm生成的etcd相关证书和key- name: etcd-certshostPath: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&#61;cluster-admin --serviceaccount&#61;kube-system:calico-node

6.启动

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

启动了两类pod&#xff1a;

名为calico-kube-controllers的Deployment
名为calico-node的Daemonset

备注&#xff1a;


calico从v3.0开始默认使用的是etcd v3 API&#xff0c;v2的API不再支持
部署参考&#xff1a;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组件两部分&#xff0c;而flannel的部署只会初始化一些cni的配置文件&#xff0c;并不会部署cni的可执行文件&#xff0c;需要手动部署&#xff0c;所以flannel部署分为两步&#xff1a;


步骤一.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&#64;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&#xff0c;需要为启动flannel的daemonset添加toleration&#xff0c;以允许在尚未Ready的节点上部署flannel pod:

tolerations:- key: node-role.kubernetes.io/masteroperator: Existseffect: NoSchedule#添加下面这个toleration- key: node.kubernetes.io/not-readyoperator: Existseffect: NoSchedule

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

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


4.部署

kubectl apply -f kube-flannel.yml

部署好后集群可以正常运行了。

备注&#xff1a;


假如网络部署失败或出问题需要重新部署&#xff0c;执行以下内容清除生成的网络接口&#xff1a;
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&#xff0c;并将master节点上的/etc/kubernetes/pki/etcd拷贝到slave相同位置&#xff0c;用于calico-node连接etcd使用&#xff0c;然后在slave节点上执行以下命令即可加入集群&#xff1a;

kubeadm join 192.168.1.175:6443 --token w2ks3i.13l40j8ux38oz31r --discovery-token-ca-cert-hash sha256:387a9081b55dbed4263c22c9a8ffd5e7270c1bcdcca4299c2a69cba7d3df74e7

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

kubeadm token generate
kubeadm token create --print-join-command --ttl&#61;0

设置–ttl&#61;0代表永不过期


**


如果添加bridge-nf-call-ip6tables出现No such file or directory&#xff1a;

**
在/etc/sysctl.conf中添加&#xff1a;

net.bridge.bridge-nf-call-ip6tables &#61; 1
net.bridge.bridge-nf-call-iptables &#61; 1

[root&#64;localhost ~]# cat /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables &#61; 1
net.bridge.bridge-nf-call-iptables &#61; 1

执行sysctl -p 时出现&#xff1a;

[root&#64;localhost ~]# sysctl -p
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory

解决方法&#xff1a;

[root&#64;localhost ~]# modprobe br_netfilter
[root&#64;localhost ~]# ls /proc/sys/net/bridge
bridge-nf-call-arptables bridge-nf-filter-pppoe-tagged
bridge-nf-call-ip6tables bridge-nf-filter-vlan-tagged
bridge-nf-call-iptables bridge-nf-pass-vlan-input-dev

[root&#64;localhost ~]# sysctl -p
net.bridge.bridge-nf-call-ip6tables &#61; 1
net.bridge.bridge-nf-call-iptables &#61; 1

推荐阅读
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
author-avatar
手机用户2702934324
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有