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

目录
您好。
我是系统解决方案部门的基础设施 Wasshoi-man,我撰写了很多关于[介绍]的文章。
我是一名真正的守门人,今天我要写一篇关于 Kubernetes 的文章。
网上有很多详细的入门文章,以至于我还没开始写就有点泄气了,但我会尝试用我自己的方式,用简单易懂的方式总结我所学到的东西
。
这次,我们将实际在 Kubernetes 上设置 nginx 并显示欢迎页面。
虽然开发人员可能很少会深入研究 Kubernetes,但为了最大限度地提高在 Kubernetes 环境中的应用程序性能,您需要在一定程度上设计应用程序以使其与 Kubernetes 兼容,因此请将本文作为入门的垫脚石!
什么是 Kubernetes?
以下是文档说明:
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,并支持声明式配置管理和自动化。Kubernetes 拥有庞大且快速增长的生态系统,提供丰富的服务、支持和工具。
官方文档: https://kubernetes.io/en/docs/concepts/overview/what-is-kubernetes/
由于可能不太清楚,我将逐步解释。首先,Kubernetes 是一个容器编排工具(它像指挥家一样管理多个容器),因此需要具备一定的容器知识。
声明式配置管理和自动化
在 Kubernetes 中,你可以在一个名为清单文件的文件中描述(声明)“期望状态”,它会根据清单文件的内容创建一个 Pod(容器和卷的集合)。
例如,如果你订购了“四个容器”,然后不小心删除了一个,Kubernetes 会意识到“少了一个”,并自动创建一个新的容器。
使用 Docker Compose 和其他工具时,容器一旦创建完成,就不会再进行任何操作,但 Kubernetes 的不同之处在于,它添加了上述的管理功能。
管理容器化工作负载和服务
熟悉 Docker 的朋友可能知道,Docker 在单台机器上运行容器。
而 Kubernetes 则管理多台机器上的容器。
大型应用通常需要连接多台机器来分配负载和功能。无需在每台机器上运行 `docker run` 命令,只需准备上面提到的清单文件,容器就会以简洁的方式部署到每台机器上,这使其成为部署大型服务时的得力工具。
优点
除了是使用容器部署大规模服务的实际标准之外,它还具有其他几个
优势,例如能够像 Docker 一样提供配置文件、使用副本集进行版本控制,以及能够在不停止容器的情况下对其进行更新。另一个
主要优势是其开源社区在全球范围内非常活跃。
Kubernetes 术语表
Kubernetes 使用了许多独特的概念和术语。
你不得不记住它们,所以我将给出简要的解释。
现阶段,我希望你带着这样的心态来阅读本文:世上确实存在这样的人。如果你使用它,无论你是否喜欢,你都会记住它们。
主节点
这是我们发出命令的部分。稍后我们会详细介绍,这里还有工作节点,主节点的作用是向这些工作节点发出指令。它是由一组组件组成的,提供
诸如“kube-apiver(接收并处理来自我们的命令)”、“
etcd(存储接收到的‘期望状态’的数据库)”
和“kube-scheduler(将 Pod 分配给工作节点)”等管理功能。
工作节点
该区域与主节点协同工作,是实际放置 pod 的地方。
它包括“kube-let(与 kube-schedule 通信)”
“kube-proxy(处理网络)”。
荚
它是由容器和卷(存储空间)组成的集合。
即使不使用卷,Kubernetes 也会将 Pod 作为一个整体进行管理。
服务
它的作用是将 Pod 分组。
每个服务都会分配一个 IP 地址,当您访问该 IP 地址时,服务会将流量负载均衡到其下属的 Pod。
这种负载均衡是针对每个工作节点进行的,因此跨多个工作节点的负载均衡不在该服务的范围内。
复制套装
如上所述,当 Pod 停止或删除时,Kubernetes 会自动恢复所需数量的 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 的全部步骤。
清单文件示例
我们来看一个清单文件的示例。
例如,我
从文档中借用了一个用于部署 nginx 的 YAML 文件它看起来像这样:
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 版本,因此请输入相应的版本。
根据资源的不同,检查此版本可能有点复杂,但对于部署和服务,您可以使用命令 "kubectl api-resources | grep Deployment" 和 "kubectl api-resources | grep Services" 来确认 APIVERSION 字段中分别列出了 "apps/v1" 和 "v1"。
■ “种类” ⇒ 输入资源类型。在本例中,我们将创建一个部署和一个服务,因此类型分别为“部署”和“服务”。
■ “元数据” ⇒ 顾名思义,这就是元数据。您可以为资源添加标签。
目前,只需记住“名称”和“标签”即可。
■ "spec" ⇒ 描述资源的具体内容。子项因资源而异。
[此部署包含以下内容。]
选择器
部署使用此信息来管理 Pod。示例中添加了一个标签。我们稍后会用到它。
replica 指定
副本集。在上面的示例中,我们请求了两个 Pod。
spec
是 Pod 的规格说明。它指定了容器中使用的镜像和端口。
[此服务包含以下内容:]
type
此项允许您从多种类型中进行选择,以指定服务如何与外部世界通信。具体选项包括
“
ClusterIP(可通过 ClusterIP 连接。用于内部通信,无法进行外部访问)”、
“NodePort(可通过工作节点 IP 连接)”
、“LoadBalancer(可通过负载均衡器 IP 连接)”
和“ExternalName(用于从 Pod 连接到外部世界的特殊设置)”。
从外部访问时,通常会使用“负载均衡器”(LoadBalancer),但由于这次没有公共访问,我们指定了一个“节点端口”(NodePort),它直接连接到工作节点。
(对于外部访问,通常会使用名为 Ingress 的资源,它充当 L7 负载均衡器并可以终止 SSL 连接,但这次我们不会使用它,所以暂时先不讨论它。请注意,“负载均衡器”也可以启用 SSL,但由于规范限制,某些云供应商可能不支持此功能。)
此外,“节点端口”不仅可以用于像这次这样的测试,还可以用于需要基于节点端口执行某些操作的情况。
还定义了端口 “port”是服务端口,
“targetPort”是容器端口,
“nodePort”是工作节点端口。
在本例中,类型指定为 NodePort,因此 nginx 将通过此“nodePort”访问。
选择器:
此项指定 Pod 中设置的标签。
创建资源
现在我们已经了解了基础知识,接下来让我们实际创建清单文件、运行它并创建资源。
顺便说一下,Kubernetes 中使用的文件可以使用任何名称。
与 Dockerfile 和 docker-compose.yml 不同,它们不需要特定的名称,因此您可以根据易于管理的规则来创建它们。
# 使用 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