一、 kubernetes和相关组件介绍

1、 kubernetes概述
Kubernetes是google开源的容器集群管理系统,基于docker构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、动态扩展等功能套件。基于容器的云平台
Kubernetes基于docker容器的云平台,简称k8s
openstack基于kvm的容器云平台

2、 kubernetes架构设计图

k8s可视化容器组删掉自动又生成 k8s容器管理平台_容器编排工具k8s


3、 kubernetees常见组件介绍

 master:kubernetes管理节点

 apiserver:提供接口服务,用户通过apiserver来管理整个容器集群平台。apiserver负责和etcd交互(其他组件不会直接操作etcd,只有apiserver这么做)。整个kubernetes集群的所有交互都是以apiserver为核心。如:1、所有对集群进行的查询和管理都要通过api来进行。2、所有模块之间并不会互相调用,而是通过和apiserver交互来完成自己的工作,apiserver提供的验证和授权保证了整个集群的安全。

 schedule:kubernetes的调度服务

 replication controllers:复制,保证pod的高可用

replication controller是kubernetes系统中最有用的功能(实现多个pod副本),往往一个应用需要多个pod来支撑,并且可以保证其复制的副本数,即使副本所调度的宿主机异常,通过replication controller可以保证在其它宿主机启动同等数量的pod,replication controller可以通过repcon模板来创建多个pod副本,同样也可以直接复制已存在pod,需要通过label selector来关联。

 minion:真正运行容器container的物理机,kubernetes中需要很多minion机器,来提供运算。

 container:容器,可以运行服务和程序

 pod:在kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象一个个的pod。pod是一个可以被创建、销毁、调度、管理的最小部署单元。pod中可包括一个或一组容器。

 kube-proxy:代理。做端口转发,相当于LVS-NAT模式中的负载调度器。proxy解决了统一宿主机,相同服务端口冲突的问题,还提供了对外服务的能力,proxy后端使用了随机、轮询负载均衡算法。

 etcd:etcd存储kubernetes的配置信息。可以理解为k8s数据库,存储着k8s容器云平台中所有节点、pods、网络等信息

 services:services是kubernetes最外围的单元,通过虚拟一个访问IP及服务端口,可以访问我们定义好的pod资源,目前的版本是通过IPtables的nat来转发实现的。转发的目标端口为kube_proxy生成的随机端口

 label:标签。用来区分pod、service、replication controller的key/value键值对,仅使用在pod、service、replication controller之间的关系识别,但对这些单元本身进行操作时得使用name标签。

 deployment:用于更新pod和replica set。可以再deployment对象中只描述你所期望的理想状态,deployment控制器会将现在的实际状态转成期望状态。

例如:将所有的webapp:v1.0.9升级成webAPP:v1.1.0,只需要创建一个deployment,kubernetes会按照deployment自动进行升级。通过deployment可以用来创建新的资源。如pod,替换已经存在的资源等。

deployment集成了上线部署、滚动升级、创建副本、暂停上线任务、恢复上线任务、回滚到以前某个版本的deployment功能。在某种程度上deployment可以帮助我们实现无人值守的上线。

 kubelet:kubelet和kube-proxy都运行在node节点

kubelet组件管理pod和pod中容器及容器的镜像和卷信息

kube-proxy实现kubernetes网络相关内容

总结:各个组件之间的关系
 Kubernetes的架构由一个master和多个minion(node)组成,master通过api提供服务,接受kubectl的请求来调度和管理整个集群。
 replication controller定义了多个pod或者容器需要运行。如果当前集群中运行的pod或容器达不到配置数量,replication controller会调度容器在多个minion上运行,保证集群中的pod数量。
 service则定义真实对外提供服务,一个service会对应后端运行的多个container
 Kubernetes是个管理平台,minion上的proxy拥有提供真实服务公网IP。客户端访问kubernetes中提供的服务,直接访问到kube-proxy上。
 Kubernetes中pod是一个基本单元,一个pod可以提供相同功能的多个container,这些容器都会被部署在同一个minion上。minion是运行kubelet中容器的物理机。minion接受master的指令创建pod或者容器。

二、 搭建kubernetes容器集群管理系统

1、 环境说明

k8s可视化容器组删掉自动又生成 k8s容器管理平台_k8s可视化容器组删掉自动又生成_02


注:node3属于扩容节点,初期只有node1和node2两个minion

2、 配置yum源
搭建kubernetes,需要很多依赖包和插件,这里有两种方式安装:通过网络源yum安装和通过本地源yum安装

方法一:本地源yum安装
上传提前下载好的k8s相关依赖包和插件,上传到服务器,并解压缩
把k8s-package.tar.gz上传到xuegod120 系统中::
[root@xuegod120 ~]# tar zxvf k8s-package.tar.gz

