Kubernetes 入门
本文已按 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/configkubectl 基本操作
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-podDeployment
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-deploymentService
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: ClusterIPService 类型说明:
| 类型 | 说明 |
|---|---|
| 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-appHelm 包管理
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 |
| 查看所有 Pod | kubectl get pods -A |
| 查看 Pod 日志 | kubectl logs POD名称 |
| 进入 Pod | kubectl 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 |
生产环境注意事项
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 等更多资源类型。