【简介】在 Kubernetes 上配置 nginx 并显示默认页面

目录
您好。
我是系统解决方案部门的基础设施爱好者,主要撰写入门级文章。
作为一名铁杆的网关守护者,这次我将撰写关于 Kubernetes 的文章。
市面上已经有很多详尽的入门文章,以至于我几乎在动笔之前就放弃了,但我会尝试用我自己的方式,以通俗易懂的方式总结我所学到的知识。力求
流畅自然。
这次,我们将实际在 Kubernetes 上设置 nginx 并显示欢迎页面。
虽然开发人员可能很少会深入研究 Kubernetes,但为了最大限度地提高在 Kubernetes 环境中的应用程序性能,您需要在一定程度上设计应用程序以使其与 Kubernetes 兼容,因此请将本文作为入门的垫脚石!
什么是 Kubernetes?
以下是文档说明:
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化工作负载和服务,并支持声明式配置管理和自动化。Kubernetes 拥有庞大且快速增长的生态系统,提供丰富的服务、支持和工具。官方
文档:https://kubernetes.io/ja/docs/concepts/overview/what-is-kubernetes/
由于可能不太清楚,我将逐步解释。首先,Kubernetes 是一个容器编排工具(它像指挥家一样管理多个容器),因此需要具备一定的容器知识。
声明式配置管理和自动化
在 Kubernetes 中,您需要在一个名为清单文件的文件中指定(声明)所需的状态,Kubernetes 会根据该状态创建 Pod(容器和卷的集合)。
例如,如果您订购了“四个容器”,然后不小心删除了一个,Kubernetes 会自动创建并添加缺失的容器。Docker
Compose 和类似工具只是简单地创建容器,而 Kubernetes 的不同之处在于它添加了上述的管理功能。
管理容器化工作负载和服务
熟悉 Docker 的用户可能知道,Docker 在单台机器上运行容器。
相比之下,Kubernetes 管理位于多台机器上的容器。
在大规模应用中,通常会使用多台机器来分配负载和功能。在这种情况下,无需在每台机器上单独运行 `docker run` 命令,只需准备好前面提到的清单文件,Kubernetes 就会将容器部署到每台机器上。这对于部署大规模服务来说是一个非常有用的工具。
优点
除了是部署大规模容器服务的实际标准之外,它还具有诸多
优势,例如能够像 Docker 一样随容器一起提供配置文件,以及使用副本集进行版本控制,从而无需停止容器即可进行更新。
活跃的全球开源社区也是其一大优势。
Kubernetes 术语表
Kubernetes 有许多独特的概念和术语。你
只能靠记忆来掌握它们,所以我只做个简要的解释。
现在,你只需要阅读本文,大致了解一下这些概念和术语的存在即可。无论你是否喜欢,在使用过程中你都会逐渐熟悉它们。
主节点
这里是我们发出命令的地方。稍后我们将看到,这里还有工作节点,主节点的作用是向这些工作节点发出指令。它是由一系列
提供管理功能的组件组成的,例如“kube-appointer(接收并处理来自我们的命令)”、“
(保存接收到的‘期望状态’的数据库)”
“kube-scheduler(将 Pod 分配给工作节点)”
etcd
工作节点
这是 Pod 实际部署的区域,它与主节点协同工作。
“kube-let”(与 kube-schedule 通信)
“kube-proxy”(高效处理网络)
它包含诸如
荚
卷是容器及其关联存储空间的集合。
即使不使用卷,Kubernetes 也会将 Pod 作为一个整体进行管理。
服务
它的作用是将 Pod 分组在一起。
每个服务都会被分配一个 IP 地址,当您访问该 IP 地址时,服务会将负载均衡到其下属的 Pod 上。
这种负载均衡是基于每个工作节点进行的,因此多个工作节点之间的负载均衡不在该服务的范围内。
复制套装
我解释说,Kubernetes 会在 Pod 停止或删除时自动将 Pod 数量恢复到所需水平,但这需要管理 Pod 的数量。
这就是副本集的作用所在。
部署
它用于管理 Pod 部署。
虽然前面提到的“Pod”、“服务”和“副本集”都可以在清单文件(YAML 格式)中描述,但“Pod”和“副本集”通常包含在“部署”清单中。
换句话说,创建 Pod 时,如果您同时拥有“部署”清单和“服务”清单,它就能正常工作。
关于环境
俗话说,眼见为实,让我们来看一个包含上一节解释的术语的清单文件。
但在此之前,您需要一个 Kubernetes 执行环境来应用该清单文件。
您可以使用各个云提供商提供的 Kubernetes 服务(例如 AWS 的 EKS、GCP 的 GKE、Azure 的 AKS、OCI 的 OKE、阿里云的 ACK 等),但这些服务对于初学者来说成本较高,因此我们建议使用“Docker Desktop”自带的扩展程序。
设置很简单。
在 Docker Desktop 中,依次点击“设置”->“Kubernetes”->勾选“启用 Kubernetes”。

