天天看点

使用Docker Desktop创建一个Kubernetes集群

作者:吉祥庄钢铁侠
使用Docker Desktop创建一个Kubernetes集群

先决条件。

  1. 安装了Docker桌面
  2. 基本的Kubernetes知识
  3. 代码编辑器

目标。

  1. 在Docker桌面上启用Kubernetes
  2. 创建Redis YAML文件来部署4个pod
  3. 创建Apache YAML文件来部署10个pod
  4. 使用YAML文件部署Redis和Apache pods
  5. 在pod之间进行交流

简介

Kubernetes是一个高度复杂的容器协调工具,允许你自动进行软件部署、扩展和管理。它就像类固醇的Docker Compose,有更多的规范选项,这可能使它更难学习和使用。在本教程中,我们将创建一个Kubernetes集群,并部署4个Redis荚和10个Apache荚。在我们开始之前,有一些重要的关键词,你应该熟悉一下。

控制平面由做决策的主节点组成。控制平面必须至少有一个主节点,但可以有更多的主节点。在主节点内部,你会发现API服务器、调度器、控制器管理器、etcd等等。这里有几个关键术语。

  1. kube-apiserver - Kubernetes控制平原的前端。
  2. 调度器 - 控制你的容器如何以及在哪里被放置在称为pod的对象的节点上。
  3. 控制器管理器 - 使用API来确定集群的状态,并确保它处于YAML规范所定义的状态;负责维护指定数量的复制,并在失败时重新启动pod。
  4. etcd - 数据库后端,是一个分布式的键值文件系统
  5. coreDNS - 控制DNS记录
使用Docker Desktop创建一个Kubernetes集群

一个节点是指K8集群中的单个服务器(实例)。请注意,Docker Desktop上的Kubernetes是不可配置的,只支持单节点集群。我们在Docker Desktop中创建的服务(4个Redis,10个Apache)都将在主(控制面)节点上运行。理想情况下,你希望一个主节点有两个工作节点,但这在Docker Desktop中是不可能的。尽管如此,本教程将有助于告诉你如何建立你的Kubernetes YAML文件。

荚是Kubernetes的基本部署单位。它就像你的容器的一个容器。你可以在一个pod中拥有多个容器,在一个节点中拥有多个pod。

集群是一组节点,但也可以是一个单节点。一个单节点集群将只由控制平面组成。一个多节点集群将由任何数量的主节点和任何数量的工作节点组成。上图是一个多节点集群的例子。

Kubectl是配置K8s和管理应用程序的CLI,并自动与Docker Desktop一起安装。

Kubelet是运行在节点上的K8s代理。它是一个API引擎,与本地运行时对话,并返回到控制平面。Kubelet也会随Docker Desktop自动安装。

Kube-proxy控制网络并维护节点上的网络规则。

现在你知道了一些基本术语,让我们开始使用Docker Desktop。如果你已经安装了Docker Desktop,请跳过下一节。

安装Docker桌面

要安装Docker Desktop,请遵循以下说明。

Docker Desktop for Windows

Docker Desktop for Mac

Linux的Docker桌面

在Docker桌面上启用Kubernetes

要在Docker Desktop上启用Kubernetes,首先打开Docker Desktop,点击设置图标。在左边的菜单上选择Kubernetes,然后点击启用Kubernetes。在右下方,点击应用和重启(我的是灰色的,因为我已经完成了这些步骤)。现在你已经准备好在你的CLI中开始使用Kubernetes了。

使用Docker Desktop创建一个Kubernetes集群

Kubernetes对象

Kubernetes对象是你在Kubernetes系统中创建的持续或持久的实体。对象的例子包括荚、服务、卷、命名空间、部署、复制集、作业等等。对象是在YAML或JSON文件中定义的,随后从该文件中创建。在本教程中,我将使用YAML。每个文件都包含一个或多个资源描述,这些描述被称为清单。每个清单描述一个对象。每个清单至少有四个必要条目,这些条目包括:。

apiVersion:
kind:
metadata:
  name: 
spec:
           

apiVersion: - 你想使用哪个Kubernetes API版本

kind: - 你想创建什么类型或种类的对象

元数据: - 用于唯一识别对象的数据

name: - 所需的元数据为字符串格式

规格。- 对象的期望状态

API版本、种类和元数据

在创建YAML文件时,我们如何知道这些所需的条目下有哪些选项可供嵌套?我们可以使用下面的命令来获取一个集群所支持的所有资源以及它所需要的API版本的列表。

kubectl api-resources
           

