3 12
深入学习Kubernetes(三):手工安装Kubernetes

由于Kubernetes还在不断的演进,不同版本的k8s,在某些命令会有出入,不过原理变化不大,本文安装的Kubernetes版本为 V1.3.0。

Kubernetes安装包下载地址

解压后,我们需要使用到的服务程序文件位于: kubernetes/server/kubernetes/server/bin 下

下面我们把安装步骤分为Master和Minion两部分,最后在统一进行验证。

环境准备

为了达到简单的集群安装,我们先准备了两台服务器,如果要扩展minion,安装方式都是一样的,所以扩展比较方便。

  • master server : 192.168.139.145

  • minion server : 192.168.139.146

我们的安装过程中,均使用centos的Systemd系统服务,进行Kubernetes服务的配置。

Centos7 默认使用firewall为防火墙,我们先关闭防火墙的设定

$ systemctl disable firewalld.service

$ systemctl stop firewalld.service

Master节点上安装

Master上需要具备的K8s程序组件是

  • etcd
  • kube-apiserver
  • kube-controller-manager
  • kube-scheduler

安装etcd

先下载最新的etcd并解压:

$ wget https://github.com/coreos/etcd/releases/download/v3.1.3/etcd-v3.1.3-darwin-amd64.zip

创建相关的工作目录:

$ mkdir /var/lib/etcd/

$ mkdir /etc/etcd && touch etcd.conf

创建etcd的服务文件:

$ vim /usr/lib/systemd/system/etcd.service

相关内容如下:

[Unit]
Description=Etcd Server
After=network.target

[Service]
Type=simple
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd

[Install]
WantedBy=multi-user.target

其中 /etc/etcd/etcd.conf 为etcd的配置文件,内容可以为空,我们介绍默认的配置

接下来,我们启动etcd的服务

$ systemctl daemon-reload

$ systemctl enable etcd.service

$ systemctl status etcd //检查etcd的运行状态

检查健康:

$ etcdctl cluster-health

member 8e9e05c52164694d is healthy: got healthy result from http://localhost:2379
cluster is healthy

安装 kube-apiserver

我们先创建服务的日志目录

$ mkdir -p /var/log/kubernetes

进入 kubernetes/server/kubernetes/server/bin,把相关程序文件复制到 /usr/bin下

$ cp kube-apiserver /usr/bin/

编辑systemd服务文件

$ vim /usr/lib/systemd/system/kube-apiserver.service

内容如下:

[Unit]
Description=Kubernetes API Server
After=etcd.service
Wants=etcd.service

[Service]
EnvironmentFile=/etc/kubernetes/apiserver
ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
Restart=on-failure
Type=notify
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

创建 apiserver 配置文件

mkdir -p /etc/kubernetes && touch /etc/kubernetes/apiserver

配置文件 /etc/kubernetes/apiserver 的内容包括了 kube-apiserver的全部启动参数,只有的配置参数在变量KUBE_API_ARGS中指定,相关内容如下:

$ vim /etc/kubernetes/apiserver

KUBE_API_ARGS="--etcd_servers=http://127.0.0.1:2379
--insecure-bind-address=0.0.0.0 --insecure-port=8080
--service-cluster-ip-range=169.169.0.0/16 --service-node-port-range=1-65535
--admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota
--logtostderr=false --log-dir=/var/log/kubernetes --v=2"

相关的参数说明可以参考 https://kubernetes.io/docs/admin/kube-apiserver/

安装 kube-controller-manager

kube-controller-manager 服务依赖于 kube-apiserver服务。

跟apiserver一样,我们需要把程序文件复制到 /usr/bin/

cp kube-controller-manager /usr/bin/

编辑systemd的服务文件

$ vim /usr/lib/systemd/system/kube-controller-manager.service

[Unit]
Description=Kubernetes Controller Manager
After=kube-apiserver.service
Requires=kube-apiserver.service

[Service]
EnvironmentFile=/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

