从零开始攻略k8s(四):集群架构

首先来看一个最简单的系统架构图:由一个主节点和若干工做节点组成,开发者将一个应用列表提交到主节点,k8s会将它们部署到集群的工做节点,组件被部署在哪一个节点对开发者和系统管理员来讲都不用关心。
在这个层级上,k8s能够当作是集群的操做系统,帮助开发者聚焦核心应用功能,没必要去考虑额外的服务如:服务发现、扩容、负载均衡、自恢复或者选举leader等,同时也可以帮助运维团队获取更高的资源利用率。
k8s-framework-1.png
视角拉近一点会看到k8s的架构是以下所示,在硬件层面,一个k8s集群由不少节点构成,主要分为两类:nginx

  • 主节点,控制面板(master)
  • 工做节点(worker)

k8s-framework-2.png
各节点具备的组件及其功能可参考我以前的文章[k8s-设计理念-原理图](http://www.javashuo.com/article/p-kvgsxlnm-hd.html)git

最后看一个在k8s集群中是如何部署应用程序的简易流程图。
k8s-framework-3.png
左边的容器被分为3组,这些容器组被称为pod,旁边的数字表明pod的副本数量,后续将会详细讲解。pod通常由deployment控制器负责建立,开发人员提交的deployment.yaml里面会包含建立pod所需的信息,下面是一个nginx-deployment.yaml的例子。github

apiVersion: apps/v1         // 当前使用的apiVersion版本
kind: Deployment            // 要建立的资源类型
metadata:                   // 该资源的元数据,name是必需的元数据项
  name: nginx-deployment    
  labels:
    app: nginx
spec:                       // 该Deployment的规格说明
  replicas: 2               // 副本数量
  selector:                 // label选择器
    matchLabels:
      app: nginx
  template:                 // 定义Pod的模板,这是配置文件的重要部分
    metadata:               // 定义Pod的元数据,至少要定义一个label
      labels:             
        app: nginx
    spec:                   // 描述Pod的规格,此部分定义Pod中每个容器的属性,name和image是必需的
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

执行kubectl apply -f nginx-deployment.yaml

经过 kubectl get 查看 nginx-deployment 的各类资源
web