创建k8s-yum源文件
[root@xuegod120 ~]# vim /etc/yum.repos.d/k8s-package.repo
[k8s-package]
name=k8s-package
baseurl=file:///root/k8s-package
enabled=1
gpgcheck=0

配置centos-yum源文件
[root@xuegod120 ~]# mount /dev/cdrom /mnt/
[root@xuegod120 ~]# vim /etc/yum.repos.d/centos7.repo
[centos7]
name=CentOS7
baseurl=file:///mnt
enable=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm
gpg/RPM GPG KEY CentOS 7
[root@xuegod120 yum.repos.d]# mv /etc/yum.repos.d/CentOS Base.repo /opt/ 删除外
网源

方法二:网络yum源安装
推荐使用阿里云的网络源,不要用官方源。直接安装kubernetes即可
[root@master-120 ~]# ll /etc/yum.repos.d/
总用量 8
-rw-r–r--. 1 root root 2523 6月 16 2018 CentOS-Base.repo
-rw-r–r--. 1 root root 664 6月 14 23:47 epel-aliyun.repo

3、 修改master和node节点主机名和hosts文件
[root@docker-120 ~]# hostnamectl set-hostname master
[root@docker-130 ~]# hostnamectl set-hostname node1
[root@docker-140 ~]# hostnamectl set-hostname node2
[root@docker-150 ~]# hostnamectl set-hostname node3
[root@docker-120 ~]# vim /etc/hosts #所有节点都需要修改
192.168.1.120 master
192.168.1.130 node1
192.168.1.140 node2
192.168.1.150 node3

4、 在master和node节点安装k8s组件
master节点安装:
[root@master ~]# yum -y install kubernetes etcd flannel ntp
注:Flannel类似于交换机硬件中的VXLAN功能,为Docker提供一种可配置的虚拟网络
 Flannel在每一台主机上运行一个 agent。
 flanneld,负责在提前配置好的地址空间中分配子网租约。Flannel使用etcd来存储网络配置。
 ntp 主要用于同步容器云平台中所有结点的时间。 云平台中结点的时间需要保持一致。
 kubernetes 中包括了服务端和客户端相关的软件包

node节点安装:
[root@node1 ~]# yum -y install kubernetes docker flannel ntp
[root@node2 ~]# yum -y install kubernetes docker flannel ntp

5、 配置etcd配置文件(master节点)
修改etcd配置文件
[root@master ~]# vim /etc/etcd/etcd.conf
[root@master ~]# grep -v ‘^#’ /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS=“http://localhost:2379,http://192.168.1.120:2379”
ETCD_NAME=“default”
ETCD_ADVERTISE_CLIENT_URLS=http://192.168.1.120:2379
注:
ETCD_NAME=“etcd”
etcd节点名称,如果etcd集群只有一个node,这一项可以注释不用配置,默认名称为default,这个名字后面会用到。
ETCD_DATA_DIR="-data-dir /home/data/etcd"
etcd存储数据的目录
ETCD_LISTEN_CLIENT_URLS=“http://localhost:2379,http://192.168.1.120:2379”
etcd对外服务监听地址,一般指定2379端口,如果为0.0.0.0将会监听所有接口
ETCD_ARGS=""
需要额外添加的参数,可以自己添加,etcd的所有参数可以通过etcd -h查看。
etcd通讯使用2379端口

启动etcd服务,并设置开机启动
[root@master kubernetes]# systemctl start etcd
[root@master kubernetes]# systemctl enable etcd

查看etcd是否启动
[root@master kubernetes]# netstat -antup | grep 2379
tcp 0 0 127.0.0.1:2379 0.0.0.0:* LISTEN 12557/etcd
tcp 0 0 192.168.1.120:2379 0.0.0.0:* LISTEN 12557/etcd

查看etcd fluster状态
[root@master ~]# etcdctl cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://192.168.1.120:2379
cluster is healthy

查看成员集群列表
[root@master ~]# etcdctl member list
8e9e05c52164694d: name=default peerURLs=http://localhost:2380 clientURLs=http://192.168.1.120:2379 isLeader=true

6、 配置master相关配置文件(master节点)
[root@master ~]# cd /etc/kubernetes/
[root@master kubernetes]# ll
总用量 24
-rw-r–r-- 1 root root 767 7月 3 2017 apiserver
-rw-r–r-- 1 root root 655 7月 3 2017 config
-rw-r–r-- 1 root root 189 7月 3 2017 controller-manager
-rw-r–r-- 1 root root 615 7月 3 2017 kubelet
-rw-r–r-- 1 root root 103 7月 3 2017 proxy
-rw-r–r-- 1 root root 111 7月 3 2017 scheduler
注:master节点上运行的组件有:etcd服务(已配置)、apiserver、flannel、schedule、kubelet、config、controller-manager。

