首页 > 技术文章 > 搭建Kubernetes容器集群管理系统

happy1983 2018-08-10 10:47 原文

1、Kubernetes 概述

  Kubernetes 是 Google 开源的容器集群管理系统,基于 Docker 构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、劢态扩缩容等功能套件。 基于容器的云平台
  Kubernetes 基于 docker 容器的云平台,简写成: k8s 。
  openstack 基于 kvm 虚拟机云平台
  官网:https://kubernetes.io/

  Kubernetes 的架构设计图:

2、Kubernetes 常见组件介绍

 

1、master: kubernetes 管理结点
2、apiserver : 提供接口服务,用户通过 apiserver 来管理整个容器集群平台。API Server 负责和 etcd 交互(其他组件丌会直接操作 etcd,只有 API Server 这么做),整个 kubernetes 集群的所有的交互都是以 API Server 为核心的。
如:A、所有对集群迚行的查询和管理都要通过 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 机器,来提供运算。
6、container : 容器 ,可以运行服务和程序
7、Pod :在 Kubernetes 系统中,调度的最小颗粒丌是单纯的容器,而是抽象成一个 Pod,Pod是一个可以被创建、销毁、调度、管理的最小的部署单元。pod 中可以包括一个戒一组容器。

 

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

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 可以用来创建新的资源。如:pod,替换已经存在的资源等。
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 上的 proxy 拥有提供真实服务公网 IP。客户端访问kubernetes 中提供的服务,是直接访问到 kube-proxy 上的。
5、在 Kubernetes 中 pod 是一个基本单元,一个 pod 可以是提供相同功能的多个 container,这些容器会被部署在同一个 minion 上。minion 是运行 Kubelet 中容器的物理机。minion 接受 master的指令创建 pod 或者容器。

 3、搭建 Kubernetes 容器集群管理系统

 1.平台版本说明:

节点角色       IP 地址      CPU   内存
master           192.168.10.71    4 核    1GB
node1(minion1)     192.168.10.72    4 核    1GB
node2(minion2)     192.168.10.73    4 核    1GB
etcd            192.168.10.74    4 核    1GB
注: 正常需要 4 台机器,如果你内存不够,master 和 etcd 可以运行在同一台机器上。

 2.系统的配置(所有机器)

关闭selinux

# 临时关闭
$ setenforce 0  
# 永久关闭
$ vim /etc/selinux/config 
SELINUX=disabled

关闭且禁用防火墙

$ systemctl stop firewalld 
$ systemctl disable firewalld

修改hostname

vi /ect/hostname

# 四台机器分别修改为 
master
node1
node2
etcd

修改hosts文件

$ vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.71   master
192.168.10.72   node1
192.168.10.73   node2
192.168.10.74   etcd

更新yum

$ yum update -y

 

安装相关组件

$ yum install -y etcd kubernetes ntp flannel

3.etcd服务器

# 修改配置文件
$ vim /etc/etcd/etcd.conf 
ETCD_NAME=default
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.168.10.74:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.74:2379"

# 启动服务
$ systemctl start etcd   
$ systemctl enable etcd

#检查etcd cluster状态 
$ etcdctl cluster-health  
member 8e9e05c52164694d is healthy: got healthy result from http://192.168.10.74:2379
cluster is healthy

# 设置一个key,下面会用到
etcdctl set /k8s/network/config '{"Network": "10.255.0.0/16"}'

4.master服务器

#  配置kube-apiserver配置文件

$  vim /etc/kubernetes/config 
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.10.71:8080"

$ vim /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.10.74:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=AlwaysAdmit"
KUBE_API_ARGS=""

#配置kube-scheduler配置文件,此处可以不需要配置
vim /etc/kubernetes/scheduler 
KUBE_SCHEDULER_ARGS="--address=0.0.0.0"

# 启动服务
systemctl start kube-apiserver kube-controller-manager kube-scheduler
systemctl enable kube-apiserver kube-controller-manager kube-scheduler
systemctl status kube-apiserver kube-controller-manager kube-scheduler

5.node1节点  

# 配置node1网络
$ vim /etc/sysconfig/flanneld 
FLANNEL_ETCD_ENDPOINTS="http://192.168.10.74:2379"
FLANNEL_ETCD_PREFIX="/k8s/network"
FLANNEL_OPTIONS="--iface=ens33"   # ens是当前可用上网的网卡名称,此处是多个网卡时需要指定,不然不需要指定

# 配置node1 kube-proxy
$ vim /etc/kubernetes/config 
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.10.71:8080"

# 配置node1 kubelet
$ vim /etc/kubernetes/kubelet 
KUBELET_ADDRESS="--address=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=node1"
KUBELET_API_SERVER="--api-servers=http://192.168.10.71:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

# 启动node1服务
systemctl start flanneld kube-proxy kubelet
systemctl enable flanneld kube-proxy kubelet
systemctl status flanneld kube-proxy kubelet

6.node2节点

# 配置node2网络
$ vim /etc/sysconfig/flanneld 
FLANNEL_ETCD_ENDPOINTS="http://192.168.10.74:2379"
FLANNEL_ETCD_PREFIX="/k8s/network"
FLANNEL_OPTIONS="--iface=ens33"     # ens是当前可用上网的网卡名称,此处是多个网卡时需要指定,不然不需要指定   

# 配置node2 kube-proxy
$ vim /etc/kubernetes/config 
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.10.71:8080"

# 配置node2 kubelet
$ vim /etc/kubernetes/kubelet 
KUBELET_ADDRESS="--address=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=node1"
KUBELET_API_SERVER="--api-servers=http://192.168.10.71:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

# 启动node1服务
systemctl start flanneld kube-proxy kubelet
systemctl enable flanneld kube-proxy kubelet
systemctl status flanneld kube-proxy kubelet

7.测试

[root@xuegod71 ~]# kubectl get nodes
NAME      STATUS    AGE
node1     Ready     19s
node2     Ready     18s

详细可以参考:https://www.cnblogs.com/byron0918/p/8728876.html

 

推荐阅读