创建并编辑配置文件

$ vim /etc/kubernetes/controller-manager

KUBE_CONTROLLER_MANAGER_ARGS="--master=http://192.168.139.145:8080 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"

配置参数可以参考 https://kubernetes.io/docs/admin/kube-controller-manager/

安装 kube-scheduler

跟apiserver一样,我们需要把程序文件复制到 /usr/bin/

cd kubernetes/server/kubernetes/server/bin

cp kube-scheduler /usr/bin/

编辑systemd的服务文件

$ vim /usr/lib/systemd/system/kube-scheduler.service

[Unit]
Description=Kubernetes Scheduler
After=kube-apiserver.service
Requires=kube-apiserver.service

[Service]
EnvironmentFile=/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

编辑配置文件,主要配置 KUBE_SCHEDULER_ARGS 环境变量

$ vim  /etc/kubernetes/scheduler

KUBE_SCHEDULER_ARGS="--master=http://192.168.139.145:8080 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"

小结

完成上面的Master节点安装配置后,我们执行systemctl start 命令这3个服务。同时使用 systemctl enable 命令将服务加入开机启动列表中

$ systemctl daemon-reload

$ systemctl enable kube-apiserver.service
$ systemctl start kube-apiserver.service

$ systemctl enable kube-controller-manager.service
$ systemctl start kube-controller-manager.service

$ systemctl enable kube-scheduler.service
$ systemctl start kube-scheduler.service

通过 syetem status 命令来验证服务的启动状态,”running”表示启动成功。到此,Master上所需的服务就全部启动完成。

Minion节点安装

Minion上需要具备的K8s程序组件是

  • docker engine
  • kubelet
  • kube-proxy

关闭防火墙服务

$ systemctl disable firewalld.service

$ systemctl stop firewalld.service

安装Docker

$ systemctl start docker

切换docker镜像源:

可以参考 https://www.daocloud.io/mirror#accelerator-doc

$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://dbe35452.m.daocloud.io

重启docker后台服务

$ systemctl restart docker

安装 kubectl

创建日志目录:

$ mkdir -p /var/log/kubernetes

复制程序文件

$ cp kubelet /usr/bin/

创建工作目录:

$ mkdir -p /var/lib/kubelet

kubectl服务依赖docker服务。

编辑服务文件

$ vim /usr/lib/systemd/system/kubelet.service

[Unit]
Description=Kubernetes Kubelet Server
After=docker.service
Requires=docker.service

[Service]
WorkingDirectory=/var/lib/kubelet
EnvironmentFile=/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet $KUBELET_ARGS
Restart=on-failure

[Install]
WantedBy=multi-user.target

接下来,我们依旧针对环境变量 KUBELET_ARGS,编辑配置文件

$ vim /etc/kubernetes/kubelet

KUBELET_ARGS="--api-servers=http://192.168.139.145:8080 --hostname-override=192.168.139.146 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"

安装 kube-proxy

复制程序文件

$ cp kube-proxy /usr/bin/

编辑服务文件

[Unit]
Description=Kubernetes Kube Proxy Server
After=network.target
Requires=network.service

[Service]
EnvironmentFile=/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

针对 KUBE_PROXY_ARGS,编辑配置文件

$ vim /etc/kubernetes/proxy

KUBE_PROXY_ARGS="--master=http://192.168.139.145:8080 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"

配置完成后,通过syetemctl 启动kubelet和kube-proxy服务

systemctl daemon-reload

systemctl enable kubelet.service
systemctl start kubelet.service

systemctl enable kube-proxy.service
systemctl start kube-proxy.service

总结

kubelet默认采用向Master自动注册本Node的机制,在Master上查看各Node的状态,状态为Ready表示Node已经成功注册并状态为可用

我们在Master上,执行一下命令,查看它的工作节点:

$ kubectl get nodes

NAME              STATUS    AGE
192.168.139.146   Ready     4m