快速开始
概述
本章将指导您快速上手Kubernetes,从安装到部署第一个应用。我们将使用Minikube作为开发环境,因为它简单易用。
环境准备
1. 安装Docker
bash
# Linux (Ubuntu/Debian)
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
# 验证安装
docker --version2. 安装Minikube
bash
# Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# macOS
brew install minikube
# Windows
choco install minikube
# 验证安装
minikube version3. 安装kubectl
bash
# Linux
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# macOS
brew install kubectl
# Windows
choco install kubernetes-cli
# 验证安装
kubectl version --client启动Kubernetes集群
启动Minikube
bash
# 启动集群
minikube start --driver=docker --cpus=2 --memory=4096
# 查看集群状态
minikube status
# 查看节点信息
kubectl get nodes
# 查看集群信息
kubectl cluster-info配置kubectl自动补全
bash
# Bash
echo 'source <(kubectl completion bash)' >> ~/.bashrc
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -o default -F __start_kubectl k' >> ~/.bashrc
source ~/.bashrc
# Zsh
echo 'source <(kubectl completion zsh)' >> ~/.zshrc
echo 'alias k=kubectl' >> ~/.zshrc
echo 'complete -o default -F __start_kubectl k' >> ~/.zshrc
source ~/.zshrc第一个应用:部署Nginx
1. 创建Deployment
bash
# 部署Nginx
kubectl create deployment nginx-deployment --image=nginx:1.21
# 查看Deployment
kubectl get deployments
# 查看Pod
kubectl get pods
# 查看Pod详细信息
kubectl describe pod <pod-name>2. 创建Service
bash
# 创建NodePort Service
kubectl expose deployment nginx-deployment --type=NodePort --port=80
# 查看Service
kubectl get services
# 获取访问URL
minikube service nginx-deployment --url
# 访问应用
curl $(minikube service nginx-deployment --url)3. 使用YAML文件部署
yaml
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"bash
# 使用YAML文件部署
kubectl apply -f nginx-deployment.yaml
# 查看部署状态
kubectl get deployments
kubectl get pods常用操作
查看资源
bash
# 查看所有资源
kubectl get all
# 查看Pod详细信息
kubectl describe pod <pod-name>
# 查看Pod日志
kubectl logs <pod-name>
# 进入Pod容器
kubectl exec -it <pod-name> -- /bin/bash扩缩容
bash
# 扩展副本数
kubectl scale deployment nginx-deployment --replicas=5
# 查看扩展结果
kubectl get pods
# 缩减副本数
kubectl scale deployment nginx-deployment --replicas=2更新应用
bash
# 更新镜像版本
kubectl set image deployment/nginx-deployment nginx=nginx:1.22
# 查看更新状态
kubectl rollout status deployment/nginx-deployment
# 查看更新历史
kubectl rollout history deployment/nginx-deployment回滚应用
bash
# 回滚到上一个版本
kubectl rollout undo deployment/nginx-deployment
# 回滚到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2部署多容器应用
示例:WordPress + MySQL
yaml
# wordpress-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:5.7
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pvc
---
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:5.8
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pvcbash
# 创建Secret
kubectl create secret generic mysql-pass --from-literal=password=YOUR_PASSWORD
# 部署WordPress
kubectl apply -f wordpress-deployment.yaml
# 查看部署状态
kubectl get pods
kubectl get services
# 获取访问URL
minikube service wordpress --url配置管理
使用ConfigMap
yaml
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_NAME: "My Application"
LOG_LEVEL: "INFO"
MAX_CONNECTIONS: "100"yaml
# deployment-with-configmap.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: myapp:latest
env:
- name: APP_NAME
valueFrom:
configMapKeyRef:
name: app-config
key: APP_NAME
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOG_LEVEL使用Secret
yaml
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
DB_PASSWORD: cGFzc3dvcmQxMjM= # base64编码的密码
API_KEY: YXBpLWtleS1zZWNyZXQ=存储管理
使用PersistentVolumeClaim
yaml
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Giyaml
# deployment-with-pvc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: myapp:latest
volumeMounts:
- name: app-storage
mountPath: /data
volumes:
- name: app-storage
persistentVolumeClaim:
claimName: app-pvc网络管理
创建Ingress
yaml
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80bash
# 启用Ingress插件
minikube addons enable ingress
# 部署Ingress
kubectl apply -f ingress.yaml
# 查看Ingress
kubectl get ingress
# 添加hosts记录
echo "$(minikube ip) myapp.local" | sudo tee -a /etc/hosts
# 访问应用
curl http://myapp.local多环境部署方案
1. 开发环境
使用Minikube
bash
# 启动开发环境集群
minikube start --driver=docker --cpus=2 --memory=4096 --kubernetes-version=v1.28.0
# 启用常用插件
minikube addons enable ingress
minikube addons enable metrics-server
minikube addons enable dashboard
# 访问Dashboard
minikube dashboard开发工作流
- 本地开发和测试
- 构建Docker镜像
- 推送到私有镜像仓库
- 在Minikube中部署和验证
2. 测试环境
使用K3s
bash
# 安装K3s服务器
curl -sfL https://get.k3s.io | sh -
# 配置kubectl
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
# 添加Worker节点
curl -sfL https://get.k3s.io | K3S_URL=https://<server-ip>:6443 K3S_TOKEN=<token> sh -测试环境特点
- 与生产环境配置相似
- 数据量较小
- 用于集成测试和预发布验证
3. 生产环境
使用kubeadm
bash
# 参考集群搭建章节的高可用部署
# 部署3个Master节点和多个Worker节点
# 配置负载均衡器和外部存储生产环境特点
- 高可用设计
- 完善的监控和告警
- 严格的安全配置
- 定期备份和灾难恢复
4. 多环境配置管理
使用Kustomize
bash
# 创建基础配置
tree k8s/
├── base/
│ ├── deployment.yaml
│ └── service.yaml
└── overlays/
├── development/
│ └── kustomization.yaml
├── testing/
│ └── kustomization.yaml
└── production/
└── kustomization.yaml部署到不同环境
bash
# 部署到开发环境
kubectl apply -k k8s/overlays/development
# 部署到测试环境
kubectl apply -k k8s/overlays/testing
# 部署到生产环境
kubectl apply -k k8s/overlays/production开发环境搭建指南
1. 本地开发环境
使用Docker Desktop
bash
# 启用Kubernetes
# Docker Desktop -> Settings -> Kubernetes -> Enable Kubernetes
# 验证集群
kubectl get nodes使用Minikube
bash
# 安装Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 启动集群
minikube start --driver=docker
# 配置kubectl
minikube update-context2. 开发工具集成
IDE集成
- VS Code: 安装Kubernetes扩展
- IntelliJ IDEA: 安装Kubernetes插件
- Eclipse: 安装Kubernetes工具
CI/CD集成
yaml
# .github/workflows/k8s-deploy.yml
name: Kubernetes Deploy
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Build and push
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: myapp:${{ github.sha }}
- name: Deploy to Kubernetes
uses: steebchen/kubectl@master
with:
config: ${{ secrets.KUBE_CONFIG }}
command: apply -f k8s/deployment.yaml监控和日志
查看日志
bash
# 查看Pod日志
kubectl logs <pod-name>
# 查看指定容器日志
kubectl logs <pod-name> -c <container-name>
# 实时查看日志
kubectl logs -f <pod-name>
# 查看最近1小时的日志
kubectl logs --since=1h <pod-name>
# 查看Pod的前100行日志
kubectl logs --tail=100 <pod-name>
# 查看所有容器的日志
kubectl logs <pod-name> --all-containers启用监控
bash
# 启用Metrics Server
minikube addons enable metrics-server
# 查看资源使用情况
kubectl top nodes
kubectl top pods
kubectl top pods --all-namespaces
# 查看Pod资源详情
kubectl describe pod <pod-name>
# 查看节点资源详情
kubectl describe node <node-name>故障排查
常见问题解决
1. Pod处于Pending状态
问题原因:
- 节点资源不足
- 资源配额限制
- 调度约束不满足
- 镜像拉取失败
解决方案:
bash
# 查看Pod事件
kubectl describe pod <pod-name>
# 查看节点资源
kubectl describe node <node-name>
# 查看资源配额
kubectl get resourcequotas
# 检查镜像是否存在
docker pull <image-name>
# 检查网络连接
kubectl run test --image=busybox --rm -it -- ping docker.io2. Pod处于CrashLoopBackOff状态
问题原因:
- 应用启动失败
- 配置错误
- 依赖服务不可用
- 资源限制不足
解决方案:
bash
# 查看Pod日志
kubectl logs <pod-name>
kubectl logs <pod-name> --previous # 查看上一次启动的日志
# 查看容器退出码
kubectl describe pod <pod-name>
# 进入容器调试
kubectl exec -it <pod-name> -- /bin/sh
# 检查配置文件
kubectl get configmap <configmap-name> -o yaml
# 检查依赖服务
kubectl get pods -l app=<dependency-name>3. Service无法访问
问题原因:
- Endpoint未正确创建
- 网络策略限制
- 防火墙规则阻止
- 服务端口配置错误
解决方案:
bash
# 查看Service详情
kubectl describe service <service-name>
# 查看Endpoint
kubectl get endpoints <service-name>
# 测试网络连通性
kubectl run test --image=busybox --rm -it -- ping <service-name>
kubectl run test --image=busybox --rm -it -- wget -O- http://<service-name>:<port>
# 检查网络策略
kubectl get networkpolicy --all-namespaces
# 检查Pod状态
kubectl get pods -l <service-selector>4. 镜像拉取失败
问题原因:
- 镜像不存在
- 网络连接问题
- 认证失败
- 镜像仓库不可用
解决方案:
bash
# 检查镜像拉取错误
kubectl describe pod <pod-name> | grep -A 10 "Failed to pull image"
# 手动拉取镜像
docker pull <image-name>
# 检查网络连接
ping docker.io
# 检查认证配置
kubectl get secret --type=docker-registry
# 使用国内镜像源
# 修改deployment使用国内镜像源5. 节点NotReady状态
问题原因:
- kubelet服务未运行
- 网络插件故障
- 节点资源耗尽
- 磁盘空间不足
解决方案:
bash
# 检查节点状态
kubectl describe node <node-name>
# 检查kubelet状态
ssh <node-ip> systemctl status kubelet
# 查看kubelet日志
ssh <node-ip> journalctl -u kubelet -f
# 检查节点资源
ssh <node-ip> free -m
ssh <node-ip> df -h
# 检查网络插件
kubectl get pods -n kube-system -l k8s-app=<network-plugin>6. 配置错误
问题原因:
- YAML语法错误
- 字段值无效
- 依赖资源不存在
- 权限不足
解决方案:
bash
# 验证YAML语法
kubectl apply --dry-run=client -f <file.yaml>
# 查看详细错误信息
kubectl apply -f <file.yaml> -v=9
# 检查依赖资源
kubectl get <resource-type> <resource-name>
# 检查权限
kubectl auth can-i create <resource-type> --namespace <namespace>
# 使用kubectl explain查看字段说明
kubectl explain <resource-type>.<field>7. 集群无法启动
问题原因:
- 端口冲突
- 配置文件错误
- 依赖服务未运行
- 网络连接问题
解决方案:
bash
# 检查kubelet状态
systemctl status kubelet
# 查看kubelet日志
journalctl -u kubelet -f
# 检查apiserver状态
kubectl cluster-info
# 检查etcd状态
etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key endpoint health
# 重启服务
systemctl restart kubelet
systemctl restart docker清理资源
删除资源
bash
# 删除Deployment
kubectl delete deployment nginx-deployment
# 删除Service
kubectl delete service nginx-deployment
# 删除所有资源
kubectl delete all --all
# 停止Minikube集群
minikube stop
# 删除Minikube集群
minikube delete学习路径建议
下一步学习
- 深入学习Pod:了解Pod生命周期、探针、资源限制
- 掌握Service:学习不同类型的Service及其应用场景
- 实践存储管理:使用PV、PVC、StorageClass
- 配置管理:掌握ConfigMap和Secret的使用
- 网络配置:学习Ingress和网络策略
实践项目
- 部署一个简单的Web应用
- 配置数据库持久化存储
- 实现应用滚动更新
- 配置应用健康检查
- 设置资源配额和限制
总结
通过本章的学习,您已经掌握了Kubernetes的基本操作和多环境部署方案:
核心内容
- 环境准备:安装Docker、Minikube和kubectl
- 集群管理:启动、停止和管理Kubernetes集群
- 应用部署:部署单容器和多容器应用
- 服务管理:创建和配置Service、Ingress
- 配置管理:使用ConfigMap和Secret管理配置
- 存储管理:使用PersistentVolumeClaim管理存储
- 监控日志:查看Pod日志和资源使用情况
- 故障排查:解决常见的Kubernetes问题
多环境部署
- 开发环境:使用Minikube,快速启动和测试
- 测试环境:使用K3s,模拟生产环境配置
- 生产环境:使用kubeadm部署高可用集群
- 配置管理:使用Kustomize管理多环境配置
开发工具集成
- IDE集成:VS Code、IntelliJ IDEA、Eclipse等
- CI/CD集成:GitHub Actions、GitLab CI等
- 本地开发:Docker Desktop、Minikube等
故障排查能力
- Pod问题:Pending、CrashLoopBackOff等状态的解决
- Service问题:网络连通性、Endpoint配置等
- 节点问题:NotReady状态、资源耗尽等
- 配置问题:YAML语法、权限不足等
通过本章的学习,您已经具备了Kubernetes的基本操作能力,可以开始构建和管理容器化应用。接下来可以深入学习各个核心概念,如Pod、Deployment、Service等,逐步掌握Kubernetes的高级特性和最佳实践。