前言
- 从二进制包部署 3节点环境(不要害怕,并不难)
- 介绍部署时各组件得作用,加强理解。
环境
操作系统:centos 7.5
Kubernetes版本:v1.8.13(1 master,2 node)
Docker版本: 18.03.1-ce
准备工作:
装3台 centos7.5得机器(本实验使用vmware虚拟机, 2G内存)
所有机器执行如下命令:
-
setenforce 0
(临时关闭selinux) -
sed -i /SELINUX=/cSELINUX=diabled /etc/selinux/config
(永久关闭selinux) -
systemctl stop firewalld
(关闭防火墙,手动配置端口规则更好) -
systemctl disable firewalld
(永久关闭防火墙)
下载k8s server&node 二进制包
server包:
https://dl.k8s.io/v1.8.13/kubernetes-server-linux-amd64.tar.gz
node 包:
https://dl.k8s.io/v1.8.13/kubernetes-node-linux-amd64.tar.gz
包参考地址, 版本v1.8.13
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.8.md#v1813
一:master 节点搭建
需要构建:
- etcd: 数据库
- API Server: 程序入口
- Scheduler: 调度器
- Controller Manager: 具体业务处理控制
1. 清空 docker环境
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
2. 安装etcd
etcd: 用于持久化存储集群中所有的资源对象,如Node、Service、Pod、RC、Namespace等;API Server提供了操作etcd的封装接口API,这些API基本上都是集群中资源对象的增删改查及监听资源变化的接口。这里记住它是存放信息得数据库即可。
yum install etcd -y
-
vi /etc/etcd/etcd.conf
修改,注意替换2个:
ETCD_NAME="default"
ETCD_DATA_DIR="/var/lib/etcd/default"
ETCD_LISTEN_CLIENT_URLS="http://:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://:2379"
- 启动:
systemctl enable etcd
systemctl start etcd
3. 构建k8s server应用目录
注:应用家目录为 /opt/kubernetes
将刚刚下载好得kubernetes-server-linux-amd64.tar.gz 拷进master节点上任意位置。
tar zxvf kubernetes-server-linux-amd64.tar.gz
mkdir -p /opt/kubernetes/{bin,cfg}
mv kubernetes/server/bin/{kube-apiserver,kube-scheduler,kube-controller-manager,kubectl} /opt/kubernetes/bin
4. 启动API Server 组件
API Server: 提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很“实时”地完成相关的业务功能。
- 创建 apiserver配置文件
vi /opt/kubernetes/cfg/kube-apiserver
添加如下内容,注意替换2个:
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL="--v=4"
# Etcd服务地址
KUBE_ETCD_SERVERS="--etcd-servers=http://:2379"
# API服务监听地址
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
# API服务监听端口
KUBE_API_PORT="--insecure-port=8080"
# 对集群中成员提供API服务地址
KUBE_ADVERTISE_ADDR="--advertise-address="
# 允许容器请求特权模式,默认false
KUBE_ALLOW_PRIV="--allow-privileged=false"
# 集群分配的IP范围
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.10.10.0/24"
- 注册为systemd服务
vi /lib/systemd/system/kube-apiserver.service
添加如下内容:
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver
#ExecStart=/opt/kubernetes/bin/kube-apiserver ${KUBE_APISERVER_OPTS}
ExecStart=/opt/kubernetes/bin/kube-apiserver \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${KUBE_ETCD_SERVERS} \
${KUBE_API_ADDRESS} \
${KUBE_API_PORT} \
${KUBE_ADVERTISE_ADDR} \
${KUBE_ALLOW_PRIV} \
${KUBE_SERVICE_ADDRESSES}
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 启动API Server
systemctl daemon-reload
systemctl enable kube-apiserver
systemctl restart kube-apiserver
5. 启动 Scheduler 组件
scheduler:集群中的调度器,负责Pod在集群节点中的调度分配
- 创建scheduler配置文件
vi /opt/kubernetes/cfg/kube-scheduler
添加如下内容,注意替换:
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=4"
KUBE_MASTER="--master=:8080"
KUBE_LEADER_ELECT="--leader-elect"
- 注册为systemd服务
vi /lib/systemd/system/kube-scheduler.service
添加如下内容:
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-scheduler
ExecStart=/opt/kubernetes/bin/kube-scheduler \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${KUBE_MASTER} \
${KUBE_LEADER_ELECT}
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 启动Scheduler
systemctl daemon-reload
systemctl enable kube-scheduler
systemctl restart kube-scheduler
6. 启动Controller Manager组件
controller manager:集群内部的管理控制中心,其主要目的是实现Kubernetes集群的故障检测和恢复的自动化工作,比如根据RC的定义完成Pod的复制或移除,以确保Pod实例数符合RC副本的定义;根据Service与Pod的管理关系,完成服务的Endpoints对象的创建和更新;其他诸如Node的发现、管理和状态监控、死亡容器所占磁盘空间及本地缓存的镜像文件的清理等工作也是由Controller Manager完成的。
- 创建controller manager 配置文件
vi /opt/kubernetes/cfg/kube-controller-manager
添加如下内容,注意替换:
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=4"
KUBE_MASTER="--master=:8080"
- 注册为systemd服务
vi /lib/systemd/system/kube-controller-manager.service
添加如下内容:
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-controller-manager
ExecStart=/opt/kubernetes/bin/kube-controller-manager \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${KUBE_MASTER} \
${KUBE_LEADER_ELECT}
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 启动Controller Manager
systemctl daemon-reload
systemctl enable kube-controller-manager
systemctl restart kube-controller-manager
7. 查看服务启动情况
ps aux | grep kube
可以看到3个组件得启动情况如下:
二:node节点搭建
需要构建:
- docker
- kubelet: 具体业务处理者
- kube-proxy: 负载均衡器
1. docker环境
- 清空旧环境:
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
- 安装docker:
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce
systemctl start docker
systemctl enable docker
2. 构建k8s node节点应用目录
注:应用家目录为 /opt/kubernetes
将刚刚下载好得kubernetes-node-linux-amd64.tar.gz 拷进node节点上任意位置。
tar zxvf kubernetes-node-linux-amd64.tar.gz
mkdir -p /opt/kubernetes/{bin,cfg}
mv kubernetes/node/bin/{kubelet,kube-proxy} /opt/kubernetes/bin/
3. 启动Kubelet组件
kubelet: 负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。
- 创建kubeconfig配置文件,用于连接master节点api server
vi /opt/kubernetes/cfg/kubelet.kubeconfig
添加如下内容,注意替换:
apiVersion: v1
kind: Config
clusters:
- cluster:
server: http://:8080
name: local
contexts:
- context:
cluster: local
name: local
current-context: local
- 创建kublet配置文件
vi /opt/kubernetes/cfg/kubelet
添加如下内容,注意替换两个:
# 启用日志标准错误
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL="--v=4"
# Kubelet服务IP地址
NODE_ADDRESS="--address="
# Kubelet服务端口
NODE_PORT="--port=10250"
# 自定义节点名称
NODE_HOSTNAME="--hostname-override="
# kubeconfig路径,指定连接API服务器
KUBELET_KUBECONFIG="--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig"
# 允许容器请求特权模式,默认false
KUBE_ALLOW_PRIV="--allow-privileged=false"
# DNS信息
KUBELET_DNS_IP="--cluster-dns=10.10.10.2"
KUBELET_DNS_DOMAIN="--cluster-domain=cluster.local"
# 禁用使用Swap
KUBELET_SWAP="--fail-swap-on=false"
- 注册systemd服务
vi /lib/systemd/system/kubelet.service
添加如下内容:
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kubelet
ExecStart=/opt/kubernetes/bin/kubelet \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${NODE_ADDRESS} \
${NODE_PORT} \
${NODE_HOSTNAME} \
${KUBELET_KUBECONFIG} \
${KUBE_ALLOW_PRIV} \
${KUBELET_DNS_IP} \
${KUBELET_DNS_DOMAIN} \
${KUBELET_SWAP}
Restart=on-failure
KillMode=process
[Install]
WantedBy=multi-user.target
- 启动Kubelet
启动之前要先关闭swap
swapoff -a
systemctl daemon-reload
systemctl enable kubelet
systemctl restart kubelet
4. 启动kube-proxy组件
kube-proxy: 实现了Service的代理与软件模式的负载均衡器。创建了service得pods,此组件决定由哪个pod进行服务。
- 创建kube-proxy配置文件
vi /opt/kubernetes/cfg/kube-proxy
添加如下内容,注意替换和 :
# 启用日志标准错误
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL="--v=4"
# 自定义节点名称
NODE_HOSTNAME="--hostname-override="
# API服务地址
KUBE_MASTER="--master=http://:8080"
- 注册systemd服务
vi /lib/systemd/system/kube-proxy.service
添加如下内容:
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy
ExecStart=/opt/kubernetes/bin/kube-proxy \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${NODE_HOSTNAME} \
${KUBE_MASTER}
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 启动kube-proxy
systemctl daemon-reload
systemctl enable kube-proxy
systemctl restart kube-proxy
5. 查看服务启动情况
ps aux |grep kube
可以看到两个组件得启动详情如下:
三:查看集群状态
在master节点执行如下命令:
- 将可执行文件添加到系统变量,方便使用
echo "export PATH=$PATH:/opt/kubernetes/bin" >> /etc/profile
source /etc/profile
- 查看集群节点
kubectl get node
显示如下:
四:增加新节点到集群
至此,已经完成了双节点搭建。第三个node节点得搭建参考前面node节点搭建。
只需修改kubelet配置文件中的--address和--hostname-override选项为本机IP。
五: 进阶
以上3节点部署只是非常基础得版本,还有许多待改进得地方:
- etcd&apiserver集群模式
- Flannel网络部署:当我们启动 Docker 后会有一个用于和容器进行交互的 IP 地址,如果不去管理的话可能这个 IP 地址在各个机器上是一样的,并且仅限于在本机上进行通信,无法访问到其他机器上的 Docker 容器。Flannel 的目的就是为集群中的所有节点重新规划 IP 地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的 IP 地址,并让属于不同节点上的容器能够直接通过内网 IP 通信。
下一章将介绍初步使用k8s
https://www.jianshu.com/p/bc015e562b16
注意事项:
- master节点上得etcd和apiserver启动顺序有要求:先启动etcd再启动apiserver