搭建Kubernetes容器集群管理系统 (实验环境: 需要三台全新的 CENTOS7.4系统 )

Kubernetes概述

Kubernetes 是 Google开源的容器集群管理系统,

基于 Docker构建一个容器的调度服务,

提供资源调度、均衡容器、服务注册、动态扩缩容等功能套件。 基于容器的云平台 

1  Kubernetes和相关组件的介绍

1、master: kubernetes管理结点

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

3、scheduler  kubernetes调度服务

4、Replication Controllers  复制, 保证 pod的高可用

         Replication Controller是Kubernetes系统中最有用的功能,实现复制多个 Pod副本,往往一 个应用需要多个 Pod来支撑,并且可以保证其复制的副本数,即使副本所调度分配的宿主机出现异常,通 过 Replication Controller 可以保证在其它宿主机吭用同等数量的 Pod。Replication Controller 可以 通过repcon模板来创建多个 Pod副本,同样也可以直接复制已存在 Pod,需要通过Label selector来 关联。 

5、minion :  真正运行容器 container 的物理机。 kubernets中需要很多minion 机器,来提供 运算。 minion  [ˈmɪniən] 爪牙

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

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

8、etcd      etcd 存储 kubernetes 的配置信息, 可以理解为是 k8s 的数据库,存储着 k8s 容器 云平台中所有节点、pods、网络等信息。 互劢: linux 系统中/etc 目录作用是存储配置文件。  所以 etcd (daemon) 是一个存储配置文 件的后台服务。 

9、Services  : Services是Kubernetes最外围的单元,通过虚拟一个访问IP及服务端口,可以 访问我们定义好的 Pod 资源,目前的版本是通过 iptables 的 nat 转发来实现,转发的目标端口为 Kube_proxy生成的随机端口。  10、Labels  标签   Labels是用于区分Pod、Service、Replication Controller的key/value键值对,仅使用在 Pod、Service、 Replication Controller 之间的关系识别,但对这些单元本身迚行操作时得使用 name 标签。 

