安装 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
[[email protected] ~]# 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 所以也就不能拉取镜像,就要配置一个私有的镜像仓库