Kubernetes(简称 K8s) 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它诞生于谷歌,借鉴了其内部十多年的大规模容器管理经验,旨在解决容器化应用在部署、弹性伸缩、服务发现、故障恢复等方面的复杂性问题。
在学习使用 K8s 前,需理解以下核心术语:
使用 Minikube 在单节点上运行 K8s 集群:
# 安装 Minikube(以 macOS 为例)
brew install minikube
# 启动集群(默认使用 Docker 作为容器运行时)
minikube start
# 安装 kubectl 命令行工具(K8s 客户端)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
使用 kubeadm 工具快速搭建高可用集群(简化版步骤):
# 初始化 Master 节点
kubeadm init --apiserver-advertise-address=<Master节点IP>
# 配置 kubectl(非 root 用户)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 添加 Worker 节点(在 Worker 节点执行)
kubeadm join <Master节点IP>:6443 --token <令牌> --discovery-token-ca-cert-hash sha256:<哈希值>
以部署一个 Nginx 服务为例,演示 K8s 核心操作流程。
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3 # 运行 3 个 Nginx Pod
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.23 # 使用 Nginx 镜像
ports:
- containerPort: 80 # 容器监听 80 端口
应用部署:
kubectl apply -f nginx-deployment.yaml
# 查看 Deployment
kubectl get deployments
# 查看 Pod(等待状态变为 Running)
kubectl get pods -o wide # -o wide 显示节点信息
# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort # 通过节点端口暴露服务(本地环境可用)
selector:
app: nginx
ports:
- protocol: TCP
port: 80 # 服务端口
targetPort: 80 # Pod 端口
nodePort: 30080 # 可选,未指定时自动分配(30000-32767)
应用服务:
kubectl apply -f nginx-service.yaml
访问服务:
# 本地环境(Minikube)使用以下命令打开浏览器
minikube service nginx-service
# 扩展到 5 个副本
kubectl scale deployment nginx-deployment --replicas=5
# 查看实时扩缩容状态(需安装 kubectl-dashboard 或使用 watch)
kubectl get pods --watch
# 更新 Nginx 镜像版本
kubectl set image deployment nginx-deployment nginx=nginx:1.24
# 查看更新状态
kubectl rollout status deployment nginx-deployment
# 回滚到上一版本
kubectl rollout undo deployment nginx-deployment
# pv-pvc.yaml
# 定义 PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce # 单节点读写
hostPath:
path: "/data/k8s" # 节点本地路径
# 定义 PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
将 PVC 挂载到 Pod:
# 在 Deployment 的 Pod 模板中添加 volumes 和 volumeMounts
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: local-pvc
containers:
- name: nginx
...
volumeMounts:
- name: data-volume
mountPath: "/usr/share/nginx/html" # 容器内挂载路径
使用 NetworkPolicy 控制 Pod 间的网络流量:
# network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 3306 # 允许前端 Pod 访问后端数据库端口
requests
(最小资源)和 limits
(最大资源),避免资源竞争:resources:
requests:
cpu: "0.5" # 0.5 核 CPU
memory: "512Mi"
limits:
cpu: "1"
memory: "1Gi"
nodeAffinity
控制 Pod 调度到特定节点,或通过 podAntiAffinity
避免同类型 Pod 部署在同一节点。kubectl logs <pod-name> # 查看单个 Pod 日志
kubectl logs -f <pod-name> # 实时跟踪日志
default
账户。kubernetes
)。通过以上步骤,你已掌握 K8s 的核心概念和基础操作。记住,K8s 的强大在于其生态的丰富性(如 Helm 包管理、Knative Serverless 框架),建议从实际项目需求出发,逐步深入学习调度策略、自定义资源(CRD)、服务网格(如 Istio)等进阶主题。开始你的 K8s 之旅吧!