应用 YAML 清单
在这一步中,你将更详细地探索 kubectl apply
命令,并学习应用 Kubernetes 清单的不同方法。在上一节的 YAML 文件的基础上,我们将演示应用清单的各种技术。
首先,确保你在正确的目录中:
cd ~/project/k8s-manifests
让我们创建一个新的子目录来进一步组织我们的清单。创建一个名为 manifests
的目录并导航到其中:
mkdir -p manifests
cd manifests
现在,让我们为一个简单的 Web 应用程序创建一个清单,该清单在一个文件中包含 Deployment 和 Service。使用 nano
创建一个名为 web-app.yaml
的新文件:
nano web-app.yaml
将以下内容添加到 web-app.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
type: ClusterIP
ports:
- port: 80
targetPort: 80
此清单在一个文件中定义了两个 Kubernetes 资源,用 ---
分隔。这是一种将相关资源分组在一起的常见方法。让我们分解一下新内容:
- 一个文件中的多个资源:
web-app.yaml
文件现在包含两个单独的 Kubernetes 资源定义:一个 Deployment 和一个 Service。---
分隔符用于区分它们。
kind: Service
:这定义了一个 Service 资源。
spec.selector.app: web
:此 Service 将以具有标签 app: web
的 Pod 为目标。这与我们为 web-app
Deployment 创建的 Pod 设置的标签匹配。
spec.type: ClusterIP
:将服务类型指定为 ClusterIP
。这意味着该服务将在集群内的内部 IP 地址上公开,通常用于集群内服务之间的通信。
spec.ports
:定义服务如何将端口映射到目标 Pod。
port: 80
:你将访问的服务本身的端口。
targetPort: 80
:服务将流量转发到的目标 Pod 上的端口。
现在,让我们使用不同的方法应用此清单。
方法 1:应用整个文件
这是应用清单的最常见方法。使用 kubectl apply -f
后跟文件名:
kubectl apply -f web-app.yaml
此命令将创建 web-app.yaml
中定义的 Deployment 和 Service。你应该看到如下输出:
deployment.apps/web-app created
service/web-service created
方法 2:从目录应用
你可以一次应用目录中的所有清单。如果你的 manifests
目录中有多个清单文件,你可以通过指定目录而不是特定文件来应用它们:
kubectl apply -f .
.
表示当前目录。kubectl
将在此目录中查找 YAML 文件并应用所有文件。当你将清单组织到目录中的多个文件中时,这非常有用。
方法 3:从 URL 应用(可选)
kubectl apply
还可以直接从 URL 应用清单。这对于快速部署在线托管的示例应用程序或配置非常有用。例如,你可以从 Kubernetes 示例存储库部署 Redis 主部署:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook/redis-master-deployment.yaml
这将从 URL 下载清单并将其应用到你的集群。注意:从不受信任的 URL 应用清单时要小心,因为它们可能会修改你的集群。
让我们探索 kubectl apply
的一些其他选项。
Dry Run(模拟运行)
你可以使用 --dry-run=client
标志来模拟应用清单,而无需实际更改集群。这对于检查你的清单是否有效以及查看将创建或修改哪些资源非常有用:
kubectl apply -f web-app.yaml --dry-run=client
此命令将输出将要创建或更改的内容,但它不会实际将更改应用到你的集群。
Verbose Output(详细输出)
要从 kubectl apply
获取更详细的输出,你可以使用 -v
标志,后跟详细级别(例如,-v=7
)。较高的详细级别提供更详细的信息,这对于调试很有帮助:
kubectl apply -f web-app.yaml -v=7
这将打印有关正在进行的 API 请求和清单处理的更多信息。
验证通过应用 web-app.yaml
创建的资源。使用 kubectl get deployments
和 kubectl get services
列出集群中的 Deployment 和 Service:
## 列出 deployments
kubectl get deployments
## 列出 services
kubectl get services
## 描述 deployment 以查看更多详细信息
kubectl describe deployment web-app
kubectl get deployments
的示例输出:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 3m33s
redis-master 0/1 1 0 23s
web-app 2/2 2 2 42s
kubectl get services
的示例输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8m28s
web-service ClusterIP 10.106.220.33 <none> 80/TCP 46s
请注意,现在你有一个 web-app
Deployment,其中 2/2 个 READY
副本,以及一个类型为 ClusterIP
的 web-service
。
让我们简要讨论 Kubernetes 中声明式和命令式管理之间的区别,尤其是在 kubectl apply
和 kubectl create
的上下文中。
kubectl apply
:使用声明式方法。你在清单文件中定义期望状态,kubectl apply
尝试实现该状态。如果你使用相同的清单多次运行 kubectl apply
,则仅当清单中的期望状态与集群中的当前状态之间存在差异时,Kubernetes 才会进行更改。通常建议使用 kubectl apply
来管理 Kubernetes 资源,因为它更健壮,并且更容易管理随时间的变化。它跟踪资源的配置并允许增量更新。
kubectl create
:使用命令式方法。你直接指示 Kubernetes 创建资源。如果你尝试为已存在的资源运行 kubectl create
,通常会导致错误。与 kubectl apply
相比,kubectl create
在管理更新和更改方面不太灵活。
在大多数情况下,尤其是在管理应用程序部署时,由于其声明式特性以及对更新和配置管理的更好处理,kubectl apply
是首选和推荐的方法。