你将得到一个你可以创建的对象的广泛列表。注意这个列表包括你需要在YAML文件中指明的API版本,以及Kind名称。API版本的不同取决于你所创建的对象的种类。例如,如果你想创建一个部署,你将需要在你的YAML文件中使用apps/v1作为API版本,并使用Deployment作为Kind。

一些常见的 Kind 对象是 Pod、部署和服务。一个Pod Kind部署了一个单独的pod。在本教程中,我们想部署4个Redis pod和10个Apache pod,所以我们将使用Deployment Kind。在部署类型中,我们将能够指定我们想要的复制数量。

使用Docker Desktop创建一个Kubernetes集群

元数据字段是必需的,必须包括一个指定的名称。要查看元数据的所有关键选项,请使用以下命令。

kubectl explain deployments --recursive
           
使用Docker Desktop创建一个Kubernetes集群

规格

规范是你定义你想要创建的对象的所有细节的地方。我们知道,我们将使用部署类型来创建具有多个副本的荚。在spec中包含大量的选项,你可以通过使用上一节中的相同命令,看到部署类型支持的所有不同的可用资源键。

kubectl explain deployments --recursive
           
使用Docker Desktop创建一个Kubernetes集群

还有更多的部署规格选项,但太多了,无法用一张截图来记录。

要获得每个规格选项的解释,以确定是否要在YAML文件中包含它,请使用以下命令。

kubectl explain deployments.spec
           

当构建你的YAML文件时,你基本上是在嵌套选项。你可以使用上述命令来查看有哪些选项。你可以通过添加.<option>来进一步定义你的选项,你想加多少次就加多少次,沿着选项树往下加。这有点难以解释,但这里有一个例子。如果我想看deployments.spec的选项,我运行上述命令,得到的输出如下。

使用Docker Desktop创建一个Kubernetes集群

这告诉我在YAML文件的deployment.spec下可以嵌套的所有选项。我知道我想使用副本,因为我想创建4个Redis的副本和10个Apache的副本。最好的做法是把这些服务分别放在自己的pod中,所以我们将创建两个YAML文件。让我们开始处理Redis文件。

首先创建一个新的目录,用来存放你的YAML文件。然后创建一个新文件(我把我的文件命名为k8s_redis.yml)。在CLI中通过VIM或你喜欢的文本编辑器打开该文件。我使用的是VS Code。

早些时候,我们发现部署的API版本,并注意到它是app/V1。类型是部署。对于元数据,需要一个名称,我们将把这个pod称为redis-deploy。我们将使用一些可选的标签,你可以在这里了解一下。名称是元数据的唯一要求,而且你不能在名称中使用下划线(_)。

apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis-deploy
    labels:
        app: redis
        spec:
           

现在让我们进入规范。在这里,我们将定义我们想要创建的对象的所有细节。通过上面的截图,我们知道我们要包括复制,以表明我们想要的复制数量,选择器,以用于我们的标签,以及模板,以描述将被创建的荚。让我们把这些添加到我们的YAML文件中,嵌套在spec下面。

apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis-deploy
    labels:
        app: redis
        spec:
    replicas:
    selector:
    template:
           

在Redis YAML文件中添加副本

复制(Replicas)可能是最容易正确的一项。只需添加你想要创建的副本数量。我们想要4个Redis的副本。

apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis-deploy
    labels:
        app: redis
        spec:
    replicas: 4
    selector:
    template:
           

在Redis YAML文件中添加标签选择器

标签是连接到对象(如pod或部署)的键:值对。标签是可有可无的,但如果你以后需要搜索一个特定的pod,那么包含标签是很好的做法。一个标签选择器可以帮助用户识别一组对象。

apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis-deploy
    labels:
        app: redis
        spec:
    replicas: 4
    selector:
        matchLabels:
            app: redis
                template:
           

在Redis YAML文件中添加模板

模板是肉的所在。这是我们在pod中定义我们的容器的地方。要查看有哪些可用的选项,请使用以下命令。

kubectl explain deployments.spec.template
           

你可以看到,我们在这里唯一的选择是元数据和规格。

使用Docker Desktop创建一个Kubernetes集群

因为我们使用的是标签,所以我们需要在元数据下包含这个内容。要看在元数据下会有哪些选项,请在前面的命令中添加.metadata扩展名。元数据有很多选项,所以我只附上了几个选项的屏幕截图。

使用Docker Desktop创建一个Kubernetes集群

如果你滚动浏览元数据,你会发现标签是一个选项。让我们继续前进,开始添加到我们的YAML文件。

apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis-deploy
    labels:
        app: redis
        spec:
    replicas: 4
    selector:
        matchLabels:
            app: redis
                template:
        metadata:
            labels:
           

