容器技术在目前很火,并且确确实实的解决了不少的痛点,可是若是只使用目前 Docker 官方提供的 engine+compose+swarm 方案,是很难再实际生产中使用的。Kubernetes 是谷歌官方根据本身容器经验 Borg 开源的产品。固然,这不多是 Borg,并且它的底层是替换成了 Docker,可是这不能掩盖它解决的问题。所以笔者决定尝试玩玩。linux
根据官方文档的说明,Kubernetes 是使用 golang 写成,而且依赖 coreos/etcd 和 docker/docker 产品,Kubernetes 其实是个分布式的 master-slave 架构,主要有如下组件 api-server、controller-manager、scheduler、proxy、kubelet,前面三个分别是 API 接口服务器、管理控制器、调度器,然后面两个则是网络派发代理和实际和 Docker 沟通的 agent。git
官方给出的下载安装文档简直简略的不能再简略了,而使用 yum 等包管理工具安装目前只能安装 2.x 版本最新而没有 3.x 的预编译包,不过不要紧,咱们能够直接下载预编译安装包。github
etcd 是 coreos 为了进行分布式部署所作的键值存储服务,Github release 上面能够直接下载到最新的预编译包而后把其中的两个二进制文件扔到 /usr/local/bin
目录下就 ok 了。
至于配置文件和 systemd 单元文件也很简单,官方 github 上面已经提供了 systemd 启动文件,首先是添加一个名为 etcd 的系统用户(注意:是 daemon 用户,别加上乱七八糟的东西)golang
[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 文档,这里提供笔者的单元文件docker
[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
指定一个环境变量文件,全部的配置都经过环境变量配置。api
基本思路跟上面一个样,先下载二进制包,把二进制文件放到 /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 用户组网络
一样是下载二进制包解压开来,进入 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 启动文件中将环境变量转换为命令行参数传入。socket