安装 kubernetes 的三种方法

  • 利用包管理工具安装:如 yum, apt 等
  • 在 github 上的 Kubernetes 项目页下载编译好的二进制包
  • 下载源码然后编译安装

这里用第二种方法来安装一下 Kubernetes。

各组件的版本

组件

版本

备注

Kubernetes

1.3.0

从 github 上下载的

Docker

1.13.1

centos 7 上用 yum 安装

etcd

3.0

下载二进制文件安装

下载页面:https://github.com/kubernetes/kubernetes/releases?after=v1.3.1

下载地址:https://github.com/kubernetes/kubernetes/releases/download/v1.3.0/kubernetes.tar.gz

压缩包 kubernetes.tar.gz 内包含了 Kubernetes 的服务程序文件、文档和示例。

解压缩之后,server 子目录中的 kubernetes-server-linux-amd64.tar.gz 文件包含了 Kubernetes 需要运行的全部服务程序文件。

文件名

说明

hyperkube

总控程序,用于运行其他 Kubernetes 程序

kube-apiserver

apiserver 主程序

kube-apiserver.docker_tag

apiserver docker 镜像的 tag

kube-apiserver.tar

apiserver docker 镜像文件

kube-controller-manager

controller-manager 主程序

kube-controller-manager.docker_tag

controller-manager docker 镜像的 tag

kube-controller-manager.tar

controller-manager docker 镜像文件

kubectl

客户端命令工具

kubelet

kubelet 主程序

kube-proxy

proxy 主程序

kube-scheduler

scheduler 主程序

kube-scheduler.docker_tag

scheduler docker 镜像的 tag

kube-scheduler.tar

scheduler docker 镜像文件

Master 和 Node 节点上需要安装的程序

节点

需要安装的程序

Kubernetes Master

etcd、kube-apiserver、kube-controller-manager、kube-scheduler

Kubernetes Node

kubelet、kube-proxy

Kubernetes 还提供了一个“all-in-one”的 hyperkube 程序来完成对以上服务程序的启动。

关闭防火墙

由于是实验阶段,可以直接把防火墙给关了,这样的话可以避免很多意想不到的困难。

# 禁用虚拟机
systemctl disable firewalld
# 关闭防火墙
systemctl stop firewalld

Master 上的 etcd、kube-apiserver、kube-controller-manager、kube-scheduler 服务

将 Kubernetes 的可执行文件复制到 /user/bin,如果复制到其他目录,则将 systemd 服务文件中的文件路径修改正确即可。

etcd 服务

etcd 服务作为 Kubernetes 集群的主数据库,在安装 Kubernetes 个服务之前需要首先安装和启动。

从 GitHub 官网下载 etcd 发布的二进制文件,将 etcd 和 etcdctl 文件复制到 /usr/bin 目录

systemd 服务文件 /usr/lib/systemd/system/etcd.service:

etcd 下载页面:https://github.com/etcd-io/etcd/releases?after=v3.0.1

etcd 下载地址:https://github.com/etcd-io/etcd/releases/download/v3.0.0/etcd-v3.0.0-linux-amd64.tar.gz

# 下载 etcd 的二进制文件
wget https://github.com/etcd-io/etcd/releases/download/v3.0.0/etcd-v3.0.0-linux-amd64.tar.gz
# 解压
tar zxvf etcd-v3.0.0-linux-amd64.tar.gz
# 将etcd和 etcdctl 复制到 /usr/bin 目录
mv etcd etcdctl /usr/bin
# 创建 systemd 服务文件

systemd 服务文件 /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
  • WorkingDirectory(/var/lib/etcd) 表示etcd 数据保存的目录, 需要在 etcd 服务启动前进行创建
  • 配置文件 /etc/etcd/etcd/conf 通常不需要特别的参数配置
  • etcd 监听地址默认是 http://127.0.0.1:2379
# 创建 etcd 的数据目录
mkdir /var/lib/etcd

# 加入到开机列表并启动服务
systemctl daemon-reload
systemctl enable etcd.service
systemctl start etcd.service

# 验证是否启动正确
etcdctl cluster-health

[root@localhost ~]# etcdctl cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://localhost:2379
cluster is healthy

到这一阶段 etcd 已经装好了

kube-apiserver 服务

先下载好对应的版本呢,然后解压,把这几个复制到 /usr/bin 下

mv kube-apiserver kube-controller-manager kube-scheduler /usr/bin

将 kube-apiserver 的可执行文件复制到 /usr/bin 目录,编辑systemd 服务文件 /usr/lib/systemd/system/kube-apiserver.service,内容如下:

Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
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