等待安装完成即可。太棒了!
有了这些,你就可以开始学习 Kubernetes 了。
清单文件示例
现在,我们来看一个清单文件的示例。
例如, 一个 YAML 文件,该文件描述了如何部署 nginx我从文档中借用了
它看起来像这样。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service labels: app: nginx spec: type: NodePort ports: - port: 8080 targetPort: 80 nodePort: 30080 protocol: TCP selector: app: nginx
上半部分(以“---”分隔)是部署描述,下半部分是服务描述。
您可以将它们分别放在不同的清单文件中进行描述和管理,但如果将它们放在同一个文件中,则应像这样用连字符分隔资源。
以下是对每个项目的解释(从上到下)。
■ "apiVersion" ⇒ Kubernetes 资源都有 API 版本,因此请指定相应的版本。
根据资源的不同,查找 API 版本可能有点复杂,但对于部署和服务,您可以使用命令 "kubectl api-resources | grep Deployment" 和 "kubectl api-resources | grep Services" 来确认 APIVERSION 列是否分别显示 "apps/v1" 和 "v1"。
■ “种类” ⇒ 输入资源类型。在本例中,我们将创建一个部署和一个服务,因此类型分别为“部署”和“服务”。
■ “元数据” ⇒ 顾名思义,这就是元数据。您可以为资源分配标签。
目前,只需记住“名称”和“标签”即可。
■ "spec" ⇒ 描述资源的具体内容。子项会因资源而异。
[此部署包含以下内容:]
选择器
部署使用此配置来管理 Pod。示例中附加了标签,我们稍后会用到它们。
副本
指定
规范
。它指定了容器中使用的镜像和端口。
[此服务包含以下内容:]
type
此项指定服务如何与外部通信,您可以从多种类型中进行选择。
具体来说,包括
“ClusterIP(可以使用 ClusterIP 连接。用于内部通信,无法进行外部访问)”、
“NodePort(可以使用工作节点的 IP 连接)”、
“LoadBalancer(可以使用负载均衡器的 IP 连接)”和
“ExternalName(用于从 Pod 连接到外部的特殊设置)”。
允许外部访问时,通常会使用“LoadBalancer”,但由于这不是公共访问,我们指定了“NodePort”直接连接到工作节点。
(对于外部访问,通常会使用名为 Ingress 的资源,它充当 L7 负载均衡器并可以终止 SSL 连接,但这次我们不需要它,所以暂时先不讨论。请注意,“LoadBalancer”也可以启用 SSL,但在云端创建时,某些供应商可能由于其规范而不支持。)
此外,“NodePort”不仅可以用于此类测试,还可以用于需要基于 NodePort 执行某些操作的情况。
port
这里,除了指定协议为 TCP 之外,我们还定义了三个端口。
”是服务端口,
“targetPort”是容器端口,
“nodePort”是工作节点端口。
由于我们在这里的类型中指定了 NodePort,因此我们将使用此“nodePort”访问 nginx。
“selector”
字段指定 Pod 中配置的标签。
创建资源
现在我们已经了解了基础知识,接下来让我们实际创建一个清单文件,运行它,并创建一些资源。
顺便说一下,在 Kubernetes 中,你可以随意命名任何文件。
与 Dockerfile 和 docker-compose.yml 不同,Kubernetes 文件不需要特定的名称,因此你可以使用易于管理的规则来创建它们。
# 使用 vi 打开文件,粘贴示例源代码,保存,然后使用 kubectl 命令创建部署:vi example.yml kubectl apply -f example.yml
检查舱体
$ kubectl get po -l app=nginx NAME READY STATUS RESTARTS AGE nginx-deployment-6595874d85-7mt97 1/1 Running 0 52s nginx-deployment-6595874d85-mds2z 1/1 Running 0 52s
您可以看到已创建两个 Pod,并且它们都处于“运行中”状态。
例如,更改 yml 文件中的“replicas”数量将增加或减少 Pod 的数量。
接下来,您可以使用以下命令检查服务:
$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 26h nginx-service NodePort 10.106.92.238 8080:30080/TCP 21m
看起来 nodePort 和服务端口已正确连接,请尝试在浏览器中输入“http://localhost:30080/”来访问 Pod。
是的,熟悉的欢迎页面出现了!

概括
这只是个引言,所以我只做了个简要概述。
在正式发布并作为一项服务提供之前,还有一些细节需要调整,但我希望这能帮助大家消除任何对其完全难以理解的疑虑。我打算
在引言之后撰写更多文章,敬请期待。
非常感谢!
21
