背景

容器技术在目前很火,而且确确实实的解决了很多的痛点,但是如果只使用目前 Docker 官方提供的 engine+compose+swarm 方案,是很难再实际生产中使用的。Kubernetes 是谷歌官方根据自己容器经验 Borg 开源的产品。当然,这不可能是 Borg,而且它的底层是替换成了 Docker,但是这不能掩盖它解决的问题。因此笔者决定尝试玩玩。

架构

根据官方文档的说明,Kubernetes 是使用 golang 写成,并且依赖 coreos/etcd 和 docker/docker 产品,Kubernetes 实际上是个分布式的 master-slave 架构,主要有以下组件 api-server、controller-manager、scheduler、proxy、kubelet,前面三个分别是 API 接口服务器、管理控制器、调度器,而后面两个则是网络派发代理和实际和 Docker 沟通的 agent。

部署

官方给出的下载安装文档简直简略的不能再简略了,而使用 yum 等包管理工具安装目前只能安装 2.x 版本最新而没有 3.x 的预编译包,不过没关系,我们可以直接下载预编译安装包。

etcd

etcd 是 coreos 为了进行分布式部署所做的键值存储服务,Github release 上面可以直接下载到最新的预编译包然后把其中的两个二进制文件扔到 /usr/local/bin 目录下就 ok 了。
至于配置文件和 systemd 单元文件也很简单,官方 github 上面已经提供了 systemd 启动文件,首先是添加一个名为 etcd 的系统用户(注意:是 daemon 用户,别加上乱七八糟的东西)

[Unit]
Description=etcd key-value store
Documentation=https://github.com/coreos/etcd

[Service]
User=etcd
Type=notify
Environment=ETCD_DATA_DIR=/var/lib/etcd
Environment=ETCD_NAME=%m
ExecStart=/usr/bin/etcd
Restart=always
RestartSec=10s
LimitNOFILE=40000

[Install]
WantedBy=multi-user.target

而 etcd 实际上是使用环境变量作为配置的,具体可以参考 etcd 的 github 文档,这里提供笔者的单元文件

[Unit]
Description=etcd key-value store
Documentation=https://github.com/coreos/etcd

[Service]
User=etcd
Type=notify
WorkingDirectory=/usr/local/var/lib/etcd
ExecStart=/usr/local/bin/etcd
Restart=on-failure
RestartSec=10s
LimitNOFILE=40000

[Install]
WantedBy=multi-user.target

直接把工作目录指定到 /usr/local/var/lib/etcd,这样默认情况下所有的数据文件都会存放在 default.etcd 文件夹下,不过注意这个目录需要手工创建并且制定合适的权限。不然 systemd 启动会报错。然后把启动文件放到 /etc/systemd/system/etcd.service
如果说具体的配置需要配,则应当再指定 EnvironmentFile=/path/to 指定一个环境变量文件,所有的配置都通过环境变量配置。

Docker

基本思路跟上面一个样,先下载二进制包,把二进制文件放到 /usr/local/bin 目录下,然后就是 systemd 单元文件,官方也在 Github 上提供了单元文件,直接拿下来用

[Unit]
Description=Docker Socket for the API
PartOf=docker.service

[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target


[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket firewalld.service
Requires=docker.socket

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd://
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process

[Install]
WantedBy=multi-user.target

需要注意的是上面有两个 systemd 文件,一个是 socket 启动文件,一个是正常的 docker 启动文件,这个特性来自于 1.12 版本,具体请参考官方的 ReleaseNote。
还有一点就是记得添加一个 docker 用户组

Kubernetes

同样是下载二进制包解压开来,进入 server 目录,解压 kubernetes-server-linux-amd64.tar.gz 文件,把解压文件里的 5 个组件放到 /usr/local/bin 目录(注意:就放上面提到的 5 个组件就行,其他的不用),还有一个就是 client 命令行 kubectl 文件。
然后添加 kube 系统用户。

useradd -c "kubernetes user" -d / -M -r -s /sbin/nologin kube

然后就是官方提供的 systemd 文件 https://github.com/kubernetes... 这里就不深入讲解了,因为实际上跟 etcd 基本一致,只不过 kubernetes 并不使用环境变量作为配置方式,所以必须在 systemd 启动文件中将环境变量转换为命令行参数传入。

未完待续


山河永寂
2.4k 声望159 粉丝