roles/docker/
├── defaults
│ └── main.yml # 变量配置文件
├── files
│ ├── docker # bash 自动补全
│ └── docker-tag # 查询镜像tag的小工具
├── tasks
│ └── main.yml # 主执行文件
└── templates
├── daemon.json.j2 # docker daemon 配置文件
└── docker.service.j2 # service 服务模板请在另外窗口打开roles/docker/tasks/main.yml 文件,对照看以下讲解内容。
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io
[Service]
Environment="PATH={{ bin_dir }}:/bin:/sbin:/usr/bin:/usr/sbin"
ExecStart={{ bin_dir }}/dockerd
ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
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- dockerd 运行时会调用其它 docker 命令,如 docker-proxy,所以需要将 docker 命令所在的目录加到 PATH 环境变量中;
- docker 从 1.13 版本开始,将
iptables的filter表的FORWARD链的默认策略设置为DROP,从而导致 ping 其它 Node 上的 Pod IP 失败,因此必须在filter表的FORWARD链增加一条默认允许规则iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT - 运行
dockerd --help查看所有可配置参数,确保默认开启--iptables和--ip-masq选项
从国内下载docker官方仓库镜像非常缓慢,所以对于k8s集群来说配置镜像加速非常重要,配置 /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}这将在后续部署calico下载 calico/node镜像和kubedns/heapster/dashboard镜像时起到加速效果。
由于K8S的官方镜像存放在gcr.io仓库,因此这个镜像加速对K8S的官方镜像没有效果;好在Docker Hub上有很多K8S镜像的转存,而Docker Hub上的镜像可以加速。这里推荐两个K8S镜像的Docker Hub项目,几乎能找到所有K8S相关的镜像,而且更新及时,感谢维护者的辛勤付出!
当然对于企业内部应用的docker镜像,想要在K8S平台运行的话,特别是结合开发CI/CD 流程,肯定是需要部署私有镜像仓库的,参阅harbor文档。
另外,daemon.json配置中也配置了docker 容器日志相关参数,设置单个容器日志超过10M则进行回卷,回卷的副本数超过3个就进行清理。
因为后续calico网络、kube-proxy等将大量使用 iptables规则,安装前清空所有iptables策略规则;常见发行版Ubuntu的 ufw 和 CentOS的 firewalld等基于iptables的防火墙最好直接卸载,避免不必要的冲突。
iptables -F && iptables -X \
&& iptables -F -t nat && iptables -X -t nat \
&& iptables -F -t raw && iptables -X -t raw \
&& iptables -F -t mangle && iptables -X -t mangle- calico 网络支持
network-policy,使用的calico-kube-controllers会使用到iptables所有的四个表filternatrawmangle,所以一并清理
systemctl daemon-reload && systemctl enable docker && systemctl start dockerdocker官方目前没有提供在命令行直接查询某个镜像的tag信息的方式,网上找来一个脚本工具,使用很方便。
$ docker-tag library/ubuntu
"14.04"
"16.04"
"17.04"
"latest"
"trusty"
"trusty-20171117"
"xenial"
"xenial-20171114"
"zesty"
"zesty-20171114"
$ docker-tag mirrorgooglecontainers/kubernetes-dashboard-amd64
"v0.1.0"
"v1.0.0"
"v1.0.0-beta1"
"v1.0.1"
"v1.1.0-beta1"
"v1.1.0-beta2"
"v1.1.0-beta3"
"v1.7.0"
"v1.7.1"
"v1.8.0"- 需要先apt安装轻量JSON处理程序
jq - 然后下载脚本即可使用
- 脚本很简单,就一行命令如下
#!/bin/bash
curl -s -S "https://registry.hub.docker.com/v2/repositories/$@/tags/" | jq '."results"[]["name"]' |sort- 对于 CentOS7 安装
jq稍微费力一点,需要启用EPEL源
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
yum install jq运行ansible-playbook 03.docker.yml 成功后可以验证
systemctl status docker # 服务状态
journalctl -u docker # 运行日志
docker version
docker infoiptables-save|grep FORWARD 查看 iptables filter表 FORWARD链,最后要有一个 -A FORWARD -j ACCEPT 保底允许规则
iptables-save|grep FORWARD
:FORWARD ACCEPT [0:0]
:FORWARD DROP [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -j ACCEPT