一文带你入门 Kubernetes 世界

2021-11-20 21:17:07 浏览数 (2)

代码语言:javascript复制
基于这些工具,相信能够帮助大家从 0 开始入门 Kubernetes 集群,开启云原生之旅 ~

     Kubernetes,通常我们将其缩写为 “K8s”,是一个开源的容器编排平台,最初在  Shipyard 平台中广泛使用。其基于自动化模式维护容器化的应用程序所涉及的许多任务,例如部署、扩展、负载平衡、灰度以及资源弹性伸缩等。其鸟瞰图如下所示:

Kubernetes鸟瞰图Kubernetes鸟瞰图

Kubernetes 劣势

     Kubernetes 是云原生生态资产管理的主要编排平台,为数成千上万家公司优化了部署,降本增效。然而,它因其陡峭的学习曲线以及繁琐的底层原理而臭名昭著。简言之, Kubernetes 的确有点无辜,既受广大开源爱好者欢迎又让大家望之却步,使得其很难做到一碗水平。

     这也就是说,如果大家是一个试图学习和驾驭 Kubernetes 冰山的技术人员,那么你很幸运,因为有大量的开源资源可以帮助大家正确地开始 Kubernetes 云原生之旅。

Kubernetes 优点

     尽管使用 Kubernetes 时可能会碰到各种各样的困难、险阻,但庆幸的是,基于h合理的 Kubernetes 平台将会为我们带来如下效益:

     1、通过高效扩展集群来降低云成本

     2、简化团队的不同工程流程(例如开发、测试和发布)

     3、尽量减少安全问题,如跨容器通信

     4、确定交通如何通过基础设施

     5、防止资源匮乏的服务相互中断

     你的 Kubernetes 之旅

     诚然,学习 Kubernetes 是一个漫长而复杂、兴奋而颓废的过程,但每个人都必须从某个地方开始。其实,只需 2-3天,我们就可以在本地或云中使用 Kubernetes 部署和管理容器。本文将是一个高层次的指南,引领大家一步一个脚印,从宏观到微观,从工具到原理,以 0 基础入门 Kubernetes 世界。

     在开始之前。。。

我们需要下载并安装基础环境,例如,Docker、Kubectl 及其他基础工具,以便其能够提供正常用于与集群交互的命令。

第 1 天:本地集群

     建立本地 Kubernetes 集群是熟悉基本操作和概念的最佳实践路线之一。在本文中,我将为大家重点介绍比较经典的 2 款工具,Minikube 和  K3d,下面对 2 者进行简要解析。

     如果你是一个云原生小白,意味着所有的一切将是从零开始,Minikube 或许是一个很好的选择。使用 Minikube,我们可以通过命令行快速轻松地设置本地 Kubernetes 集群。网络上有较多的案例,介绍如何使用 Kubernetes 文档中的 Minikube 创建集群。关于 Minikube 相关内容,暂不在本文中赘述,大家可参考之前文章:Kubernetes 构建工具浅析。

     Minikube 的强大毋庸置疑,在广大技术人员本地环境中其作用发挥的淋漓尽致。除此,作为后起之秀,K3d 作为本地运行 K3s( K8s 的轻量级版本)的另一种方式正在加速发展。K3d 最吸引人的功能之一便是,它允许我们在 Docker 中创建和管理集群(而不是通过在虚拟机中运行的 Minikube )。查看此 starter repo : https://github.com/iwilltry42/k3d-demo 以获取示例 K3d 应用程序。

代码语言:javascript复制
[administrator@JavaLangOutOfMemory ~ ] % curl -s https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash
... ...
[administrator@JavaLangOutOfMemory ~ ] % k3d cluster create mycluster -p 9080:80@loadbalancer
... ...
K3d Command K3d Command

第 2 天:部署

     在容器编排生态中,Kubernetes 的基本构建块是称为清单的 YAML文件。这些文件向 Kubernetes 阐述我们想要创建什么,以及想要如何进行创建。

     以下是 Nginx 服务部署的示例清单,以当前最新版本 v1.19 为例,具体如下所示:

代码语言:javascript复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19.10
        ports:
        - containerPort: 80

针对单副本,我们可能轻而易举地创建及维护,然而,一旦我们想要部署应用程序的多个副本,维护几个稍有不同的清单的副本可能会显得有点捉襟见肘。

     这就是 Helm 模板制作的用武之地。基于模板工具,我们可以轻松创建和管理应用程序的变体,保持某一特定值的通用性,并根据需要进行自适应调整。Helm 作为一款用于集群创建和发布管理的综合工具便应运而生。

     除此之外,Helm 还成为了用于包装整个应用的 Kubernetes 系统,我们将这些包统称为图表。例如,我们可以使用图表基于 helm install kube prometheus stack prometheus community/kube prometheus stack 命令行安装监控服务(度量收集器、时间序列数据库和仪表盘)。

