一、Kubernetes 介绍:

在这里插入图片描述

(1)K8s 是一个开源的 Docker 容器编排系统

  • 2015.7,正式发布,截止目前最稳定的版本是 1.9;
  • 调度计算群集的节点,动态管理上面的作业;
  • 通过使用 labels 和 pods 的概念,将应用按逻辑单元进行分组。

1、Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。

2、在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

3、k8s 是由Golang语言开发,具有轻量化、模块化、便携以及可扩展的特点。

(2)k8s 的特点:
在这里插入图片描述

(3)k8s 的作用:

  • 自动化部署、扩展和管理容器应用;
  • 资源调度;
  • 部署管理;
  • 服务发现;
  • 扩容缩容;
  • 监控

二、k8s 核心组件、概念:

k8s 中大部分概念都可以看做是一种资源池。

(1)k8s 核心组件:

1、Master组件:
在这里插入图片描述
2、Node组件:
在这里插入图片描述
3、除了核心组件,还有一些推荐的 Add-ons:

  • kube-dns负责为整个集群提供DNS服务;
  • Ingress Controller为服务提供外网入口;
  • Heapster提供资源监控;
  • Dashboard提供GUI;
  • Federation提供跨可用区的集群;
  • Fluentd-elasticsearch提供集群日志采集、存储与查询

(2)概念解释:

1、Pods:

  • 最小部署单元;
  • 一组容器的集合;
  • 一个Pod中的容器共享网络命名空间;
  • Pod是短暂的

2、Labels:

标签其实就一对 key/value ,被关联到对象上,比如Pod,标签的使用我们倾向于能够标示对象的特殊特点,并且对用户而言是有意义的(就是一眼就看出了这个Pod是哪个数据库),但是标签对内核系统是没有直接意义的。标签可以用来划分特定组的对象(比如,所有女的),标签可以在创建一个对象的时候直接给与,也可以在后期随时修改,每一个对象可以拥有多个标签,但是,key值必须是唯一的。

3、Namespace:

Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace。

4、Controllers:

  • ReplicaSet:确保预期的 Pod 副本数量;
  • Deployment:无状态应用部署;
  • StatefulSet:有状态应用部署;
  • DaemonSet:确保所有的 Node 运行同一个 Pod;
  • Job:一次性任务;
  • Cronjob:定时任务。

5、Node:

Replication Controller 保证了在所有时间内,都有特定数量的Pod副本正在运行,如果太多了,Replication Controller就杀死几个,如果太少了,Replication Controller会新建几个,和直接创建的pod不同的是,Replication Controller会替换掉那些删除的或者被终止的pod,不管删除的原因是什么(维护阿,更新啊,Replication Controller都不关心)。基于这个理由,我们建议即使是只创建一个pod,我们也要使用Replication Controller。Replication Controller 就像一个进程管理器,监管着不同node上的多个pod,而不是单单监控一个node上的pod,Replication Controller 会委派本地容器来启动一些节点上服务(Kubelet ,Docker)。

每个Node都包括以下状态信息:

  • 地址:包括hostname、外网IP和内网IP;
  • 条件(Condition):包括OutOfDisk、Ready、MemoryPressure和DiskPressure;
  • 容量(Capacity):Node上的可用资源,包括CPU、内存和Pod总数;
  • 基本信息(Info):包括内核版本、容器引擎版本、OS类型等;

其中基本信息又包括以下信息:

  • ReplicaSets:是下一代复本控制器。ReplicaSet和 Replication Controller之间的唯一区别是现在的选择器支持。
  • Services:Pod会被创建,同时也可能会被杀死,且是不可逆的,Kubernete Service 是一个定义了一组Pod的策略的抽象,我们也有时候叫做宏观服务。这些被服务标记的Pod都是(一般)通过label Selector决定的。
  • Volumes:容器中的磁盘的生命周期是短暂的,这就带来了一系列的问题,第一,当一个容器损坏之后,kubelet 会重启这个容器,但是文件会丢失-这个容器会是一个全新的状态,第二,当很多容器在同一Pod中运行的时候,很多时候需要数据文件的共享。Kubernete Volume解决了这个问题。一个Kubernetes volume,拥有明确的生命周期,与所在的Pod的生命周期相同。因此,Kubernetes volume独立与任何容器,与Pod相关,所以数据在重启的过程中还会保留,当然,如果这个Pod被删除了,那么这些数据也会被删除。更重要的是,Kubernetes volume 支持多种类型,任何容器都可以使用多个Kubernetes volume。
  • Deployment:为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。
  • Secret:解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。

(3)k8s 系统架构图:

在这里插入图片描述
在这里插入图片描述

三、集群部署的三种方法:

(1)minikube:

是一个工具,可以在本地快速运行一个单点的 Kubernetes,仅用于尝试Kubernetes或日常开发的用户使用。

(2)Kubeadm:

也是一个工具,提供 kubeadm init 和 kubeadm join ,用于快速部署 Kubernetes 集群。

(3)二进制包:

推荐,从官方下载飞行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。

四、minikube 部署集群:

角色IP地址
master192.168.220.131
node192.168.220.140

(1)部署 master:

yum install -y etcd kubernetes flannel    //会帮你自动安装docker依赖包

vim /etc/etcd/etcd.conf
在文件尾行添加以下内容:
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:4001"
ETCD_NAME="default"
ETCD_ADVERTISE_CLIENT_URLS="http://localhost:4001"

vim /etc/kubernetes/apiserver
做如下增改:
KUBE_API_ADDRESS="--address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBELET_PORT="--kubelet-port=10250"
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:4001"

在这里插入图片描述

配置 flannel 网络:

vim /etc/sysconfig/flanneld

FLANNEL_ETCD_ENDPOINTS="http://192.168.220.131:4001"
FLANNEL_ETCD_PREFIX="/atomic.io/network"

启动所有组件服务:
for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do systemctl restart $SERVICES; systemctl enable $SERVICES ; systemctl status $SERVICES; done

设置etcd网络:
tcdctl -C //192.168.220.131:4001 set /atomic.io/network/config '{"Network":"10.1.0.0/16"}'

在这里插入图片描述
在这里插入图片描述

//关闭防火墙:
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0

(2)部署 node:

yum install -y flannel kubernetes

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.220.131:8080"
KUBE_ETCD_SERVERS="--etcd_servers=http://192.168.220.131:4001"

vim /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME="--hostname-override=192.168.220.140"
KUBELET_API_SERVER="--api-servers=http://192.168.220.131:8080"

vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://192.168.220.131:4001"
FLANNEL_ETCD_PREFIX="/atomic.io/network"

在这里插入图片描述

//启动组件服务:
for SERVICES in flanneld kube-proxy kubelet docker; do systemctl restart $SERVICES; systemctl enable $SERVICES; systemctl status $SERVICES; done

(3)检测:在 master 是否能查看到 node 节点

[root@localhost ~]# kubectl get nodes

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