部署环境
由于是测试搭建kubernetes
集群环境,所以我只用了两台机器进行,一台用作Master
节点,一台用作Node
节点。不过原理上是一样的,即使加机器,搭建步骤也是一样的。
Kubernetes Master节点:10.0.11.150
Kubernetes Node节点:10.0.11.152
部署软件
docker:1.12.6
kubernetes:1.5.2
CentOS:7.3
关闭防火墙
在每台机器上执行下面的命令,关闭防火墙并启用ntp
// 关闭防火墙
systemctl stop firewalld
// 禁用防火墙
systemctl disable firewalld
//安装ntp
yum -y install ntp
//启用ntp
systemctl start ntpd
//加入开机启动
systemctl enable ntpd
Kubernetes Master节点的安装与配置
Kubernetes Master
指的是集群控制节点,每个Kubernetes
集群里需要有一个Master
节点来负责整个集群的管理和控制,基本上Kubernetes
的所有控制命令都发给他,他来负责具体的执行过程,我们后面执行的所有命令基本上都是在Master
节点上运行的。Master
节点通常会占据一个独立的服务器(高可用部署建议用3台服务器),其主要原因是他太重要了,是整个集群的首脑,如果宕机或者不可用,那么对集群内容器应用的管理都将失效。
Master
节点上运行以下一组关键进程:
1. Kubernetes API Server
(kube-apiserver
):提供了HTTP Rest
接口的关键服务进程,是Kubernetes
里所有资源的增删改查等操作的唯一入口,也是集群控制的入口进程。
2. Kubernetes Controller Manager
(kube-controller-manager
):Kubernetes
里所有资源对象的自动化控制中心,可以理解为资源对象的大总管。
3. Kubernetes Scheduler
(kube-scheduler
):负责资源调度(Pod调度
)的进程,相当于公交公司的调度室。
另外,在Master
节点上需要启动一个etcd
服务,因为Kubernetes
里的所有资源对象的数据全部是保存在etcd中的。
安装etcd、docker、kubernetes
yum -y install etcd docker kubernetes
etcd配置
配置文件位置:/etc/etcd/etcd.conf
etcd配置主要是ETCD_LISTEN_CLIENT_URLS
、ETCD_ADVERTISE_CLIENT_URLS
这两项。
// 节点名称
ETCD_NAME=default
// 数据存放位置
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
// 监听客户端地址,这里要注意,设置成0.0.0.0,并且Master节点、Node节点端口要一致
// 这样Master才能和Node节点互通,否则Node节点的flanneld无法正常启动
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
// 通知客户端地址,本地地址
ETCD_ADVERTISE_CLIENT_URLS="http://127.0.0.1:2379"
其中ETCD_LISTEN_CLIENT_URLS=”http://0.0.0.0:2379”表示etcd在2379端口上监听所有网络接口。
Kubernetes配置
config配置文件位置:/etc/kubernetes/config
kubernetes配置主要配置KUBE_MASTER
,其他项使用默认即可。
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
// 本机IP:PORT
KUBE_MASTER="--master=http://10.0.11.150:8080"
KUBE_MASTER="--master=http://10.0.11.150:8080"
是将Kubernetes
的apiserver
进程的服务地址告诉Kubernetes
的controller-manager
, scheduler
和proxy
进程。
apiserver配置文件位置:/etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBELET_PORT="--kubelet-port=10250"
// 本机IP:PORT
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
KUBE_API_ARGS=""
这些配置让apiserver
进程在8080
端口上监听所有网络接口,并告诉apiserver
进程etcd
服务的地址。
flannel网络配置
配置etcd
中关于flannel
的key
(这个只在安装了etcd的机器上操作,这里只在Master节点安装etcd)
flannel
使用etcd
进行配置,来保证多个flannel
实例之间的配置一致性,所以需要在etcd
上进行如下配置:
// 直接在linux命令行执行下面这条命令,前提是安装etcd
etcdctl mk /atomic.io/network/config '{"Network":"10.1.0.0/16"}'
'/atomic.io/network'
这个key
要与后面配置的Master
节点和Node
节点中/etc/sysconfig/flannel
中的配置项FLANNEL_ETCD_PREFIX
相对应,错误的话启动就好报错。
注:上面flannel设置的ip网段可以任意设定,随便设定一个网段都可以。容器的ip就是根据这个网段进行自动分配的,ip分配后,容器一般是可以对外联网的(网桥模式,只要宿主机能上网就可以
flannel配置
问题及安装原因
首次安装我并没有在master节点安装flannel,导致再安装了kubernetes-dashboard之后,无法通过http:masterIP:8080/ui访问dashboard后台(页面显示错误在下方)。经过折磨人的检查过程,排除了配置的问题之后,发现是由于集群内部网络不通导致的。。再然后通过试验发现master节点安装配置好flannel之后就没问题了。。所以还是在master节点安装flannel吧。。
// kubernetes-dashboard 打开后台报错
kubernetes Error: 'dial tcp 10.1.93.3:9090: getsockopt: no route to host'
安装flannel
yum -y install flannel
配置文件
打开flannel配置文件:/etc/sysconfig/flanneld
# etcd集群master地址,即上面配置的etcd地址,若etcd和flannel安装在同一台集群,则使用127.0.0.1也行
FLANNEL_ETCD_ENDPOINTS="http://127.0.0.1:2379"
# flannel网络配置的key,上面设置的flannel网络配置中的key前缀
FLANNEL_ETCD_PREFIX="/atomic.io/network"
启动flannel
# 启动flannel
systemctl start flanneld
# 重启flannel
systemctl restart flanneld
# 查看flannel状态
systemctl status flanneld
启动Master服务
启动Kubernetes Master
节点上的etcd
, docker
, kube-apiserver
, kube-controller-manager
和kube-scheduler
进程并查看其状态
// 一个小shell脚本,循环启动这些服务,要按照这里的顺序启动服务
for SERVICES in etcd docker kube-apiserver kube-controller-manager kube-scheduler; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done
现在我们可以使用kubectl get nodes
命令来查看,当然,目前还没有Node节点加入到该Kubernetes集群,所以命令的执行结果是空的:
Kubernetes Node节点的安装与配置
除了Master
,Kubernetes
集群中的其他集群被称为Node
节点,在较早版本中也被称为Minion
。与Master
一样,Node
节点可以使一台物理机,也可以是一台虚拟机。Node
节点才是Kubernetes
集群中的工作负载节点
,每个Node
都会被Master
分配一些工作负载(Docker容器
),当某个Node
宕机时,其上的工作负载会被Master
自动转移到其他节点上去。
每个Node
节点都运行着以下一组关键进程:
1. kubelet
:负责Pod
对应的容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。
2. kube-proxy
:实现Kubernetes Service
的通信与负载均衡机制的重要组件。
3. Docker Engine(docker)
:Docker引擎,负责本机的容器创建和管理工作。
Node节点可以在运行期间动态增加到Kubernetes集群中,前提是这个节点上已经正确安装、配置和启动了上述关键进程,在默认情况下kubelet
会向Master
注册自己,这也是Kubernetes推荐的Node管理方式。一旦Node被纳入集群管理范围,kubelet
进程就好定时向Master节点汇报自身的情报,例如操作系统、Docker版本、机器的CPU和内存情况,以及当前有哪些Pod在运行等,这样Master可以获知每个Node的资源使用情况。并实现高效均衡的资源调度策略。而某个Node超过指定时间不上报信息时,会被Master判定为‘失联’
,Node的状态被标记为不可用(Not Ready
)。随后Master会触发‘工作负载大转移’的自动流程。
安装 flannel, docker和Kubernetes
yum -y install flannel docker kubernetes
flannel 配置
配置文件位置:/etc/sysconfig/flanneld
// Master节点etcd配置IP:PORT
FLANNEL_ETCD_ENDPOINTS="http://10.0.11.150:2379"
// Master节点配置的flannel中的key
FLANNEL_ETCD_PREFIX="/atomic.io/network"
#FLANNEL_OPTIONS=""
配置信息告诉flannel进程etcd服务的位置以及在etcd上网络配置信息的节点位置
Kubernetes配置
配置文件位置:/etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
//Master节点的kube url
KUBE_MASTER="--master=http://10.0.11.150:8080"
KUBE_MASTER=”–master=http://10.0.11.150:8080“是将Kubernetes的apiserver进程的服务地址告诉Kubernetes的controller-manager, scheduler和proxy进程。
kubelet配置
配置文件位置:/etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="--port=10250"
// 本机IP,每个节点都不一样
KUBELET_HOSTNAME="--hostname-override=10.0.11.152"
// Master节点配置的server
KUBELET_API_SERVER="--api-servers=http://10.0.11.150:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
注意:KUBELET_POD_INFRA_CONTAINER
: kubelet配置文件中的KUBELET_POD_INFRA_CONTAINER
该配置项指的是在Pod创建启动时,会从该地址下载pod-infrastructure
镜像并随pod启动,但是默认的镜像下载地址国内会出现下载失败情况,导致pod启动失败,因此建议将该pod下载下来,并保存到本地的Docker私有库中。然后修改该配置项的值。我这里将该配置项修改为:
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.11.150:5000/rhel7/pod-infrastructure:v1.0.0"
启动Node服务
启动kube-proxy
kubelet
flanneld
和docker
进程并查看其状态
// 注意启动顺序,flanneld需要在docker前启动
for SERVICES in kube-proxy kubelet flanneld docker; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done
将每个服务启动并设置成开启启动,然后查看服务状态
最后,在Master节点使用kubectl get nodes
命令来查看,可以看到节点信息: