Skip to Content
文档服务器Kubernetes 入门

Kubernetes 入门

Note

本文已按 Ubuntu 26.04 LTS 2026 年 4 月发布说明做初步复核,Kubernetes 组件版本和生产部署细节仍需随 MicroK8s / upstream 更新继续验证。

Kubernetes(简称 K8s)是目前最流行的容器编排平台,由 Google 开源并捐赠给 CNCF(云原生计算基金会)。它可以自动化容器化应用的部署、扩展和管理,是现代云原生架构的基石。

Ubuntu 是运行 Kubernetes 的主流 Linux 发行版之一,Canonical 还推出了 MicroK8s——一个轻量级、易于安装的 Kubernetes 发行版,非常适合开发、测试和边缘计算场景。

K8s 是什么,为什么需要

没有 K8s 之前的痛点

在容器化时代,Docker 解决了”应用打包和运行”的问题。但当你有几十甚至上百个容器需要管理时,新的问题随之而来:

  • 某个容器挂了,谁来自动重启?
  • 流量增大时,如何自动扩容?
  • 多个容器之间如何相互发现和通信?
  • 如何实现滚动更新,不中断服务?
  • 怎样在多台服务器上调度容器?

K8s 解决了什么

Kubernetes 就是为了解决这些问题而生的:

功能说明
自愈能力容器崩溃后自动重启,节点故障时自动迁移
水平扩展根据负载自动增减容器实例数
服务发现容器自动注册,通过 DNS 名称互相访问
滚动更新逐步替换旧版本,零停机部署
负载均衡自动将流量分发到多个容器实例
配置管理集中管理应用配置和密钥

MicroK8s 安装

MicroK8s 是 Canonical 推出的轻量级 Kubernetes,通过 Snap 安装,一条命令即可搞定。

安装 MicroK8s

# 安装 MicroK8s # channel 选择最新稳定版,具体可用版本以 snap info microk8s 输出为准 sudo snap install microk8s --classic --channel=1.33/stable # 将当前用户加入 microk8s 组(避免每次都用 sudo) sudo usermod -a -G microk8s $USER sudo chown -f -R $USER ~/.kube # 重新登录使组权限生效 newgrp microk8s # 检查安装状态 microk8s status --wait-ready

启用常用插件

MicroK8s 内置了许多实用插件:

# 启用 DNS(集群内部域名解析,几乎必须启用) microk8s enable dns # 启用本地存储 microk8s enable hostpath-storage # 启用 Dashboard(Web 管理界面) microk8s enable dashboard # 启用 Ingress(HTTP 反向代理) microk8s enable ingress # 启用容器镜像仓库 microk8s enable registry # 一次启用多个插件 microk8s enable dns hostpath-storage dashboard ingress # 查看所有可用插件 microk8s status

配置 kubectl 别名

MicroK8s 自带 microk8s kubectl,但每次输入太长了。你可以配置别名:

# 方式一:使用别名 alias kubectl='microk8s kubectl' echo "alias kubectl='microk8s kubectl'" >> ~/.bashrc # 方式二:导出配置给独立安装的 kubectl 使用 microk8s config > ~/.kube/config

kubectl 基本操作

kubectl 是 Kubernetes 的命令行工具,用于与集群交互。

集群信息

# 查看集群信息 kubectl cluster-info # 查看所有节点 kubectl get nodes # 查看节点详细信息 kubectl describe node <node-name> # 查看集群组件状态 kubectl get componentstatuses

资源查看

# 查看所有 Pod kubectl get pods # 查看所有命名空间的 Pod kubectl get pods --all-namespaces # 或简写 kubectl get pods -A # 查看 Pod 详细信息(宽输出) kubectl get pods -o wide # 查看所有 Deployment kubectl get deployments # 查看所有 Service kubectl get services # 或简写 kubectl get svc # 查看所有资源 kubectl get all

资源详情与日志

# 查看 Pod 详细信息 kubectl describe pod <pod-name> # 查看 Pod 日志 kubectl logs <pod-name> # 实时追踪日志 kubectl logs -f <pod-name> # 查看多容器 Pod 中指定容器的日志 kubectl logs <pod-name> -c <container-name> # 进入 Pod 内部执行命令 kubectl exec -it <pod-name> -- /bin/bash

核心概念

Pod

Pod 是 Kubernetes 中最小的部署单元。一个 Pod 包含一个或多个容器,它们共享网络和存储。

# pod-example.yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
# 创建 Pod kubectl apply -f pod-example.yaml # 查看 Pod 状态 kubectl get pod nginx-pod # 删除 Pod kubectl delete pod nginx-pod

Deployment

Deployment 管理 Pod 的副本数量、滚动更新和回滚。在实际生产中,你几乎不会直接创建 Pod,而是通过 Deployment 来管理。

# deployment-example.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.27 ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m"
# 部署应用 kubectl apply -f deployment-example.yaml # 查看部署状态 kubectl get deployment nginx-deployment # 扩容/缩容 kubectl scale deployment nginx-deployment --replicas=5 # 查看滚动更新状态 kubectl rollout status deployment nginx-deployment # 更新镜像版本 kubectl set image deployment/nginx-deployment nginx=nginx:1.28 # 回滚到上一个版本 kubectl rollout undo deployment nginx-deployment # 查看更新历史 kubectl rollout history deployment nginx-deployment

Service

Service 为一组 Pod 提供稳定的网络端点。Pod 的 IP 是动态变化的,而 Service 提供固定的访问入口。

# service-example.yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP

Service 类型说明:

类型说明
ClusterIP默认类型,仅集群内部可访问
NodePort在每个节点上开放端口,外部可访问
LoadBalancer使用云提供商的负载均衡器
# 创建 Service kubectl apply -f service-example.yaml # 查看 Service kubectl get svc nginx-service # 使用 NodePort 暴露服务 kubectl expose deployment nginx-deployment --type=NodePort --port=80

部署第一个应用

让我们从头到尾部署一个完整的 Web 应用。

第一步:创建 Deployment

# 使用命令行快速创建 kubectl create deployment hello-app --image=gcr.io/google-samples/hello-app:1.0 # 查看 Pod 是否正常运行 kubectl get pods -l app=hello-app

第二步:暴露服务

# 创建 NodePort 类型的 Service kubectl expose deployment hello-app --type=NodePort --port=8080 # 查看分配的端口 kubectl get svc hello-app

第三步:访问应用

# 获取访问地址 # MicroK8s 默认在本机运行,所以用 localhost NODE_PORT=$(kubectl get svc hello-app -o jsonpath='{.spec.ports[0].nodePort}') echo "访问地址: http://localhost:$NODE_PORT" # 测试访问 curl http://localhost:$NODE_PORT

第四步:扩容

# 扩展到 3 个副本 kubectl scale deployment hello-app --replicas=3 # 查看所有 Pod kubectl get pods -l app=hello-app

第五步:清理

# 删除 Service 和 Deployment kubectl delete svc hello-app kubectl delete deployment hello-app

Helm 包管理

Helm 是 Kubernetes 的包管理器,类似于 Ubuntu 的 apt。它使用 Chart(包)来定义、安装和升级复杂的 Kubernetes 应用。

安装 Helm

# 方式一:通过 Snap 安装 sudo snap install helm --classic # 方式二:通过官方脚本安装 curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash # 验证安装 helm version

使用 Helm

# 添加官方稳定仓库 helm repo add bitnami https://charts.bitnami.com/bitnami # 更新仓库索引 helm repo update # 搜索 Chart helm search repo nginx helm search repo mysql # 安装应用(以 Redis 为例) helm install my-redis bitnami/redis # 查看已安装的 Release helm list # 查看 Release 状态 helm status my-redis # 自定义配置安装 helm install my-nginx bitnami/nginx \ --set replicaCount=3 \ --set service.type=NodePort # 使用 values 文件自定义配置 helm install my-app bitnami/nginx -f custom-values.yaml # 升级 Release helm upgrade my-redis bitnami/redis --set auth.enabled=false # 回滚 helm rollback my-redis 1 # 卸载 Release helm uninstall my-redis

创建自己的 Chart

# 创建新的 Chart 模板 helm create my-chart # 目录结构 # my-chart/ # Chart.yaml # Chart 元数据 # values.yaml # 默认配置值 # templates/ # K8s 资源模板 # deployment.yaml # service.yaml # ingress.yaml # 验证 Chart helm lint my-chart/ # 模拟安装(不实际部署) helm install my-release my-chart/ --dry-run --debug # 打包 Chart helm package my-chart/

常用命令速查表

操作命令
查看集群状态kubectl cluster-info
查看所有 Podkubectl get pods -A
查看 Pod 日志kubectl logs POD名称
进入 Podkubectl exec -it POD名称 -- bash
创建资源kubectl apply -f file.yaml
删除资源kubectl delete -f file.yaml
扩容kubectl scale deployment 名称 --replicas=N
更新镜像kubectl set image deployment/名称 容器=镜像
回滚kubectl rollout undo deployment/名称
端口转发kubectl port-forward pod/名称 8080:80
查看资源用量kubectl top pods
MicroK8s 状态microk8s status
MicroK8s 启动microk8s start
MicroK8s 停止microk8s stop

生产环境注意事项

Warning

MicroK8s 非常适合学习和开发,但将 Kubernetes 用于生产环境时,请注意以下几点:

  • 高可用集群:生产环境至少需要 3 个控制面节点,避免单点故障
  • 资源限制:务必为每个容器设置 resources.requests 和 resources.limits,防止某个应用耗尽整个节点的资源
  • 网络策略:配置 NetworkPolicy 限制 Pod 之间的通信,遵循最小权限原则
  • RBAC 权限:不要使用 cluster-admin 权限运行应用,为每个服务创建专用的 ServiceAccount
  • 镜像安全:仅使用可信的镜像仓库,定期扫描镜像漏洞,避免使用 latest 标签
  • 备份 etcd:etcd 存储了集群的所有状态数据,定期备份至关重要
  • 监控与告警:部署 Prometheus + Grafana 监控集群健康状态
  • 日志收集:使用 EFK(Elasticsearch + Fluentd + Kibana)或 Loki 收集日志

如果需要企业级支持,可以考虑 Canonical 的 Charmed Kubernetes 或云厂商提供的托管 K8s 服务(如 AWS EKS、Google GKE、Azure AKS)。

常见问题排查

# Pod 一直处于 Pending 状态 kubectl describe pod <pod-name> # 通常是资源不足或者节点选择器不匹配 # Pod 一直在 CrashLoopBackOff kubectl logs <pod-name> --previous # 查看上一次崩溃的日志 # 无法拉取镜像(ImagePullBackOff) kubectl describe pod <pod-name> # 检查镜像名称是否正确,是否需要配置镜像拉取凭据 # Service 无法访问 kubectl get endpoints <service-name> # 检查 Service 的 selector 是否与 Pod 的 label 匹配 # DNS 解析失败 kubectl run test --image=busybox --rm -it -- nslookup kubernetes.default # 检查 CoreDNS 是否正常运行

掌握以上内容后,你已经具备了在 Ubuntu 上运行和管理 Kubernetes 基本工作负载的能力。随着实践的深入,可以进一步学习 ConfigMap、Secret、PersistentVolume、Ingress、CronJob 等更多资源类型。

Last updated on