Helm 工作流Helm 工作流

     关于 Helm 相关内容,可参考之前文章:Helm管理工具解析。

     第 3 天:管理

     经过前面 2 天的实践,我们现在已经部署了一个完整的集群,但同时,我们需要知道发生了什么,需要基于我们的实际业务或 Demo 进行有效性管理。这里面,我们通常会给大家推荐如下工具,当然,也有更好的,或许因每个人的使用习惯及风格所定。

     首先,我们来看一下最为经典的命令行工具-Kubectl,基于此种工具,Kubectl 对于监视 Kubernetes 集群非常有用。我们可以获取 Kubernetes 知道的任何对象的状态,查看实时日志,并在 Pod 中获取命令行。一些有用的、鲜为人知的好玩意如下所示:

kubectl watch:查看 Kubernetes 对象的实时事件。  kubectl port forward:从本地主机到群集中服务的自组织端口隧道。  kubectl proxy:创建 kubernetes API 的本地代理。

    与 Kubectl 命令行工具类似的,比如 Ktunnel 。其同样也是一个 CLI 工具,用于在 Kubernetes 集群和本地机器之间建立反向隧道。它允许我们将我们所部署的机器作为集群中的服务公开至外部环境,其工作原理可参考如下所示:

Ktunnel 工作原理示意图Ktunnel 工作原理示意图

如果我们想一次快速记录一组 Pod,Kubectl 在这方面并没有真正的给予我们相关有效帮助。为此,我们可以尝试使用 Stern 工具。

     基于 Stern,我们可以跨任何指定的(通过 regex )Pod 集查看日志。它甚至显示在执行期间启动和停止的服务的日志。

     例如,运行 stern-n kube 系统 DNS 将显示 Kube 系统名称空间中包含字符串中 “DNS” 的任何 Pod 的所有日志。

代码语言:javascript复制
[administrator@JavaLangOutOfMemory ~ ] % go get -u github.com/stern/stern
... ...
[administrator@JavaLangOutOfMemory ~ ] % asdf plugin-add stern
... ...
[administrator@JavaLangOutOfMemory ~ ] % asdf install stern latest
... ...
代码语言:javascript复制
[administrator@JavaLangOutOfMemory ~ ] % stern envvars --context staging --container gateway
... ...

接下来,我们来介绍 2 款经典的 GUI 管理工具:K9s 与 Lens 。就概览工具而言,K9 和 Lens 本质上其实是同一枚硬币的不同面。无论基于那种选择,都可以归结为个人喜好,但从本质上而言,两者都具备齐全的功能以及较好的维护性,值得大家尝试使用。

     如果大家喜欢基于终端的控制台,可以优先尝试考虑 K9s ,毕竟其能够监控现有 K8s 集群的基本仪表板。除此之外,K9s 拥有一系列有用的功能,例如,基准测试和资源分配信息等等。

代码语言:javascript复制
[administrator@JavaLangOutOfMemory ~ ] % wget https://github.com/derailed/k9s/releases/download/v0.24.2/k9s_Linux_x86_64.tar.gz
[administrator@JavaLangOutOfMemory ~ ] % tar -xzf k9s_*.tar.gz -C ~/luga-cloud/tools/k9s
... ...
[administrator@JavaLangOutOfMemory ~ ] % ~/luga-cloud/tools/k9s/k9s
K9s CommandK9s Command
K9s CommandK9s Command

     如果大家喜欢 GUI 提供的可用性和清晰度,请查看 Lens。它提供了一系列用于一般集群概览的工具,以及其他关联工具,以便我们只需单击几下就可以深入了解详细的配置。

代码语言:javascript复制
# Download the 3.4.0 AppImage for Lens, mark it executable and copy it to your $PATH
# (output omitted for brevity)

[administrator@JavaLangOutOfMemory ~ ] % wget https://github.com/lensapp/lens/releases/download/v3.4.0/Lens-3.4.0.AppImage
[administrator@JavaLangOutOfMemory ~ ] % chmod  x Lens-3.4.0.AppImage
[administrator@JavaLangOutOfMemory ~ ] % sudo mv Lens-3.4.0.AppImage /usr/sbin/lens
Lens 管理控制台Lens 管理控制台

     基于上述工具的相关简要解析,相信大家能够将很好地踏上通往 Kubernetes 启蒙之旅。接下来,我们需要花大量的精力去梳理、掌握 Kubernetes 生态的每一个具体组件,只有基于此,我们才能对 Kubernetes 生态架构体系有所熟知、融会贯通。

Kubernetes 生态架构参考体系Kubernetes 生态架构参考体系

0 人点赞