集群概览

用户通过 kubectl 命令行客户端向运行在主节点上的 Kubernetes API Server发出 REST请求来与集群交互。
image.png
备注:
REST(Representational State Transfer)表述性状态传递,是一种软件设计风格。满足它的原则的应用程序或设计就是RESTful。REST通常基于使用HTTP,URI,XML以及HTML这些现有的广泛流行的协议和标准。比如使用HTTP动词GET、POST、PUT等。

kubectl常用命令

Usage:

使用kubectl查看集群是否正常工作
kubectl cluster-info

通过列出集群节点查看集群是否在运行
kubectl get nodes

查看对象的更详细的信息
kubectl describe node [节点名]

为 kubectl 配置别名和命令行补齐

创建别名

  1. vim ~/.bashrc
  2. alias k=kubectl

为 kubectl 配置 tab 补全

tab 补全不仅可以补全命令名,还能补全对象名。
1)安装一个叫作 bashcompletion 的包来启用 bash 中的 tab 命令补全
2)运行以下命令(也需要加入到 ~/.bashrc 或类似的文件中)

  1. source <(kubectl completion bash)

tab 命令行补全只在使用完整的 kubectl 命令时会起作用(当使用别名 k 时不会起作用),需要改变 kubectl completion 的输出来修复:

  1. source <(kubectl completion bash | sed s/kubectl/k/g)

介绍 pod

一个 pod 是一组紧密相关的容器,它们总是一起运行在同一个工作节点上,以及同一个 Linux 命名空间中。
image.png
每个pod 有自己的 IP,并包含一个或多个容器,每个容器都运行一个应用进程。 pod 分布在不同的工作节点上。

列出 pod

不能列出单个容器,因为它们不是独立的 Kubernetes 对象,但是可以列出 pod。

Usage:

列出 pod:
kubectl get pods

image.png

pod 仍然处于 Pending(挂起)状态, pod 的单个容器显示为还未就绪的状态(这是 READY 列中的 0/1 的含义)。 pod 还没有运行的原因是:该 pod 被分配到的工作节点正在下载容器镜像,完成之后才可以运行。下载完成后,将创建 pod 容器,然后 pod 会变为Running 状态。如果 pod 停留在 Pending 状态,那么可能是 Kubernetes 无法从镜像仓库拉取镜像。可以使用 docker pull 手动拉取镜像来测试。

Usage:

查看 pod 详细信息:
kubectl describe pod

使用 kubectl 部署一个应用

  1. kubectl run kubia --image=luksa/kubia --port=8080 --generator=run/v1

该命令无需JSON或YMAL文件。

—image=luksa/kubia 指定容器镜像; —port=8080 应用监听8080端口; —generator=run/v1 一般不用;它让Kubernetes 创建一个RC,而不是Deployment。1.21已弃用。 kubia 指定RC的名称。

kubectl run运行容器镜像 发生的事情

image.png
当运行 kubectl 命令时,它通过向 Kubernetes API Server 发送一个 REST HTTP 请求,在集群中创建一个新的 ReplicationController 对象。然后,ReplicationController 创建了一个新的 pod ,Scheduler 将其调度到一个工作节点上。Kubelet 看到 pod 被调度到节点上,就告知 Docker 从镜像中心(镜像仓库)中拉取指定的镜像,因为本地没有该镜像。下载镜像后, Docker 创建并运行容器。

定义:术语调度( scheduling )的意思是将 pod 分配给一个节点。 pod 会立即运行,而不是将要运行。

访问 Web 应用

要让 pod 能够从外部访问,需要通过 service 对象公开它, 创建一个特殊 LoadBalancer 类型的 service。通过创建 LoadBalancer 类型的 service,将创建一个外部的负载均衡,可以通过负载均衡的公共 IP 访问 pod。

创建一个 service 对象

要创建服务, 需要告知 Kubernetes 对外暴露之前创建的 ReplicationController:

  1. kubectl expose rc kubia --type=LoadBalancer --name kubian-http

