目录:
官方文档和源码永远都是最好的学习资料,有什么问题大家可以讨论
docker官方文档
kubernetes官方文档
一. 准备工作
1.1 环境信息
- 操作系统:Ubuntu 16.04.1 LTS
关闭防火墙
- 关闭ufw防火墙,Ubuntu默认未启用,无需设置。
$ sudo ufw disable
备注:
- ufw的底层是使用iptables进行数据过滤,建立在iptables之上,这可能会与 Docker 产生冲突。
- 为避免不必要的麻烦,这里把firewalld关掉。
1.2 禁用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.3 开启数据包转发
1.3.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.3.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.4 禁用swap
1.禁掉所有的swap分区
$ sudo swapoff -a
2.同时还需要修改/etc/fstab文件,注释掉 SWAP 的自动挂载,防止机子重启后swap启用。
备注:
- Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动,虽然可以通过kubelet的启动参数–fail-swap-on=false更改这个限制,但不建议,最好还是不要开启swap。
1.5 配置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可以正常工作。
二. 安装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