k8s 二进制部署 三 (docker)

大番茄 2019年10月28日 1,123次浏览

v19.03.4

一、 注意事项

在使用最新版本docker和overlay2存储驱动的情况下:
使用centos或redhat要求内核 3.10.0-514或以上, 非centos需要使用4.0或以上。
xfs文件系统需要ftype=1, 不然无法支持overlay, overlay2存储驱动。
ftype=1 表示支持 d_type, d_type表示目录条目类型, 是文件系统数据结构中的一个字段, 因为xfs是可选的,所以要注意这个, ext4应该默认就是支持的。

bridge-nf-call-iptables 与 bridge-nf-call-ip6tables 内核参数要开启,二层数据会发给iptables,应该是用于从二层直接转发数据。

docker 选择的最新版本,暂时测试没有发现问题。 线上使用需要使用稍微小一点的版本,以确保与k8s兼容。

二、安装

docker version: 19.03.3

关闭防火墙:

systemctl stop firewalld
systemctl disable firewalld

关闭selinux:

# 修改  SELINUX=disabled  , 修改完最好直接重启,反正也是刚开始。
vim /etc/selinux/config     
setenforce 0

安装docker的官方文档: https://docs.docker.com/install/linux/docker-ce/centos/
docker官方的源在国内速度慢, 可以使用阿里的yum源。https://developer.aliyun.com/mirror/
选择docker-ce,ce为社区版本,ee为企业版,会引导进入阿里的云栖社区,找到对应系统的源文件,这里是centos7的。 http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@k8s-node2 ~]# cd /etc/yum.repos.d
[root@k8s-node2 yum.repos.d]# wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@k8s-node2 yum.repos.d]# yum install docker-ce -y

三、后续配置

安装完成以后需要简单的配置点东西
创建并编辑/etc/docker/daemon.json文件,是docker默认的配置文件。
dockerd --help可以看到。

--config-file string                      Daemon configuration file (default "/etc/docker/daemon.json")
# docker一次也没启动过可能没有docker目录。
mkdir /etc/docker; vim /etc/docker/daemon.json

daemon.json中所有参数在这里:
https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file

添加一个镜像加速的站点, 都知道国内下载docker hub的网速情况。
这里是这个加速点的介绍: https://www.daocloud.io/mirror
最终会在daemon.json里面加上这个。

[root@k8s-node2 yum.repos.d]# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}

阿里也有加速点, 在阿里的容器镜像服务里面, 这里把阿里的也加上。

storage-driver 设置存储驱动,一般centos7新安装的docker默认都是使用overlay2,这里加上是为了防止出现意外。

{"registry-mirrors": ["http://f1361db2.m.daocloud.io","https://3oegfh0i.mirror.aliyuncs.com"],
 "storage-driver": "overlay2"}

在一些老版本docker使用overlay2可能会警告不能使用kerner 4.0之前的版本。

需要在配置中加上跳过检查:
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
数据存储目录 data-root

可以放到命令行参数也可以放到daemon.json里, docker 的数据存储目录,默认是/var/lib/docker。包含 镜像,容器,存储卷, 状态信息。

  "data-root": "/mnt/docker-data",
修改cgroup驱动

k8s官方推荐使用systemd作为cgroup驱动。
https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/#cgroup-%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F

修改的话也是在daemon.json里:

 "exec-opts": ["native.cgroupdriver=systemd"]

insecure-registries: 不支持https的私有仓库放到这个里面, 在pull镜像的时候就会以http访问。


最终的daemon.json类似这样:

{"registry-mirrors": ["https://3oegfh0i.mirror.aliyuncs.com"],
 "data-root": "/data/docker",
 "storage-driver": "overlay2",
 "insecure-registries": ["harbor.atest.pub"],
 "exec-opts": ["native.cgroupdriver=systemd"]
}

四、启动

直接systemctl 启动就行, 只是启动以后要确定一下docker info信息。

[root@k8s-node2 yum.repos.d]# systemctl start docker
Warning: docker.service changed on disk. Run 'systemctl daemon-reload' to reload units.
[root@k8s-node2 yum.repos.d]# systemctl daemon-reload
[root@k8s-node2 yum.repos.d]# systemctl stop docker
[root@k8s-node2 yum.repos.d]# systemctl start docker
[root@k8s-node2 yum.repos.d]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@k8s-node2 yum.repos.d]# docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 19.03.4
 Storage Driver: overlay2             #存储驱动
  Backing Filesystem: xfs
  Supports d_type: true                # 是否支持d_type
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: systemd                 # cgroup 驱动
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
 runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-957.27.2.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 1.952GiB
 Name: k8s-node2
 ID: OABW:IKQQ:66K3:K6J5:C2EB:3BPX:5CEV:L5BZ:SGCT:J2TB:HUAJ:6RTQ
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:                       # 镜像加速
  http://f1361db2.m.daocloud.io/
  https://3oegfh0i.mirror.aliyuncs.com/
 Live Restore Enabled: false


WARNING: bridge-nf-call-iptables is disabled      # 需要开启内核中这个参数
WARNING: bridge-nf-call-ip6tables is disabled

查看/etc/sysctl.conf配置,发现 centos7 的sysctl配置被指到了/usr/lib/sysctl.d/目录下, 修改/usr/lib/sysctl.d/00-system.conf

vim /usr/lib/sysctl.d/00-system.conf

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

sysctl -p --system        # 执行sysctl -p --system以生效。

注意事项

bridge-nf-call-iptables

这个两个参数一定要开启,并且br_netfilter模块要打开。
引用官方的一句话:
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#%E5%AE%89%E8%A3%85-kubeadm-kubelet-%E5%92%8C-kubectl

一些 RHEL/CentOS 7 的用户曾经遇到过问题:由于 iptables 被绕过而导致流量无法正确路由的问题。您应该确保 在 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 被设置为 1。

cat < /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

确保在此步骤之前已加载了 br_netfilter 模块。这可以通过运行 lsmod | grep br_netfilter 来完成。要显示加载它,请调用 modprobe br_netfilter。


overlay

查看overlay模块是否加载:

[root@k8s-node2 ~]# lsmod | grep overlay
overlay                71964  0

overlay 是系统的一个文件系统类型, docker 的 overlay , overlay2 都是使用系统的overlay文件系统, 使用mount命令可以测试。如:

mount -t overlay overlay -o lowerdir=low,upperdir=upper,workdir=work merged

其他k8s-node节点都是一样安装。k8s-master节点这里直接用systemd来启动, 不需要docker。