注意:我们这里用的是 replicationcontroller 的缩写 rc。 多数资源类型都有这样的缩写,所以不必输入全名(例如,pods 的缩写是 po, service 的缩写是 svc ,等等)

列出 service

expose 命令的输出中提到一个名为 kubian-http 的 service。service 是类似于 Pod 和 Node 的对象。

Usage:

使用以下命令列出 Service 对象
kubectl get services

kubectl get svc

image.png

现在有外部 IP 了,应用就可以从任何地方通过 http://104.155.74.57:8080 访问。

系统的逻辑部分

ReplicationController、pod 和 service 是如何组合在一起的

通过运行 kubectl run 命令,创建了一个 ReplicationController,它用于创建 pod 实例。为了使该 pod 能够从集群外部访问,需要让 Kubernetes 将该 ReplicationController 管理的所有 pod 由一个 service 对外暴露。
image.png

pod 和它的容器

在系统中最重要的组件是 pod ,它包含一个或多个容器。容器内部是应用进程,该进程绑定到8080端口,等待HTTP 请求。 pod 有自己独立的私有 IP地址和主机名。

ReplicationController的作用

ReplicationController 用于复制 pod ( 即创建 pod 的多个副本)并让它们保持运行。示例中没有指定需要多少 pod 副本, 所以 ReplicationController 创建了一个副本。 如果你的 pod 因为任何原因消失了,那么 ReplicationController 将创建一个新的 pod 来替换消失的 pod。

为什么需要 service

如前所述, 消失的 pod 将被 ReplicationController 替换为新的 pod。新的 pod 与替换它的 pod 具有不同的 IP地址。这就是需要 service 的地方——解决不断变化的 pod IP 地址的问题, 以及在一个固定的 IP 和端口上对外暴露多个 pod。
当一个 service 被创建时,它会得到一个静态的 IP , 在service的生命周期中这个 IP 不会发生改变。 客户端应该通过固定 IP地址连接到 service ,而不是直接连接 pod。 service会确保其中一个 pod 接收连接, 而不关心 pod 当前运行在哪里(以及它的 IP地址是什么)。
service 代表着一组或多组提供相同服务的 pod 的静态地址。 到达service IP 和端口的请求将被转发到属于 service 的一个容器的 IP 和端口。

水平伸缩应用 ( Horizontally scaling the application)

pod 由 一个 ReplicationController 管理。 让我们来查看 kubectl get 命令:
image.png

DESIRED列显示了希望 ReplicationController 保持的 pod 副本数,而CURRENT列显示当前运行的pod 数。

增加期望的副本数

  1. kubectl scale rc kubia --replicas=3

查看扩容的结果

image.png
image.png

两个已经在运行,一个仍在挂起中,一旦容器镜像下载完毕并启动容器, 挂起的 pod 会马上运行。

记住,应用本身需要支持水平伸缩。 Kubemetes 并不会让你的应用变得可伸缩,它只是让应用的扩容或缩容变得简单。

当向service发起请求时,请求负载均衡到所有三个pod上

当pod有多个实例时Kubernetes service 就会这样做。service 作为负载均衡器挡在多个 pod 前面。

系统的新状态

仍然有一个 service 和 一个 ReplicationController, 但是现在有三个 pod 实例,它们都是由 ReplicationController 管理的。 service 不再将所有请求发送到单个 pod, 而是将它们分散到所有三个 pod 中。
image.png

查看应用运行在哪个节点上

Usage:

列出 pod 时显示 pod IP 和 pod 的节点
kubectl get pods -o wide
-o, —output=’’: Output format. One of:json|yaml|wide|name等等
image.png

Usage:

使用kubectl describe 查看 pod 的其他细节
kubectl describe pod
image.png

介绍Kubernetes dashboard

dashboard 是K8S的图形化web用户界面,可以列出部署在集群中的所有 pod、 ReplicationController、 service 和其他部署在集群中的对象, 以及创建、 修改和删除它们。

访问 GKE 集群的 dashboard

如果你正在使用 Google Kubernetes Engine, 可以通过 kubectl cluster-info 命令找到 dashboard 的 URL:
image.png
image.png