docker 是容器的运行环境,管理它的生命周期。kubelet 经过 Container Runtime Interface (CRI) 与 docker 进行交互node
到 https://download.docker.com/linux/static/stable/x86_64/ 页面下载最新发布包:linux
wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.3-ce.tgz tar -xvf docker-18.06.3-ce.tgz
分发二进制文件到全部 worker 节点:git
cd /opt/k8s/work source /opt/k8s/bin/environment.sh for node_ip in 192.168.161.170 192.168.161.171 192.168.161.172 do echo ">>> ${node_ip}" scp docker/* root@${node_ip}:/opt/k8s/bin/ ssh root@${node_ip} "chmod +x /opt/k8s/bin/*" done
cd /opt/k8s/work cat > docker.service <<"EOF" [Unit] Description=Docker Application Container Engine Documentation=http://docs.docker.io [Service] WorkingDirectory=##DOCKER_DIR## Environment="PATH=/opt/k8s/bin:/bin:/sbin:/usr/bin:/usr/sbin" EnvironmentFile=-/run/flannel/docker ExecStart=/opt/k8s/bin/dockerd $DOCKER_NETWORK_OPTIONS ExecReload=/bin/kill -s HUP $MAINPID Restart=on-failure RestartSec=5 LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity Delegate=yes KillMode=process [Install] WantedBy=multi-user.target EOF
EOF 先后有双引号,这样 bash 不会替换文档中的变量,如 $DOCKER_NETWORK_OPTIONS;github
dockerd 运行时会调用其它 docker 命令,如 docker-proxy,因此须要将 docker 命令所在的目录加到 PATH 环境变量中;docker
flanneld 启动时将网络配置写入 /run/flannel/docker
文件中,dockerd 启动前读取该文件中的环境变量 DOCKER_NETWORK_OPTIONS
,而后设置 docker0 网桥网段;json
若是指定了多个 EnvironmentFile
选项,则必须将 /run/flannel/docker
放在最后(确保 docker0 使用 flanneld 生成的 bip 参数);ubuntu
docker 须要以 root 用于运行;centos
docker 从 1.13 版本开始,可能将 iptables FORWARD chain的默认策略设置为DROP,从而致使 ping 其它 Node 上的 Pod IP 失败,遇到这种状况时,须要手动设置策略为 ACCEPT
:bash
sudo iptables -P FORWARD ACCEPT
而且把如下命令写入 /etc/rc.local
文件中,防止节点重启iptables FORWARD chain的默认策略又还原为DROP网络
/sbin/iptables -P FORWARD ACCEPT
完整 unit 见 docker.service
分发 systemd unit 文件到全部 worker 机器:
cd /opt/k8s/work source /opt/k8s/bin/environment.sh sed -i -e "s/##DOCKER_DIR##/${DOCKER_DIR}/" docker.service for node_ip in 192.168.161.170 192.168.161.171 192.168.161.172 do echo ">>> ${node_ip}" scp docker.service root@${node_ip}:/etc/systemd/system/ done
cd /opt/k8s/work source /opt/k8s/bin/environment.sh cat > docker-daemon.json <<EOF { "registry-mirrors": ["https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"], "insecure-registries": ["docker02:35000"], "max-concurrent-downloads": 20, "live-restore": true, "max-concurrent-uploads": 10, "debug": true, "data-root": "${DOCKER_DIR}/data", "exec-root": "${DOCKER_DIR}/exec", "log-opts": { "max-size": "100m", "max-file": "5" } } EOF
分发 docker 配置文件到全部 work 节点:
cd /opt/k8s/work source /opt/k8s/bin/environment.sh for node_ip in 192.168.161.170 192.168.161.171 192.168.161.172 do echo ">>> ${node_ip}" ssh root@${node_ip} "mkdir -p /etc/docker/ ${DOCKER_DIR}/{data,exec}" scp docker-daemon.json root@${node_ip}:/etc/docker/daemon.json done
source /opt/k8s/bin/environment.sh for node_ip in 192.168.161.170 192.168.161.171 192.168.161.172 do echo ">>> ${node_ip}" ssh root@${node_ip} "systemctl stop firewalld && systemctl disable firewalld" ssh root@${node_ip} "/usr/sbin/iptables -F && /usr/sbin/iptables -X && /usr/sbin/iptables -F -t nat && /usr/sbin/iptables -X -t nat" ssh root@${node_ip} "/usr/sbin/iptables -P FORWARD ACCEPT" ssh root@${node_ip} "systemctl daemon-reload && systemctl enable docker && systemctl restart docker" #ssh root@${node_ip} 'for intf in /sys/devices/virtual/net/docker0/brif/*; do echo 1 > $intf/hairpin_mode; done' ssh root@${node_ip} "sudo sysctl -p /etc/sysctl.d/kubernetes.conf" done
source /opt/k8s/bin/environment.sh for node_ip in 192.168.161.170 192.168.161.171 192.168.161.172 do echo ">>> ${node_ip}" ssh root@${node_ip} "systemctl status docker|grep Active" done
确保状态为 active (running)
,不然查看日志,确认缘由:
journalctl -u docker
source /opt/k8s/bin/environment.sh for node_ip in 192.168.161.170 192.168.161.171 192.168.161.172 do echo ">>> ${node_ip}" ssh root@${node_ip} "/usr/sbin/ip addr show flannel.1 && /usr/sbin/ip addr show docker0" done
确认各 work 节点的 docker0 网桥和 flannel.1 接口的 IP 处于同一个网段中(以下):