一、什么是 Kubernetes?
Kubernetes(简称 K8s) 是一个开源的容器编排平台,用于自动化应用程序的部署、扩展和管理。它支持多种容器运行时,并提供了一套强大的工具集来帮助开发者更轻松地管理大规模分布式应用。
核心概念:
概念 |
解释 |
Pod |
Kubernetes 中最小的可部署单元,包含一个或多个容器。 |
Node |
Kubernetes 工作节点,可以是物理机或虚拟机。 |
Service |
定义一组 Pod 的访问策略,提供稳定的网络端点。 |
Namespace |
逻辑隔离不同的项目、团队或环境。 |
Deployment |
管理无状态应用的更新与回滚。 |
StatefulSet |
管理有状态应用,如数据库等。 |
ConfigMap / Secret |
分别用于存储非敏感和敏感配置信息。 |
Volume |
提供持久化存储解决方案。 |
二、为什么选择 Kubernetes?
- ✅ 自动恢复:当容器失败时,Kubernetes 可以自动重启它们。
- ✅ 水平扩展:根据负载情况动态调整服务实例数量。
- ✅ 滚动更新:无需停机即可进行应用更新。
- ✅ 资源调度:智能分配计算资源给各个容器。
- ✅ 跨云兼容性:可在公有云、私有云或混合云环境中运行。
三、Kubernetes 集群架构概览
1. Master 节点组件
- API Server:集群入口,所有操作均通过 REST API 进行。
- Controller Manager:负责维护集群状态,如副本数量、节点健康检查等。
- Scheduler:决定将 Pod 放置在哪个 Node 上执行。
- etcd:高可用键值存储系统,保存集群的所有状态数据。
2. Worker 节点组件
- Kubelet:负责与 Master 节点通信,确保 Pod 正常运行。
- Kube-proxy:为 Service 提供网络代理功能。
- Container Runtime:如 Docker、containerd 等,负责实际运行容器。
四、安装 Kubernetes 集群(使用 kubeadm)
1. 准备工作
(1) 更新系统并关闭交换内存
sudo apt-get update && sudo apt-get upgrade -y
sudo swapoff -a
(2) 安装 Docker 或 containerd
sudo apt-get install -y docker.io
sudo systemctl enable docker.service
sudo systemctl start docker.service
对于 containerd:
sudo apt-get install -y containerd.io
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
(3) 安装 kubeadm, kubelet 和 kubectl
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
2. 初始化 Master 节点
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
初始化完成后,按照提示设置 kubectl
配置文件:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3. 部署网络插件
这里我们使用 Flannel 作为网络插件:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
4. 加入 Worker 节点
在每个 Worker 节点上运行以下命令(来自 Master 节点初始化输出):
sudo kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
5. 验证集群状态
kubectl get nodes
你应该看到所有节点的状态为 Ready
。
五、Kubernetes 基础操作
1. 创建 Deployment
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.14.2
ports:
- containerPort: 80
创建 Deployment:
kubectl apply -f nginx-deployment.yaml
2. 查看 Pods 和 Deployments
kubectl get pods
kubectl get deployments
3. 创建 Service
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
创建 Service:
kubectl apply -f nginx-service.yaml
查看 Service:
kubectl get svc
六、深入理解 Kubernetes 核心对象
1. ConfigMap 和 Secret
ConfigMap 示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: game-config
data:
# 属性格式
special.how: very
special.type: charm
挂载到 Pod 中:
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: game-config
Secret 示例:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
注意:Secret 数据需要 base64 编码。
2. StatefulSet
适用于需要稳定标识符的应用,如数据库。示例如下:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
3. Horizontal Pod Autoscaler (HPA)
自动根据 CPU 使用率或其他指标调整 Pod 数量:
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=10
七、Kubernetes 实战案例
1. 部署 Spring Boot 应用
Dockerfile 示例:
FROM openjdk:17-jdk-alpine
COPY target/myapp.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
Kubernetes Deployment YAML:
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-app
spec:
replicas: 2
selector:
matchLabels:
app: springboot-app
template:
metadata:
labels:
app: springboot-app
spec:
containers:
- name: springboot-app
image: your-dockerhub-username/springboot-app:latest
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: springboot-service
spec:
selector:
app: springboot-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
2. 使用 Helm 简化应用部署
Helm 是 Kubernetes 的包管理器,简化了复杂应用的部署流程。
安装 Helm:
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
使用 Helm Chart 部署 Nginx Ingress Controller:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx
八、Kubernetes 最佳实践建议
类别 |
建议 |
高可用 |
至少三个 Master 节点,使用外部 etcd 集群 |
监控告警 |
使用 Prometheus + Grafana 监控集群健康状况 |
日志收集 |
ELK Stack 或 Fluentd + Elasticsearch + Kibana |
CI/CD 集成 |
Jenkins、GitLab CI 等工具实现持续集成与交付 |
安全加固 |
RBAC 权限控制,启用 Network Policy |
九、学习路线图(建议)
阶段 |
学习内容 |
目标 |
第1阶段 |
Kubernetes 基本概念 |
理解核心术语及架构 |
第2阶段 |
安装与配置集群 |
掌握集群搭建技巧 |
第3阶段 |
基础对象操作 |
熟练使用 Pod、Deployment、Service 等 |
第4阶段 |
高级对象与特性 |
ConfigMap、Secret、StatefulSet、HPA 等 |
第5阶段 |
CI/CD 流水线集成 |
自动化构建与部署 |
第6阶段 |
监控与日志管理 |
实现全面监控与故障排查 |
第7阶段 |
大规模集群管理 |
处理复杂场景下的运维问题 |
十、推荐学习资源
📘 官方文档与书籍
- Kubernetes Documentation | Kubernetes
- 《Kubernetes in Action》
- 《Kubernetes权威指南》
🌐 在线课程
十一、总结
Kubernetes 是现代 DevOps 工作流中不可或缺的一部分,能够极大地提升应用开发和运维效率。通过本文的学习,你已经掌握了 Kubernetes 的基础概念、集群搭建方法以及一些高级特性的使用技巧。
希望这篇博客能成为你踏上 Kubernetes 之旅的良好起点。如果你有任何疑问或需要进一步的帮助,请随时留言!