先配置config
[root@master kubernetes]# vim config
[root@master kubernetes]# grep -v ‘^#’ config
KUBE_LOGTOSTDERR="–logtostderr=true"
KUBE_LOG_LEVEL="–v=0"
KUBE_ALLOW_PRIV="–allow-privileged=false"
KUBE_MASTER="–master=http://192.168.1.120:8080"
注:
KUBE_LOGTOSTDERR="–logtostderr=true" #表示错误日志记录到文件还是输出到stderr。
KUBE_LOG_LEVEL="–v=0" ##日志等级。
KUBE_ALLOW_PRIV="–allow_privileged=false" #允许运行特权容器。false表示不允许特权容器

配置apiserver
[root@master kubernetes]# vim apiserver
[root@master kubernetes]# grep -v ‘^#’ apiserver
KUBE_API_ADDRESS="–insecure-bind-address=0.0.0.0"
KUBE_ETCD_SERVERS="–etcd-servers=http://192.168.1.120:2379"
KUBE_SERVICE_ADDRESSES="–service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="–admission-control=AlwaysAdmit"
KUBE_API_ARGS=""
注:
KUBE_API_ADDRESS="–insecure-bind-address=0.0.0.0"
监听的接口,如果配置为127.0.0.1则只监听localhost,配置为0.0.0.0会监听所有接口,这里配置为0.0.0.0。
KUBE_ETCD_SERVERS="–etcd-servers=http://192.168.1.63:2379"
etcd服务地址,前面已经启动了etcd服务
KUBE_SERVICE_ADDRESSES="–service-cluster-ip-range=10.254.0.0/16"
kubernetes可以分配的ip的范围,kubernetes启动的每一个pod以及serveice都会分配一个ip地址,将从这个范围分配。
admission-control(准入控制) 概述:admission controller本质上一段代码,在对kubernetes api的请求过程中,顺序为先经过认证&授权,执行准入操作,在对目标对象迚行操作。
常见apiserver参数:
–admission-control 准入控制 AlwaysAdmit #不做限制,允许所有结点访问apiserver ,对所有请求开绿灯。

配置kube-controller-manager
[root@master kubernetes]# vim controller-manager
[root@master kubernetes]# grep -v ‘^#’ controller-manager
KUBE_CONTROLLER_MANAGER_ARGS=""
主:默认不需要修改即可

配置schedule
[root@master kubernetes]# grep -v ‘^#’ scheduler
KUBE_SCHEDULER_ARGS=""
主:默认不需要修改即可

配置flannel,指定容器云中docker容器的IP网段
[root@master kubernetes]# vim /etc/sysconfig/flanneld
[root@master kubernetes]# grep -v ‘^#’ /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS=“http://192.168.1.120:2379”
FLANNEL_ETCD_PREFIX="/k8s/network"
FLANNEL_OPTIONS="–iface=ens33"
注:这里修改flannel配置文件后,如果重启服务会卡在重启界面,没有影响。执行如下命令即可启动服务。
[root@master kubernetes]# etcdctl set /k8s/network/config ‘{“Network”:“10.255.0.0/16”}’ [root@master kubernetes]# etcdctl get /k8s/network/config ‘{“Network”:“10.255.0.0/16”}’
{“Network”:“10.255.0.0./16”}

6、启动master上的服务,设置开机启动
[root@master kubernetes]# systemctl start kube-apiserver.service kube-scheduler.service kube-controller-manager.service flanneld
[root@master kubernetes]# systemctl enable kube-apiserver.service kube-scheduler.service kube-controller-manager.service flanneld
[root@master kubernetes]# systemctl status kube-apiserver.service kube-scheduler.service kube-controller-manager.service flannel

7、 配置node1节点服务
注:minion上需要配置:kube-proxy、flannel、kubelet、config
配置flannel
[root@node1 ~]# egrep -v “#|$” /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS=“http://192.168.1.120:2379”
FLANNEL_ETCD_PREFIX="/k8s/network"
FLANNEL_OPTIONS="–iface=ens33"

配置kube-proxy
[root@node1 kubernetes]# vim proxy
注:默认不需要修改配置,主要是负责service的实现。实现内部从pod到servie

配置config
[root@node1 kubernetes]# vim config
[root@node1 kubernetes]# egrep -v ‘#|$’ config
KUBE_LOGTOSTDERR="–logtostderr=true"
KUBE_LOG_LEVEL="–v=0"
KUBE_ALLOW_PRIV="–allow-privileged=false"
KUBE_MASTER="–master=http://192.168.1.120:8080"

