Kubernetes是什么?
1.是一个全新的基于容器技术的分布式架构,是谷歌的Borg技术的一个开源版本
Borg是谷歌的一个久负盛名的内部使用的大规模集群管理系统,基于容器技术,目的是实现资源管理的自动化,垮多个数据中心的资源利用率的最大化
2.Kubernetes是一个开放的平台。不局限于任何一种语言,没有限定任何编程接口。
3.Kubernetes是一个完备的分布式系统支持平台。Kubernetes具有完备的集群管理能力。包括多层次的安全防护机制和准入机制,多租户应用支撑,透明的服务注册和服务发现机制,内建只能负载均衡器,强大的故障发现和自我修复能力,服务的滚动升级和在线扩容能力,可扩展的资源自动调动机制,以及多粒度的资源配额管理能力
为什么要用kubernetes?
kubernetes作为被业内认可的Docker分布式解决方案,实现微服务架构。微服务架构的核心是一个巨大的单体应用切分为多个很小的互相连接的微服务,一个微服务背后是多个实例的副本在进行支撑,副本数量可以根据系统的负荷进行调整,内嵌的负载均衡器自动实现调度。
kubernetes具备超强的横向扩容能力,可以横向扩展node数量,并且可以实现秒级的业务横向扩展,对于电商行业秒杀,拼团等等流量徒增时间和量不确定,以及大促期间需要整体进行扩容有极大的帮助,可将业务统一跑kubernetes上,而后端数据库都统一依赖云平台数据库服务,物理机或云主机自建。
大致了解了kubernetes后,我们来简单的了解一下kubernetes的基本概念
kubernetes的大部分概念,比如:node、pod、RepplicationController、Service等工具都可以看作一种“资源对象”,几乎所有的资源都可以通过kubernetes提供的kubectl工具进行增、删、改、查等操作并将其保存在etcd中持久化存储。
Master(主节点)
集群管理和控制节点,基本上kubernetes集群的所有控制命令都发给它,它来负责具体的执行过程
高可用集群需要配置三台Master
Master节点运行着以下进程:
● kubernetes api server提供了http rest接口的关键服务进程,是kubernetes里所有资源增、删、改、查等操作的唯一入口,也是集群控制的进程入口;
● kubernetes controller manager是kubernetes里所有资源对象的自动化控制中心;
● kubernetes scheduler负责资源调度Pod调度的进程。
在每个Master节点上还需启动一个etcd服务,用来保存所有资源对象的数据,在etcd中存储的时候以minion的方式存储
Node(节点)
在kubernetes集群中,除了master节点,其他节点都被称为node节点,在早期版本被称为minion
node是kubernetes集群的工作负载节点,node节点可为物理机,也可为虚拟机,每个node都会被master分配一些工作负载(docker容器),其上的工作负载会被master主动转移到其他节点上去。
Node节点上运行着的进程
● kubelet负责Pod对应的容器的创建,启停等任务,同时与matser节点密切协作,实现集群管理基本功能;
● kube-proxy实现kubernetes service的通信与负载均衡机制;
● docker engine docker引擎,负责本机的容器创建和管理。
node节点会动态的添加到kubernetes集群,由kubelet负责向master进行注册;
注册成功后kubelet会向master汇报自身情况,包括操作系统,docker版本,机器cpu和内存使用
master会根据Node资源使用进行调度
如果node长时间不上报,master会判断node失联,状态会变为Not ready,master会触发工作负载转移的流程。
Pod
pod是kubernetes最重要也是最基本的概念,包含一个活或多个紧密相关的容器和卷,每个pod都有一个特殊被称为“根容器”的Pause容器,
Pause容器对应的镜像属于kubernetes平台的一部分
kubernetes为什么会有pod的概念?
1.一组容器作为一个单元,我们不好对整体进行判断和有效的操作,如果一个容器宕机,是否看做整体宕机,而pod的状态代表整个容器组的状态;
2.Pod的多个容器使用pause容器的ip,共享挂载在pause容器的valume,简化了关联容器之间的通信,并很好解决的文件共享问题。
Service(服务)
Services也是Kubernetes的基本操作单元,是真实应用服务的抽象,每一个服务后面都有很多对应的容器来支持。
一个Service可以看作一组提供相同服务的Pod的对外访问接口。
Service作用于哪些Pod是通过Label Selector来定义的。
Replication Controller(RC)(pod副本控制器)
Replication Controller确保任何时候Kubernetes集群中有指定数量的pod副本(replicas)在运行, 如果少于指定数量的pod副本(replicas),Replication Controller会启动新的Container,反之会杀死多余的以保证数量不变。Replication Controller使用预先定义的pod模板创建pods,一旦创建成功,pod 模板和创建的pods没有任何关联,可以修改pod 模板而不会对已创建pods有任何影响,也可以直接更新通过Replication Controller创建的pods
Volume(存储卷)
Volume是Pod中能够被多个容器访问的共享目录,这个概念在Kubernetes和Docker中是类似的,Kubernetes的Volume被定义在Pod上,然后被Pod中的容器挂载,Volume的生命周期与Pod相同,Kubernetes支持多种类型的Volume,例如GlusterFS,Ceph等先进的分布式文件系统。
Label(标签)
Lable是一个key-value的键值对,需要由用户定义,附加到资源上,例如node,pod,service,rc等,每个资源可以有任意数量的label,同一个label也可以附加到任意的资源对象上,可以在资源创建的时候创建,也可以在资源创建的时候定义,也可以在创建完成后动态添加和删除。对资源创建一个或多个Label可以实现多维度的资源分组管理功能,这样可以更方便的进行资源分配,调度,配置和部署,然后通过Label Seletor查询或者筛选具有某些label的资源。
Namespace(命名空间)
Namespace是kubernetes用于实现多租户的资源隔离,将集群内部的容器对象分配到不同的Namespace中,形成逻辑上不同项目的分组,便于共享使用整个集群资源和分别管理。
了解了基本的概念后,我们下面就要开始上手搭建kubernetes的集群了
搭建kubernetes的集群方法有多种,可以使用kubeadm工具进行安装,可是VV使用之后,感觉并不是很爽,所以还是手搭集群吧
那么今天为大家带来kubernetes的1.5.2版本的集群搭建 :
kubernetes 1.5.2集群安装
一、环境准备
五台centos7系统
|
IP地址 |
主机名 |
角色 |
软件包 |
|
192.168.10.101 |
K8s.node1.com |
Master |
etcd、docker、kubernetes-master、flanneld |
|
192.168.10.102 |
K8s.node2.com |
Master |
etcd、docker、kubernetes-master、flanneld |
|
192.168.10.103 |
K8s.node3.com |
Master |
etcd、docker、kubernetes-master、flanneld |
|
192.168.10.104 |
K8s.node4.com |
Node |
Docker、kubernetes-node、flanneld |
|
192.168.10.105 |
K8s.node5.com |
Node |
Docker、kubernetes-node、flanneld |
1.1、关闭防火墙\关闭SeLinux:
systemctl stop firewalld.service && systemctl disable firewalld.service
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
yum -y install wget net-tools ntp ntpdate lrzsz
systemctl restart ntpdate.service ntpd.service && systemctl enable ntpd.service ntpdate.service
1.2、配置主机映射/etc/hosts (三台主机)
echo 192.168.10.101 k8s.node1.com >> /etc/hosts
echo 192.168.10.102 k8s.node2.com >> /etc/hosts
echo 192.168.10.103 k8s.node3.com >> /etc/hosts
echo 192.168.10.104 k8s.node4.com >> /etc/hosts
echo 192.168.10.105 k8s.node5.com >> /etc/hosts
echo 192.168.10.101 etcd >> /etc/hosts
echo 192.168.10.102 etcd >> /etc/hosts
echo 192.168.10.103 etcd >> /etc/hosts
[[email protected] ~]# hostnamectl --static set-hostname k8s.node1.com #node1操作
[[email protected] ~]# hostnamectl --static set-hostname k8s.node2.com #node2操作
[[email protected] ~]# hostnamectl --static set-hostname k8s.node3.com #node3 操作
[[email protected] ~]# hostnamectl --static set-hostname k8s.node4.com #node4 操作
[[email protected] ~]# hostnamectl --static set-hostname k8s.node5.com #node5 操作
二、安装配置etcd集群 (三个master节点同时操作):
[[email protected] ~]# yum install -y etcd //node1、node2、node3同时操作
2.1、配置etcd :
yum安装的etcd默认配置文件在/etc/etcd/etcd.conf,以下将三个节点上的配置贴出来,请注意不同点。
2379是默认的使用端口,为了防止端口占用问题的出现,增加4001端口备用。下面我将etcd.conf文件都备份到其他目录,只留下面这些内容:
node1的配置文件:
[[email protected] ~]# cat /etc/etcd/etcd.conf
# [member]
ETCD_NAME="etcd1"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" #集群内部通信使用的URL
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001" #供外部客户端使用的url
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://k8s.node1.com:2380" #广播给集群内其他成员访问的URL
ETCD_INITIAL_CLUSTER="etcd1=http://k8s.node1.com:2380,etcd2=http://k8s.node2.com:2380,etcd3=http://k8s.node3.com:2380" #初始集群成员列表
ETCD_INITIAL_CLUSTER_STATE="new" #初始集群状态,new为新建集群
ETCD_INITIAL_CLUSTER_TOKEN="k8s-etcd-cluster" #集群的名称
ETCD_ADVERTISE_CLIENT_URLS="http://k8s.node1.com:2379,http://k8s.node1.com:4001" #广播给外部客户端使用的url
Node2的配置文件:
[[email protected] ~]# cat /etc/etcd/etcd.conf
# [member]
ETCD_NAME="etcd2"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://k8s.node2.com:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://k8s.node1.com:2380,etcd2=http://k8s.node2.com:2380,etcd3=http://k8s.node3.com:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="k8s-etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://k8s.node2.com:2379,http://k8s.node2.com:4001"
node3的配置文件:
[[email protected] ~]# cat /etc/etcd/etcd.conf
# [member]
ETCD_NAME="etcd3"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://k8s.node3.com:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://k8s.node1.com:2380,etcd2=http://k8s.node2.com:2380,etcd3=http://k8s.node3.com:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="k8s-etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://k8s.node3.com:2379,http://k8s.node3.com:4001"
启动node1、node2、node3服务器上的etcd服务。
systemctl restart etcd
启动完成后,在任意节点执行etcdctl cluster-health命令来查看运行状态。
使用etcdctl member list 来查看集群中的成员列表。
Ok 到这里master节点的etcd集群就搭建完成!
三. 部署 master(三个master节点同时操作):
1. 安装 kubernetes docker ,设置开机自启动并开启服务
[[email protected] ~]# yum -y install kubernetes docker
[[email protected] ~]# systemctl start docker.service //我这里的宿主机磁盘空间不够导致docker服务起不来,清理足够的磁盘空间就可以了。
- 在 master 的虚机上,需要运行三个组件:Kubernets API Server、Kubernets Controller Manager、Kubernets Scheduler。
首先修改 /etc/kubernetes/apiserver 文件:
node1、node2、node3的配置一样:
[[email protected] ~]# grep -v "^#" /etc/kubernetes/apiserver | grep -v "^$"
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://etcd: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=""
3、接着修改 /etc/kubernetes/config 文件:(最后一句 k8s.nodex.com:8080 ,对应k8s.node1/2/3机器就好)
node1、node2、node3除了KUBE_MASTER的(k8s.nodeX.com这是对应本机域名或者ip),其它配置一样:
[[email protected] ~]# grep -v "^#" /etc/kubernetes/config | grep -v "^$"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http:///k8s.node1.com:8080" //改成k8s.node1.com、k8s.node2.com、k8s.node3.com
4、修改完成后,启动服务并设置开机自启动即可:
[[email protected] ~]# systemctl start kube-apiserver kube-controller-manager kube-scheduler
四、部署 node
1. 安装 docker ,设置开机自启动并开启服务
[[email protected] ~]# yum install docker -y
[[email protected] ~]# systemctl start docker && systemctl enable docker
2. 安装 kubernetes-node
[[email protected] ~]# yum install kubernetes-node -y
在 node 的虚机上,需要运行三个组件:Kubelet、Kubernets Proxy。
首先修改 /etc/kubernetes/config 文件:(注意:这里配置的是etcd的地址,也就是master1/2/3的地址其中之一)
Node4的配置:
[[email protected] ~]# grep -v "^#" /etc/kubernetes/config | grep -v "^$"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://etcd:8080"
Node5的配置:
[[email protected] ~]# grep -v "^#" /etc/kubernetes/config | grep -v "^$"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://etcd:8080"
3.接着修改 /etc/kubernetes/kubelet 文件:(注:--hostname-override= 对应的node机器)
Node4的配置:
[[email protected] ~]# grep -v "^#" /etc/kubernetes/kubelet | grep -v "^$"
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=k8s.node4.com"
KUBELET_API_SERVER="--api-servers=http://etcd:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
Node5的配置:
[[email protected] ~]# grep -v "^#" /etc/kubernetes/kubelet | grep -v "^$"
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=k8s.node5.com"
KUBELET_API_SERVER="--api-servers=http://etcd:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
4.修改完成后,启动服务并设置开机自启动即可:
[[email protected] ~]# systemctl start kubelet kube-proxy
5. 查看集群状态
在任意一台master上查看集群中节点及节点状态:
[[email protected] ~]# kubectl get node
至此,已经搭建了一个kubernetes集群了,但目前该集群还不能很好的工作,因为需要对集群中pod的网络进行统一管理。
五. 创建覆盖网络 flannel
1. 在master、node上均执行如下命令,安装 flannel
[[email protected] ~]# yum install flannel -y
2. 在master、node上均编辑 /etc/sysconfig/flanneld 文件
[[email protected] ~]# grep -v "^#" /etc/sysconfig/flanneld | grep -v "^$"
FLANNEL_ETCD_ENDPOINTS="http://etcd:2379"
FLANNEL_ETCD_PREFIX="/atomic.io/network"
3. 配置etcd中关于flannel的key
flannel使用etcd进行配置,来保证多个flannel实例之间的配置一致性,所以需要在etcd上进行如下配置(我是在node1上执行的):
[[email protected] ~]# etcdctl mk /atomic.io/network/config '{ "Network": "10.0.0.0/16" }'
(‘/atomic.io/network/config’这个key与上文/etc/sysconfig/flannel中的配置项FLANNEL_ETCD_PREFIX是相对应的,错误的话启动就会出错)
4. 启动修改后的 flannel ,并依次重启docker、kubernete
在 master 三台机器上执行:
[[email protected] ~]# systemctl start flanneld
[[email protected] ~]# systemctl restart kube-apiserver kube-controller-manager kube-scheduler flanneld
[[email protected] ~]# systemctl status kube-apiserver kube-controller-manager kube-scheduler flanneld
在 node 所有机器上执行(node4、node5):
[[email protected] ~]# systemctl start flanneld
[[email protected] ~]# systemctl restart kubelet kube-proxy
最后验证:
至此kubernetes高可用就搭建完成!步骤非常详细,如有不对希望大神们指点一二!!!!