Kubernetes 是 Google开源的容器集群管理系统,
基于 Docker构建一个容器的调度服务,
提供资源调度、均衡容器、服务注册、动态扩缩容等功能套件。 基于容器的云平台
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戒者容器。
我们将使用本地Yum源的方式进行安装也可以使用网络yum源安装,,但是为了快速安装我们使用本地:
首先我们上传软件包k8s所有依赖包,我打包成一个包然后把它上传到/mnt目录下(3台机器都需要上传此软件包,然后进行安装)
[ldy]
name = k8s
baseurl =file:///mnt/k8s-package
enabled = 1
gpgcheck =0
[ldy]
name=bendi
baseurl = file:///mnt/cdrom
enable=1
gpgcheck =0
#systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld
修改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_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
①配置 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] 承认
查看一下配置信息:
[root@master-ldy mnt]# vim /etc/kubernetes/scheduler
#改 scheduler 监听到的地址为:0.0.0.0,默认是 127.0.0.1。
互动: etcd 是一个非关系型数据库。 如何添加删除数据?
etcdctl 是操作 etcd 非关系型数据库的一个命令行客户端,它能提供一些简洁的命令,供用户直接跟 etcd 数据库打交道 etcdctl 的命令,大体上分为数据库操作和非数据库操作两类。 数据库操作主要是围绕对键值和目录的 CRUD 完整生命周期的管理。 注:CRUD 即 Create, Read, Update, Delete。
etcd 在键的组织上采用了层次化的空间结构(类似于文件系统中目录的概念),用户指定的键可 以为单独的名字,如 testkey,此时实际上放在根目录 / 下面,也可以为指定目录结构,如 cluster1/node2/testkey,则将创建相应的目录结构。
etcdctl mk 和 etcdctl set 的区别如下:
etcdctl mk 如果给定的键不存在,则创建一个新的键值。如果给定的键存在,则报错,无法创建。
etcdctl set ,不管给定的键是否存在,都会创建一个新的键值。
[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。
(1)、从 etcd 中获取出/k8s/network/config 的值
(2)、划分 subnet 子网,并在 etcd 中迚行注册
(3)、将子网信息记录到/run/flannel/subnet.env 中
[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" #指定通信的物理网卡
[root@master-ldy mnt]# systemctl restart flanneld
[root@master-ldy mnt]# systemctl status flanneld
[root@master-ldy mnt]# systemctl enable flanneld
systemctl restart kube-apiserver kube-controller-manager kube-scheduler flanneld #重新启动4个服务
systemctl status kube-apiserver kube-controller-manager kube-scheduler flanneld #查看4个服务的运行状态
1.1查看本节点的hostname
[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"
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 中容器及容器的镜像和卷等信息。
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都已经配置完成)
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
重新启动4个服务,设置开机自启动,查看状态
查看 docker0 IP: node1 和 node2 是不一样的
登录 mster 查看整个集群的运行状态:
[root@master-ldy mnt]# kubectl get nodes