配置kubelet
[root@node1 kubernetes]# egrep -v ‘#|$’ kubelet
KUBELET_ADDRESS="–address=0.0.0.0"
KUBELET_HOSTNAME="–hostname-override=node1"
KUBELET_API_SERVER="–api-servers=http://192.168.1.120:8080"
KUBELET_POD_INFRA_CONTAINER="–pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
注:KUBELET_POD_INFRA_CONTAINER 指定pod基础容器镜像地址。这个是一个基础容器,每一个Pod启动的时候都会启动一个这样的容器。如果你的本地没有这个镜像,kubelet会连接外网把这个镜像下载下来。最开始的时候是在Google的registry上,因此国内因为GFW都下载不了导致Pod运行不起来。现在每个版本的Kubernetes都把这个镜像打包,你可以提前传到自己的registry上,然后再用这个参数指定。

启动node1服务
[root@node1 kubernetes]# systemctl start flanneld.service kube-proxy.service kubelet.service docker
[root@node1 kubernetes]# systemctl enable flanneld.service kube-proxy.service kubelet.service docker

排错1:
如果启动flannel失败,查看log日志,提示如下:
failed to retrieve network config: client: etcd cluster is unavailable or misconfigured; error #0: dial tcp 192.168.1.120:2379: i/o timeout
原因:node1节点到etcd集群通过192.168.1.120:2379不通
解决方法:查看master节点的iptables防火墙是否没有关闭或有策略限制
[root@master ~]# iptables -F
[root@master ~]# iptables -L -n
再次启动flannel即可

查看node1的网络信息

k8s可视化容器组删掉自动又生成 k8s容器管理平台_容器编排工具k8s_03


这里的地址就是通过master的如下文件进行分配和管控的

k8s可视化容器组删掉自动又生成 k8s容器管理平台_容器编排工具k8s_04

8、 配置node2
配置内容和node1相同,也可以直接通过scp命令将相关配置文件拷贝到node2上,重启服务即可
[root@node1 ~]# scp /etc/sysconfig/flanneld root@node2:/etc/sysconfig/
[root@node1 ~]# scp /etc/kubernetes/proxy root@node2:/etc/kubernetes/
[root@node1 ~]# scp /etc/kubernetes/config root@node2:/etc/kubernetes/
[root@node1 ~]# scp /etc/kubernetes/kubelet root@node2:/etc/kubernetes/
注:拷贝的kubelet文件,需要修改hostname为node2,。

启动服务,设置开机启动
[root@node2 ~]# systemctl start flanneld.service kubelet kube-proxy.service docker
[root@node2 ~]# systemctl enable flanneld.service kubelet kube-proxy.service docker

查看IP地址

k8s可视化容器组删掉自动又生成 k8s容器管理平台_容器编排工具k8s_05

9、 在master上查看node的信息

k8s可视化容器组删掉自动又生成 k8s容器管理平台_kubernetes_06

三、 将node3节点扩容到kubernetes集群管理平台中

1、 基础环境搭建
修改主机名、修改hosts文件、使用yum安装kubernetes组件

2、 配置kubernetes相关配合文件
这里可不用配置,和node2节点一样,直接scp拷贝即可,需要修改kubelet文件的hostname
[root@node1 ~]# scp /etc/sysconfig/flanneld root@node3:/etc/sysconfig/
[root@node1 ~]# scp /etc/kubernetes/proxy root@node3:/etc/kubernetes/
[root@node1 ~]# scp /etc/kubernetes/config root@node3:/etc/kubernetes/
[root@node1 ~]# scp /etc/kubernetes/kubelet root@node3:/etc/kubernetes/

3、 启动服务,设置开机启动
[root@node3 ~]# systemctl start flanneld.service kubelet.service kube-proxy.service docker
[root@node3 ~]# systemctl enable flanneld.service kubelet.service kube-proxy.service docker
或者使用for循环来启动和设置开机启动
for SERVICES in flanneld kube-proxy kubelet docker ; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done

四、 总结

1、 本实验中kubernetes集群4个节点,一个master+3个node。一共需要启动17个服务,6个端口号。
2、 master启动服务和端口
因为master和etcd是放在一起,所以master总共启动服务是5个,分别如下:
etcd、flanneld、kube-apiser、kube-schedule、kube-controller
master节点启动端口如下:
etcd服务使用的2379端口
master服务使用的8080端口

3、 node启动服务和端口
启动服务如下:
flanneld、kubelet、kube-proxy、docker

启动端口如下:
kubelet监听端口:10248/10250/10255
kubeproxy监听端口:10249

三台node所以总计12个服务