给那些经常听到 Kubernetes、Docker Swarm,但实际上并不太了解的工程师的 GKE 概览

首先

这篇文章是以Google Cloud Platform(1) Advent Calendar 2016和TSG Advent Calendar 2016的形式写的。(二者并行)

GKE(Google容器引擎)是一个在Kubernetes上构建的Docker容器集群进行管理和编排的服务。

我对GKE产生兴趣的原因是看到了2016年Google I/O大会上的演示。

当我看到那段影像时,只是轻轻地读了一些文档罢了。但随后,我进入了Mercari公司,被派遣到Souzou公司,并开始全面地使用GAE/GO,这使我作为GCP的一员需要深入学习GKE。

本文是将通过在 Advent Calendar 中施加压力来调查 GKE 的内容总结成备忘录式的文章。

由于GKE的文档相对较少,我主要参考kubernetes的文档以获取有关kubernetes概念等信息。因此,请允许我在称之为GKE概论的文章中主要涉及kubernetes。

希望这篇文章能对考虑使用GKE或Kubernetes的人提供帮助。

由于我是初学者,如果有任何错误或需要补充的地方,请在评论或编辑请求中温柔地教导我,我会非常高兴。

Kubernetes受到关注的背景是什么?

以前,为了部署应用程序,我们使用操作系统的包管理器将应用程序安装到主机上。然而,这种方法存在一个问题,即应用程序的可执行文件、库、生命周期和操作系统相互依赖。随后,硬件级别的虚拟化得到了推广,但虚拟机具有不可移植性和重量级的缺点。因此,基于操作系统级别的虚拟化的容器系统,如Docker,开始受到关注。与虚拟机相比,容器的构建更容易,且容器之间是相互独立的,可以在不互相干扰的情况下控制资源使用,实现在云端等地方的移植。

然而,现在又出现了Docker管理的问题。
在几台机器的级别上,启动容器并不太困难,但随着规模的扩大,容器的配置、容器管理、健康状态管理等运维工作变得非常困难。为了解决这些问题,出现了Kubernetes。

Kubernetes拥有各种功能,如应用程序的生命与死亡管理、自动缩放、负载均衡和资源监测等,能满足各种需求。此外,Kubernetes主要针对由多个容器组成的应用程序,例如微服务,使得非容器化应用程序迁移到Kubernetes变得容易,并且被设计用于在多个云提供商和物理主机上运行。此外,所有Kubelet的API都是可用的,并倡导扩展开发者,以促进生态系统的形成。 (这是个人的感受)

Kubernetes的架构和工作原理

首先,让我们解释一些在介绍 Kubernetes 时需要了解的术语。

群集 (Cluster)

集群是指用于运行应用程序的Kubernetes使用的物理机器、虚拟机器和其他基础设施资源的集合。

节点

节点是在运行Kubernetes的物理机器或虚拟机上驱动Pod(调度)的。

嵌入式音频设备

Pod是由多个容器组成的集合,是Kubernetes的最小单元。

标签

标签是附加到资源(如 Pod 等)的键/值对。通过使用标签,可以对资源进行子集整理和选择。

复制集合

最初它被称为复制控制器,但后来改名为复制集。
复制集确保指定数量的Pod副本始终在运行。两者都能实现复制系统的简单扩展,并在Pod重启或失败时处理Pod的重新创建。

服务

服务定义了一系列的Pod和访问它们的手段,例如单一稳定的IP地址或相应的DNS名称。它类似于负载均衡器。在给予它名字”服务”时,能够感受到对微服务的意识。(这是个人观点)

秘密

Secret具有存储诸如认证令牌等机密数据并按需提供给容器的功能。非常牛逼。

命名空间 (Namespace)

名前空间与资源名称的前缀类似。
它可以帮助各种项目、团队或客户共享集群,以防止(在微服务等中)团队之间的命名冲突。

使用kubectl

使用API来操作Kubernetes的客户端工具

注解

用于存储无法识别的辅助数据(特别是由工具或系统扩展操作的数据),其数据是无法被人类读取的,它是以键值对的形式保存。它不支持通过注释值进行有效的过滤。

部署

Deployments负责管理Pod。
通过描述Deployment对象的目标状态,它可以帮助我们实现目标状态的变化。太神奇了。

尝试使用

apiVersion: extensions/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

写一个类似于这个样子的YAML文件。

$ kubectl create -f docs/user-guide/nginx-deployment.yaml --record deployment "nginx-deployment" created 

您可以使用这个来创建一个pod。
当指定–record标志时,您可以在正在创建或更新的资源中记录当前命令。

创建部署后,您可以使用kubectl rollout status命令轻松确认状态,如下所示。

$ kubectl rollout status deployment/nginx-deployment deployment nginx-deployment successfully rolled out 

有些人可能会认为更新会很麻烦。但是,如果您想更新Pod以使用nginx:1.9.1镜像代替nginx:1.7.9镜像,只需按照以下简单步骤即可进行更新。

$ kubectl set image deployment/nginx-deployment nginx = nginx:1.9.1 deployment "nginx-deployment" image updated 

你可以使用 “–to-revision” 来将特定的修订版本回滚。

 $ kubectl rollout undo deployment/nginx-deployment --to-revision = 2 deployment "nginx-deployment" rolled back 

概念图

k8s.png

首先,上述内容可以被分为两个部分:Master组件和节点。Master组件负责管理节点,而GKE是管理这个Master的服务。
节点中包含了执行应用程序容器以及从Master系统中进行管理所需的服务,并运行Docker。

其他的说明如下。

名前説明apiserverkubernetesを操作するAPIを提供するcontroller-managerコンテナの状態管理やノードの管理と言った各種管理作業を行うkube-proxy各ノードのKubernetes APIで定義されているサービスを反映し、一連のバックエンド間で簡単なTCPおよびUDPストリーム転送(ラウ​​ンドロビン)を実行する。kubelet各ノード上でのコンテナ作成/削除やボリュームの割り当てなどを行う

有什么令人惊叹的地方?

我使用后觉得以下部分感觉不错。

    • アプリケーションの設定やLBまであらゆる設定が yamlファイルでかける

 

    • GAEと同じくstack driverで死活監視できる。exampleもしっかりあるのでprometheus使っても良さそう。

 

    ログはCloud Loggingでみれる

更想了解

如果你想更深入地了解Kubernetes,可以参考multi-cluster doc和cluster federation proposal。