Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kubernetes—简介以及部署方案 #30

Open
johnnian opened this issue Aug 23, 2017 · 0 comments

Comments

1 participant
@johnnian
Copy link
Owner

commented Aug 23, 2017

谈到容器化管理解决方案,Kubernetes 目前应该是比较成熟的,有比较多的落地实施案例。

一、Kubernetes 简介

Kubernetes 是容器自动部署、扩展与管理的开源平台,具体的介绍,可以参考链接: What is Kubernetes?

目前,Kubernetes有比较多的落地实施案例,例如 京东、SAE、网宿科技、时速云、灵雀云、网易蜂巢等等。

参考链接:

二、Kubernetes基本概念

Kubernetes 集群的节点,按照功能,可以划分为 Master Node(控制集群),Worker Node(实际工作)。

Master Node上运行的组件: Master Components + Node components
Worker Node上运行的组件: Node components

2.1 Components(组件)

Master Components

  • kube-apiserver:配置API 对象(pods, services, replicationcontrollers等),并且放出REST 接口,供其他组件进行交互
  • etcd: Kubernetes用于存储API对象的Key-Value存储中心
  • kube-controller-manager/cloud-controller-manager: 处理集群中的运行时任务,正常情况下是通过这些控制器来控制管理集群的
  • kube-scheduler:为Pod分配运行节点
  • addons(DNS、Dashboard、Monitoring、Logging等)

Node Components

  • kubelet: 节点的守护进程,最终工作的执行者
  • kube-proxy: Kubernetes集群的网络代理
  • docker / rkt: 容器
  • supervisord:轻量级的守护进程
  • fluentd: 日志收集

Master node 组件结构
master-node

Worker node 组件结构

worker-node

参考链接:

2.2 API Objects(API 对象)

Kubernetes使用 持久化的Objects对象来展现集群的状态,这些对象存储在 Kubernetes的 Etcd KeyValue存储中。

使用 kubectl命令行客户端来操作 API 对象。

API Object的文档说明,请看这里

通过创建 .yaml格式的文件,使用kubectl 命令行创建 API对象, .yaml文件的格式大致是:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

可以分为:

  • apiVersion: 需要使用哪个版本的Kubernetes来创建 API对象
  • kind: 需要创建那种类型的 API对象
  • metadata: API对象的一些标志属性,如,name, UID, namespace等
  • spec: API对象的具体属性配置

对于API对象的类型,划分:

  • Pod: Pod可以理解为应用实例特定的逻辑主机,表示一个或多个容器组和这些容器的共享资源,包共用卷、唯一的集群IP和容器运行的信息,如端口等;
  • Controller:Controller可以根据对应的策略创建或者管理Pod,如,Deployment,DaemonSet,StatefulSet等;
  • Service: Service是一组相同逻辑的pods和一个访问它们的策略;
    a. ClusterIP(默认): 只有集群内部访问;
    b. NodePort: 使用NAT方式,在集群中每个选定的节点的同一端口上暴露服务。可以在集群外部访问服务。
    c. LoadBalancer:创建外部负载均衡。
    d. ExternalName:使用任意名称显示服务。
  • Namespace: 命名空间;
  • Node: kubernetes的工作机器(物理机或虚拟机),Node由master管理,可以在一个node上部署多个pod;

2.3 Controller(控制器)

不同类型的控制器,管理Pod的策略是不同的,Controller主要分为下面几种类型:

  • Deployment: Deployments控制器是最常用的,可以用来管理和更新Pods 、ReplicaSets
  • Replication Controller
  • ReplicaSets(Replication Controller的下一个升级版本)
  • DaemonSet
  • Job
  • Cron Job
  • StatefulSets[beta]
  • Garbage collection[beta]

参考链接:

2.4 Service(服务)

Service 可以说是连接 Pods 与外界的桥梁,Service可以建立起 内部 Pod 容器的端口 <--> 外部端口 的映射关系,通过Visual IP,客户端直接连接Service的IP、端口,而无需关注后端的Pods IP地址的变化,这个概念有点儿像微服务。

Service 有下面几种类型:

  • ClusterIP(默认): 仅限于集群内部使用的服务,外部无法访问;
  • NodePort: 支持外部访问的服务,可以通过 [NodeIP]:[NodePort] 来访问对应的服务;
  • LoadBalancer:需要云服务商支持
  • ExternalName:通过域名来访问

每个Node 都会运行 kube-proxy 组件,kube-proxy 组件为Service创建虚拟IP(Visual IP),下面是整个网络代理的拓扑图:

Kubernetes V1.2版本前,网络代理的拓扑图:
qq20170905-152148 2x

Kubernetes V1.2版本后,网络代理的拓扑图:
qq20170905-152210 2x

详细说明,参考:Service

2.5 网络拓扑

Kubernetes 高可用集群拓扑图
default

三、常见的部署方案以及示例

目前市面上有很多部署和实施Kubernete的解决方案,点击这里查看, 总的来说,大致分为下面的几种:

  • Hosted Solutions:托管部署方案,例如直接用谷歌的Google Container Engine
  • Local-machine Solutions: 本地部署方案,一般用于开发测试使用,例如,使用 minikube 部署;
  • Custom Solutions: 自行定制的方案,例如,使用 kubeadm部署;

3.1、本地部署-minikube

minikube安装倒是挺简单的,就是下载镜像的时候会有问题,可以考虑:使用阿里云镜像,或者用Docker Hub 作为中转。

部署示例

操作说明

3.2 集群部署-kubeadm

参考链接

@johnnian johnnian added the Docker label Aug 23, 2017

@johnnian johnnian added this to 未完成 in 待整理 Aug 23, 2017

@johnnian johnnian added this to Docker in Linux & Docker Aug 23, 2017

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.