11、 Deployment Deployment  [dɪ'plɔɪmənt] 部署  Kubernetes Deployment用于更新 Pod和Replica Set(下一代的 Replication Controller)的 方法,你可以在 Deployment 对象中只描述你所期望的理想状态(预期的运行状态),Deployment控 制器会将现在的实际状态转换成期望的状态。例如,将所有的 webapp:v1.0.9 升级成 webapp:v1.1.0, 只需创建一个 Deployment,Kubernetes 会按照 Deployment 自动进行升级。通过 Deployment 可 以用来创建新的资源。 Deployment可以帮我们实现无人值守的上线,大大降低我们的上线过程的复杂沟通、操作风险。

12、Kubelet 命令 : Kubelet和 Kube-proxy都运行在minion节点上。 Kube-proxy 实现 Kubernetes网络相关内容。 Kubelet命令管理Pod、Pod中容器及容器的镜像和卷等信息。 
 

总结: 总结各组件之间的关系

1、Kubernetes的架构由一个master和多个minion组成,master通过api提供服务,接受kubectl 的请求来调度管理整个集群。 kubectl: 是k8s平台的一个管理命令。

2、Replication controller 定义了多个 pod或者容器需要运行,如果当前集群中运行的 pod 或容
器达不到配置的数量,replication controller会调度容器在多个minion上运行,保证集群中的 pod数量。

3、service则定义真实对外提供的服务,一个 service会对应后端运行的多个container。

4、Kubernetes 是个管理平台,minion 上的kube-proxy 拥有提供真实服务公网IP。客户端访问 kubernetes中提供的服务,是直接访问到kube-proxy上的。

5、在 Kubernetes中 pod是一个基本单元,一个 pod 可以是提供相同功能的多个 container,这 些容器会被部署在同一个 minion 上。minion 是运行 Kubelet 中容器的物理机。minion 接受 master 的指令创建 pod戒者容器。 

搭建的环境介绍:

平台版本说明 节点角色    IP地址     CPU  内存

                         master   10.3.20.100 4核 2GB   这里 master和etcd 共用一台机器

                         etcd       10.3.20.100 4核 2GB

                         node1(minion1) 10.3.20.102 4核 2GB

                         node2(minion2) 10.3.20.113 4 核 2GB

注: 正常需要4台机器,如果你内存不够,master和 etcd可以运行在同一台机器上。 

2  配置 yum源安装kubernetes及组件

我们将使用本地Yum源的方式进行安装也可以使用网络yum源安装,,但是为了快速安装我们使用本地:

首先我们上传软件包k8s所有依赖包,我打包成一个包然后把它上传到/mnt目录下(3台机器都需要上传此软件包,然后进行安装)

3台机器一样的操作:

然后把之间的yum源都移动到别的地方,不再使用

然后把刚才上传的软件包进行解压:

然后写一个本地关于k8s的yum源:

[ldy]
name = k8s
baseurl =file:///mnt/k8s-package
enabled = 1
gpgcheck =0

其他软件的本地yum源:

[ldy]
name=bendi
baseurl = file:///mnt/cdrom
enable=1
gpgcheck =0

 在各个节点上面安装k8s组件

master:配置master-ldy为etcd和master 结点:

[root@master-ldy mnt]#  yum install -y kubernetes etcd flannel ntp 

注:Flannel为 Docker提供一种可配置的虚拟重叠网络。实现跨物理机的容器之间能直接访问 ①、Flannel 在每一台主机上运行一个 agent。

②、flanneld,负责在提前配置好的地址空间中分配子网租约。Flannel使用 etcd来存储网络配置。
③、ntp: 主要用于同步容器云平台中所有结点的时间。 云平台中结点的时间需要保持一致。 ④、kubernetes 中包括了服务端和客户端相关的软件包

⑤、etcd是etcd服务的软件包 
 

node1-ldy安装:yum install kubernetes  flannel ntp -y 

node2-ldy安装:yum install kubernetes  flannel ntp -y 

关闭所有的防火墙master和node1,node2

#systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld

3  配置 etcd和master节点

修改hosts文件:3台机器一样

[root@master-ldy mnt]# vim /etc/hosts

10.3.20.100     master
10.3.20.100     etcd
10.3.20.102     node1-ldy
10.3.20.113     node2-ldy

修改完master的主机Hosts文件,然后把文件发到其他俩太机器上面,使用scp命令:

[root@master-ldy mnt]# scp /etc/hosts 10.3.20.102:/etc/

[root@master-ldy mnt]# scp /etc/hosts 10.3.20.113:/etc/

配置etcd服务器:

[root@master-ldy mnt]# vim /etc/etcd/etcd.conf 

修改如下的配置文件:

改:ETCD_NAME=default 为:ETCD_NAME="etcd" ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

改:ETCD_LISTEN_CLIENT_URLS="http://localhost:2379" 为:ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://10.3.20.100:2379"

改:ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379" 为:ETCD_ADVERTISE_CLIENT_URLS="http://10.3.20.100:2379"

ETCD_NAME="etcd"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://10.3.20.100:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://10.3.20.100:2379"

/etc/etcd/etcd.conf 配置文件含意如下:

ETCD_NAME="etcd" etcd 节点名称,如果 etcd 集群只有一台 etcd,这一项可以注释不用配置,默认名称为 default,这个名字后面会用到。

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

etcd 存储数据的目录

ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.168.1.63:2379" etcd 对外服务监听地址,一般指定 2379 端口,如果为 0.0.0.0 将会监听所有接口

ETCD_ARGS=""

需要额外添加的参数,可以自己添加,etcd 的所有参数可以通过 etcd -h 查看。

启动服务并设置成开机自启动:

[root@master-ldy mnt]# systemctl start etcd
[root@master-ldy mnt]# systemctl status etcd
[root@master-ldy mnt]# systemctl enable etcd

查看启动服务的端口:

[root@master-ldy mnt]# netstat -anput | grep "2379"

检查 etcd 集群成员列表,这里只有一台

[root@xuegod63 ~]# etcdctl member list

到此etcd节点搭建成功!!!!

 

配置 master 服务器:

①配置 kubernetes 配置文件

vim /etc/kubernetes/config

改:KUBE_MASTER="--master=http://127.0.0.1:8080" 为:

KUBE_MASTER="--master=http://10.3.20.100:8080" #指定 master 在 10.3.20.100 IP 上监听端口 8080

注:/etc/kubernetes/config 配置文件含意:

    KUBE_LOGTOSTDERR="--logtostderr=true" #表示错误日志记录到文件还是输出到 stderr 标准错误输出。

    KUBE_LOG_LEVEL="--v=0" #日志等级。

    KUBE_ALLOW_PRIV="--allow_privileged=false" #是否允讲运行特权容器。false 表示不允讲 特权容器 

②修改 apiserver 配置文件

注:/etc/kubernetes/apiserver

配置文件含意: 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 地址,将从这个 范围中分配 IP。

KUBE_ADMISSION_CONTROL="--admission-control=AlwaysAdmit" #不做限制,允讲所 有节点可以访问 apiserver ,对所有请求开绿灯。 admission [ədˈmɪʃn] 承认;准许进入 , Admit [ədˈmɪt] 承认


③kube-controller-manager 配置文件        #不需要修改

查看一下配置信息:

④配置 kube-scheduler 配置文件

[root@master-ldy mnt]#  vim /etc/kubernetes/scheduler

#改 scheduler 监听到的地址为:0.0.0.0,默认是 127.0.0.1。

配置 etcd,指定容器云中 docker 的 IP 网段 ,在 master-ldy上

互动: etcd 是一个非关系型数据库。 如何添加删除数据?

1、扩展:etcdctl 命令使用方法

etcdctl 是操作 etcd 非关系型数据库的一个命令行客户端,它能提供一些简洁的命令,供用户直接跟 etcd 数据库打交道 etcdctl 的命令,大体上分为数据库操作和非数据库操作两类。 数据库操作主要是围绕对键值和目录的 CRUD 完整生命周期的管理。 注:CRUD 即 Create, Read, Update, Delete。

2、etcd (mk,set,get操作)

etcd 在键的组织上采用了层次化的空间结构(类似于文件系统中目录的概念),用户指定的键可 以为单独的名字,如 testkey,此时实际上放在根目录 / 下面,也可以为指定目录结构,如 cluster1/node2/testkey,则将创建相应的目录结构。

etcdctl mk 和 etcdctl set 的区别如下:

etcdctl mk 如果给定的键不存在,则创建一个新的键值。如果给定的键存在,则报错,无法创建。

etcdctl set ,不管给定的键是否存在,都会创建一个新的键值。

3、非数据库操作 etcdctl member 后面可以加参数 list、add、remove 命令。表示列出、添加、删除 etcd 实例 到 etcd 集群中。 例如本地启动一个 etcd 服务实例后,可以用如下命令进行查看。 

4、设置 etcd 网络

[root@master-ldy mnt]# etcdctl mkdir /k8s/network      #创建一个目录/ k8s/network 用于存储

 

flannel 网络信息

[root@master-ldy mnt]# etcdctl set /k8s/network/config '{"Network": "11.255.0.0/16"}'   #给/k8s/network/config 赋一个字符串的值 '{"Network": "11.255.0.0/16"}' 

查看刚才设置的网络信息

[root@master-ldy mnt]# etcdctl get /k8s/network/config 

注:在启动flannel 之前,需要在 etcd 中添加一条网络配置记录,这个配置将用于 flannel 分配给每 个 docker 的虚拟 IP 地址段。用于配置在 minion 上 docker 的 IP 地址.

由于 flannel 将覆盖 docker0 上的地址,所以 flannel 服务要先于 docker 服务启动。如果 docker 服务已经启动,则先停止 docker 服务,然后启动 flannel,再启动docker。

5、flannel 启动过程解析:

(1)、从 etcd 中获取出/k8s/network/config 的值

(2)、划分 subnet 子网,并在 etcd 中迚行注册

(3)、将子网信息记录到/run/flannel/subnet.env 中

6、配置一下 flanneld 服务:

[root@master-ldy mnt]# vim /etc/sysconfig/flanneld 

FLANNEL_ETCD_ENDPOINTS="http://10.3.20.100:2379"
FLANNEL_ETCD_PREFIX="/k8s/network"
FLANNEL_OPTIONS="--iface=ens192"                     #指定通信的物理网卡

启动flanneld 服务:

[root@master-ldy mnt]# systemctl restart flanneld
[root@master-ldy mnt]# systemctl status flanneld
[root@master-ldy mnt]# systemctl enable flanneld

然后我们查看一下flannel0网络信息是否和我们设置的network信息相同(ifconfig)

7、查看子网信息/run/flannel/subnet.env

 flannel 起来后就可以看到到此文件信息了如下:

[root@master-ldy mnt]# cat /run/flannel/subnet.env

之后将会有一个脚本将 subnet.env 转写成一个 docker 的环境变量文件/run/flannel/docker。 docker0 的地址是由 /run/flannel/subnet.env 的 FLANNEL_SUBNET 参数决定的。

[root@master-ldy mnt]# cat /run/flannel/docker

启动 master 上 4 个服务:

systemctl restart kube-apiserver kube-controller-manager kube-scheduler flanneld          #重新启动4个服务

systemctl status kube-apiserver kube-controller-manager kube-scheduler flanneld           #查看4个服务的运行状态

设置开机自启动服务:

此到 etcd 和 master 节点成功。 

 

4  配置minion1节点

①配置 node1 网络,本实例采用 flannel 方式来配置

1.1查看本节点的hostname

1.2配置一下 flanneld 服务:

[root@node1-ldy yum.repos.d]# vim /etc/sysconfig/flanneld 

FLANNEL_ETCD_ENDPOINTS="http://10.3.20.100:2379"
FLANNEL_ETCD_PREFIX="/k8s/network"

FLANNEL_OPTIONS="--iface=ens192"

②配置 node1 上的 master 地址和 kube-proxy

     2.1、配置 node1 上的 master 地址

[root@node1-ldy yum.repos.d]# vim /etc/kubernetes/config

    2.2、kube-proxy 的作用主要是负责 service 的实现,具体来说,就是实现了内部从 pod 到 service

#不用修改,默认就是监听所有 ip 注:如果启动服务失败,可以使用 tail -f /var/log/messages 动态查看日志

    2.3、配置 node1 kubelet

#Kubelet 运行在 minion 节点上。Kubelet 组件管理 Pod、Pod 中容器及容器的镜像和卷等信息。

vim /etc/kubernetes/kubelet

KUBELET_POD_INFRA_CONTAINER 指定 pod 基础容器镜像地址。这个是一个基础容器,每一个 Pod 启动的时候都会启动一个这样的容器。如果你的本地没有这个镜像,kubelet 会连接外网把这个镜像下载下来。最开始的时候是在 Google 的 registry 上,因此国内因为 GFW 都下载不了导致 Pod 运行不起来。现在每个版本的 Kubernetes 都把这个镜像地址改成红帽的地址了。你也可以提前传到自己的 registry 上,然后再用这个参数指定成自己的镜像链接。

注:https://access.redhat.com/containers/ 是红帽的容器下载站点

2.4、启动node1-ldy 的服务

4个服务启动并且查看状态

4个服务设置开机自启动

查看一下网络信息(会发现docer0和flannel0都已经配置完成)

 查看代理服务是否开启:下面说明开启成功

到此 node1 minion 节点 成了。

5  配置minion2结点并总结 Kubernetes所有服务和端口号 (node2-ldy ip:10.3.20.113)

5.1、配置 node2 网络,本实例采用 flannel 方式来配置(配置方法和 node1-ldy一样

[root@node1-ldy yum.repos.d]# scp /etc/sysconfig/flanneld 10.3.20.113:/etc/sysconfig/#直接 复制 node1-ldy的配置到 node2-ldy

查看一下配置的网络信息

启动服务:systemctl start flanneld  systemctl enable flanneld  systemctl status flanneld

查看一下网卡信息:

5.2、配置 node2 上 master 地址和 kube-proxy

在Node2-ldy上启动kube-proxy服务

查看一下端口:netstat -antup | grep proxy

5.3、配置 node2 kubelet(节点1:scp /etc/kubernetes/kubelet 192.168.1.64:/etc/kubernetes/

启动服务:

[root@node2-ldy mnt]# systemctl start kubelet
[root@node2-ldy mnt]# systemctl enable kubelet
[root@node2-ldy mnt]# systemctl status kubelet

启动 node2 服务所有服务

重新启动4个服务,设置开机自启动,查看状态

查看 docker0 IP: node1 和 node2 是不一样的

测试:

登录 mster 查看整个集群的运行状态:

[root@master-ldy mnt]# kubectl get nodes 

说明运行正常。 至此,整个 Kubernetes 集群搭建完毕

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值