配置文件 /etc/kubernetes/apiserver 的内容包括了 kube-apiserver 的全部启动参数,主要的配置参数在变量 KUBE_API_ARGS 中指定

cat /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"

启动参数说明

kube-controller-manager 服务

cat /usr/lib/systemd/system/kube-controller-manager.server

[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
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=65535

[Install]
WantedBy=multi-user.target

配置文件/etc/kubernetes/controller-manager 的内容包括了 kube-controller-manager 的全部启动参数,主要的配置参数在变量 KUBE_CONTROLLER_MANAGER_ARGS 中指定。

# cat /etc/kubernetes/controller-manager
KUBE_CONTROLLER_MANAGER_ARGS="--master=http:192.168.18.3:8080 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"

kube-scheduler 服务

kube-scheduler 服务也依赖于 kube-apiserver 服务

cat /usr/lib/systemd/system/kube-scheduler.service

[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=kbue-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

配置文件 /etc/kubernetes/scheduler 的内容包括了 kube-scheduler 的全部启动参数,主要的配置参数在变量 KUBE_SCHEDULER_ARGS 中指定

cat /etc/kubernetes/scheduler

KUBE_SCHEDULER_ARGS="--master=http://192.168.18.3:8080 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"
#systemctl start 命令启动这三个服务
#systemctl enable 将服务加入开机启动


systemctl daemon-reload
systemctl enable kube-apiserver.service
systemctl start kube-apiserver.service
systemctl enable kube-controller-manager
systemctl start kube-controller-manager
systemctl enable kube-scheduler
systemctl start kube-scheduler

# systemctl status <service_name> 来验证服务的启动状态
# running 表示启动成功

至此 Master 上的服务就全部启动完成了,嗯,有啥问题多看看日志啥的

Node 上的 kubelet、kube-proxy服务

在Node 节点上需要预先安装好 Docker Daemon,并且正常启动。

kubelet 服务

kubelet 服务依赖于 Docker 服务

cat /usr/lib/systemd/system/kubelet.service

[Unit]
Description=Kubernetes Kubelete Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
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

WorkingDirectory 表示 kubelet 保存数据的目录,需要在 kubelet 启动之前创建。

配置文件 /etc/kubernetes/kubelet 的内容包括了 kubelet 的全部启动参数

cat /etc/kubernetes/kubelet

KUBELET_ARGS="--api-server=http://192.168.12.201:8080 --hostname-override=192.168.12.201 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"

启动参数的说明如下

kube-proxy 服务

kube-proxy 服务依赖于 network 服务

[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.service
Requires=network.service

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

[Install]
WantedBy=multi-user.target

配置文件 /etc/kubernetes/proxy 的内容包括了 kube-proxy 的全部启动参数

cat /etc/kubernetes/proxy

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

kubelet 和 kube-proxy 服务的启动命令

systemctl daemon-reload
systemctl enable kubelet.service
systemctl start kubelet.service
systemctl enable kube-proxy
systemctl start kube-proxy
mv kubelet kube-proxy /usr/bin

Kubernetes 集群的安全设置

1. 基于 CA 签名的双向数字证书认证方式

如果只是在内网环境中, Kubernetes 的各个组件与 Master 之间可以通过 apiserver 的非安全端口 http://apiserver:8080 进行访问。如果 apiserver 需要对外提供服务,或者集群中的某些容器也要通过 apiserver 以获取集群中的某些信息,则更安全的做法是启用 HTTPS 安全机制。

Kubernetes 提供了:

  • 基于 CA 签名的双向数字证书认证
  • 基于 HTTP BASE 或者 TOKEN 的认证方式

其中 CA 的安全性更高。

2. 基于 HTTP BASE 或 TOKEN 的简单认证方式

Kubernetes 的版本升级

Kubernetes 的版本升级需要考虑到当前集群中正在运行的容器不受影响。应对集群中的各个Node 逐个进行隔离,然后等待在其上运行的容器全部执行完成,再更新该 Node 上的 kubelet 和 kube-proxy 服务,将全部 Node 都更新完后,最后更新 Master 服务。

  • 通过官网获取最新的二进制包 kubernetes.tar.gz,解压后提取二进制文件
  • 逐个隔离Node,等待在其上运行的服务全部容器工作完成,更新 kubelet 和 kube-proxy 服务文件,然后重启这两个服务
  • 更新 Master 的 kube-apiserver、kube-controller-manager、kube-scheduler 服务文件并重启

内网中的 Kubernetes 配置

其实就是因为很多情况下内网都不能访问 Internete 所以也就不能拉取镜像,就要配置一个私有的镜像仓库