容器技術在目前很火,並且確確實實的解決了不少的痛點,可是若是隻使用目前 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