要看我们可以在标签下嵌套哪些选项,请在前面的命令中加入.labels。希望这开始有意义了,你可以通过.<option>来确定你的解释命令的选项。

使用Docker Desktop创建一个Kubernetes集群
apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis-deploy
    labels:
        app: redis
        spec:
    replicas: 4
    selector:
        matchLabels:
            app: redis
                template:
        metadata:
            labels:
                app: redis
                           

添加完元数据后,我们要开始添加模板的规格信息。使用下面的命令来查看模板下要嵌套的规格选项。

kubectl explain deployments.spec.template.spec
           

有大量的选项,我们将使用容器来定义我们想要创建的容器。下面是完成的Redis YAML文件。

apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis-deploy
    labels:
        app: redis
        spec:
    replicas: 4
    selector:
        matchLabels:
            app: redis
                template:
        metadata:
            labels:
                app: redis
                        spec:
            containers:
            - name: redis
                          image: redis:7.0.9
              ports:
              - containerPort: 6379
           

使用我们上面使用的相同的树形扩展方法来解释可用的选项。注意,在容器下,你确实需要在name和containerPort前加上-。缩进是YAML的关键。你可以有两个或四个空格用于嵌套。请注意,在你包含-的地方,它是直接在上面的字下面,总缩进为两个而不是四个。在容器部分,你给你的容器起一个名字,并确定镜像的名称和版本,这可以从Docker Hub获得。你可以选择性地确定要在pod的IP地址上公开的端口。

创建Apache YAML文件

要创建Apache(httpd)YAML文件,请使用创建Redis文件的相同步骤和技术。首先在与前一个文件相同的目录下创建一个新文件,并命名为k8s_httpd.yml之类的。apiVersion和种类是一样的。改变元数据标签以反映httpd。把副本改成10个。改变容器和镜像的名称,以反映你想使用的httpd镜像和版本。将容器端口改为80。

apiVersion: apps/v1
kind: Deployment
metadata:
    name: httpd-deploy
    labels:
        app: httpd
        spec:
    replicas: 10
    selector:
        matchLabels:
            app: httpd
                template:
        metadata:
            labels:
                app: httpd
                        spec:
            containers:
            - name: httpd
                          image: httpd:2.4.56
              ports:
              - containerPort: 80
           

部署Pods

为了从我们的YAML文件中创建pod,我们将使用以下命令。

kubectl apply -f <file_name.yml>
             

我们将不得不运行这个命令两次(一次用于创建Redis pods,一次用于创建Apache pods)。

使用Docker Desktop创建一个Kubernetes集群
使用Docker Desktop创建一个Kubernetes集群

要验证你刚刚创建的一切,请使用以下命令。

kubectl get all
           

你应该看到4个Redis和10个Apache pods。你还可以看到自动分配给集群的集群IP,以及你在YAML文件中定义复制时创建的ReplicaSets。

使用Docker Desktop创建一个Kubernetes集群

确认群集创建

在运行kubectl get all命令后,我们已经证明了我们的集群已经创建。记住,Docker Desktop只能创建一个单节点集群,所以所有东西都在主节点(控制平面)上运行。要验证这一点,请使用以下命令。

kubectl get nodes
           

上面的命令输出了你的集群中的节点列表。我们可以从输出中看到,我们只有一个节点在运行,这个节点是控制计划或主节点。

使用Docker Desktop创建一个Kubernetes集群

平台之间的沟通

在Kubernetes中,一个pod中的容器可以自动通过localhost相互通信。如果你希望一个pod能够与另一个pod进行通信,你可以使用每个pod的唯一IP地址来实现。你也可以创建一个服务,但这不在本教程的范围之内。要获得pod的IP地址,请使用以下命令。

kubectl get pod -o wide
           
使用Docker Desktop创建一个Kubernetes集群

为了测试pod之间使用其IP地址的通信,我们可以使用ping命令。使用下面的命令来进入一个pod。我将进入我的第一个Redis pod(redis-deploy-cdd55dd6d-hrmfh)。

kubectl exec --stdin --tty <pod_name> -- /bin/bash
           
使用Docker Desktop创建一个Kubernetes集群

/bin/bash打开一个shell脚本,以便你可以运行命令。运行。

apt update -y
           

然后运行。

apt upgrade -y
           

要安装PING,请运行。

apt install iputils-ping -y
           

现在ping已经安装好了,我们可以ping其他任何一个pod的IP地址来测试可达性。使用控制C来停止ping。

使用Docker Desktop创建一个Kubernetes集群

清理

要删除你创建的pod,首先使用exit命令离开pod shell。然后使用下面的命令。

kubectl delete deployment <deployment_name>
             
使用Docker Desktop创建一个Kubernetes集群