欢迎来到 Kubernetes 学习的关键一步!今天,我们将亲手在集群上运行第一个应用(Nginx),并学会使用kubectl这个强大的命令行工具与集群进行交互。同时,我们会深入理解Namespace(命名空间)这个概念,它是你在 K8s 中进行资源隔离和组织的基石。
一、与集群交互的核心命令:kubectl
kubectl是 K8s 的“瑞士军刀”,所有对集群的操作几乎都通过它来完成。以下是你今天必须掌握的五个核心命令。
| 命令 | 作用 | 常用选项/示例 |
|---|---|---|
kubectl get | 列出资源 | kubectl get podskubectl get nodeskubectl get all |
kubectl describe | 显示资源的详细信息 | kubectl describe pod <pod-name> |
kubectl logs | 查看 Pod 中容器的日志 | kubectl logs <pod-name>kubectl logs -f <pod-name>(实时跟踪) |
kubectl exec | 在 Pod 的容器内执行命令 | kubectl exec -it <pod-name> -- /bin/bash |
kubectl delete | 删除资源 | kubectl delete pod <pod-name> |
💡 提示:你可以在任何命令后加上
-o wide获取更多信息(如 Pod 的 IP 和所在节点),或加上-o yaml查看资源的完整 YAML 配置。
二、实战:在集群上运行第一个 Nginx Pod
Pod 是 K8s 中最小的部署单元,你可以把它想象成一个或多个容器的“胶囊”。现在,我们通过命令行直接创建一个运行 Nginx 的 Pod。
1. 使用run命令创建 Pod
# 创建一个名为 my-nginx 的 Pod,使用 nginx:alpine 镜像 kubectl run my-nginx --image=nginx:alpine --port=80输出:
pod/my-nginx created
2. 查看 Pod 状态
刚创建的 Pod 状态为ContainerCreating,几秒后会变为Running。
kubectl get pods输出示例:
NAME READY STATUS RESTARTS AGE my-nginx 1/1 Running 0 45sREADY 1/1:表示 Pod 内 1 个容器已准备就绪。
3. 使用describe查看 Pod 的“体检报告”
当 Pod 出现问题时,describe是最佳诊断工具。
kubectl describe pod my-nginx这条命令会输出大量信息,包括:
基本信息:Pod 名称、Namespace、节点 IP。
事件 (Events):这是最关键的诊断区,记录了 Pod 从调度、拉取镜像到启动的全过程,以及任何错误(如镜像拉取失败)。
4. 使用exec进入 Pod 内部
你可以像操作普通 Linux 容器一样,进入 Pod 内部进行调试。
# 进入 Pod 的 /bin/sh(Alpine 镜像默认 shell) kubectl exec -it my-nginx -- /bin/sh进入后,可以执行ls /usr/share/nginx/html查看网页文件,或curl localhost测试服务。输入exit退出。
5. 使用logs查看 Nginx 访问日志
即使不进入 Pod,你也可以查看其日志。
# 查看日志 kubectl logs my-nginx # 实时跟踪日志(类似 tail -f) kubectl logs -f my-nginx打开一个新终端,再通过“端口转发”访问服务,就能看到日志输出。
6. 端口转发:本地访问 Pod 服务
Pod 默认有集群内部 IP,外部无法直接访问。我们可以使用端口转发临时打通一个通道。
# 将本地的 8080 端口转发到 Pod 的 80 端口 kubectl port-forward pod/my-nginx 8080:80现在,打开浏览器访问http://localhost:8080,就能看到 Nginx 的欢迎页了!
7. 清理资源
# 删除 Pod kubectl delete pod my-nginx三、核心概念:Namespace (命名空间)
当你的团队或应用变得复杂时,Namespace就变得至关重要。它提供了一种逻辑上(非物理上)的隔离机制,就像在同一个操作系统中划分出不同的文件夹。
为什么需要 Namespace?
资源隔离:将不同环境(如
dev、test、prod)或不同团队的项目放在不同的命名空间中,避免资源命名冲突和相互干扰。权限控制:结合 RBAC,可以精确控制用户对特定命名空间的访问权限。
资源配额:可以为不同的命名空间设置 CPU、内存等资源配额,防止某个应用耗尽整个集群的资源。
K8s 默认的 Namespace
集群创建后,默认会有几个命名空间:
default:如果你不指定,所有资源默认都创建在这里。kube-system:存放 Kubernetes 系统组件(如 CoreDNS、kube-proxy),建议不要在这里操作。kube-public:一个特殊的命名空间,其资源可以被所有人(包括未认证用户)读取。kube-node-lease:用于存储节点心跳信息。
实战:使用 Namespace 隔离资源
1. 创建 Namespace
# 方式一:直接命令创建 kubectl create namespace dev # 方式二:通过 YAML 创建(更规范,可保存配置) cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Namespace metadata: name: test EOF验证:kubectl get namespaces(或kubectl get ns)
2. 在指定 Namespace 中创建资源
# 方法一:使用 --namespace 参数(缩写 -n) kubectl run nginx-dev --image=nginx --namespace=dev # 方法二:查看 Pod 时,加上 -n 参数 kubectl get pods -n dev💡 设置默认 Namespace:为了避免每次输入-n,可以通过工具kubens(kubectx 套件的一部分) 或直接修改 kubeconfig 来切换默认上下文。
3. 查看不同命名空间的资源
# 查看所有命名空间的 Pod kubectl get pods --all-namespaces # 或者 kubectl get pods -A4. 删除 Namespace
# 删除命名空间(这会同时删除该命名空间内的所有资源) kubectl delete namespace dev⚠️ 警告:删除操作不可逆,请务必谨慎!
四、综合实战:多命名空间部署演练
下面,我们通过一个完整的场景来巩固所学知识。
场景:在default和test命名空间中分别运行 Nginx
1. 创建test命名空间
kubectl create namespace test2. 创建两个 Nginx Pod
# 在 default 命名空间创建 kubectl run nginx-default --image=nginx:alpine # 在 test 命名空间创建 kubectl run nginx-test --image=nginx:alpine -n test3. 查看和管理 Pod
# 查看 default 命名空间的 Pod kubectl get pods # 查看 test 命名空间的 Pod kubectl get pods -n test # 查看所有命名空间的 Pod kubectl get pods -A | grep nginx4. 体验“逻辑隔离”
# 尝试在 default 空间中查看 test 的 Pod,会提示“no resources found” kubectl get pods | grep nginx-test # 不会输出内容 # 正确的查看方式 kubectl get pods -n test | grep nginx-test这就体现了 Namespace 的资源隔离特性:在不同 Namespace 中,即使资源名称相同(如两个 Pod 都叫nginx),它们也是相互独立、互不干扰的。
5. 清理环境
kubectl delete pod nginx-default kubectl delete pod nginx-test -n test # 或直接删除整个命名空间(会删除其中的所有资源) kubectl delete namespace test五、总结:今日核心收获
✅掌握核心命令:get,describe,logs,exec,delete是日常运维的“五虎将”。
✅理解资源模型:Pod 是最小部署单元,今天是你与它第一次亲密接触。
✅Namespace 管理能力:学会了创建、切换、查看和删除 Namespace,理解了它对于资源组织和隔离的价值。
📋 今日学习检查清单
我能在集群上成功运行一个 Nginx Pod。
我能熟练使用
kubectl get pods,describe,logs,exec命令。我理解了 Namespace 的作用,并能创建和切换 Namespace。
我能够区分不同 Namespace 下的同名资源。