核心概念
widgets
Pod
Kubernetes 最小的部署单元,包含一个或多个容器
backup
Deployment
管理 Pod 的副本数量和更新策略
device_hub
Service
为 Pod 提供稳定的网络访问入口
dns
Node
运行容器的物理或虚拟机器
volume_up
ConfigMap
存储配置数据,实现配置与代码分离
vpn_key
Secret
安全地存储敏感信息如密码和密钥
安装指南
使用 Homebrew 安装
# 安装 Homebrew(如果尚未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 安装 Minikube
brew install minikube
# 安装 kubectl
brew install kubectl
# 启动 Minikube
minikube start
# 验证安装
kubectl cluster-info
可选:使用 Docker 驱动
# 使用 Docker 驱动启动
minikube start --driver=docker
# 查看驱动
minikube config view
下载并安装 Minikube
# 下载 Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 安装 kubectl
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
# 启动 Minikube
minikube start
# 验证安装
kubectl cluster-info
Ubuntu/Debian 系统
# 更新包列表
sudo apt-get update
# 安装依赖
sudo apt-get install -y conntrack
# 启动 Minikube
minikube start
使用 Chocolatey 安装
# 安装 Chocolatey(如果尚未安装)
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# 安装 Minikube
choco install minikube
# 安装 kubectl
choco install kubernetes-cli
# 启动 Minikube
minikube start
# 验证安装
kubectl cluster-info
手动安装
# 下载 Minikube
# 访问 https://minikube.sigs.k8s.io/docs/start/ 下载 Windows 安装包
# 下载 kubectl
curl -LO "https://dl.k8s.io/release/stable.txt" -o kubectl_version.txt
curl -LO "https://dl.k8s.io/release/$(cat kubectl_version.txt)/bin/windows/amd64/kubectl.exe"
# 将 kubectl.exe 添加到 PATH 环境变量
Google Kubernetes Engine (GKE)
# 安装 gcloud CLI
curl https://sdk.cloud.google.com | bash
# 初始化 gcloud
gcloud init
# 创建 GKE 集群
gcloud container clusters create my-cluster \
--num-nodes=3 \
--zone=us-central1-a
# 配置 kubectl
gcloud container clusters get-credentials my-cluster \
--zone=us-central1-a
# 验证连接
kubectl get nodes
Amazon Elastic Kubernetes Service (EKS)
# 安装 AWS CLI
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
# 安装 eksctl
curl --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
# 创建 EKS 集群
eksctl create cluster --name my-cluster --region us-west-2
Azure Kubernetes Service (AKS)
# 安装 Azure CLI
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
# 登录 Azure
az login
# 创建 AKS 集群
az aks create --resource-group myResourceGroup \
--name myAKSCluster \
--node-count 3 \
--generate-ssh-keys
# 配置 kubectl
az aks get-credentials --resource-group myResourceGroup \
--name myAKSCluster
配置自动补全
# Bash
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc
# Zsh
echo 'source <(kubectl completion zsh)' >> ~/.zshrc
source ~/.zshrc
配置别名
# 添加常用别名到 ~/.bashrc 或 ~/.zshrc
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgd='kubectl get deployments'
alias kgs='kubectl get services'
alias k logs='kubectl logs'
alias k exec='kubectl exec -it'
配置多个集群
# 查看当前上下文
kubectl config current-context
# 查看所有上下文
kubectl config get-contexts
# 切换上下文
kubectl config use-context minikube
# 设置默认命名空间
kubectl config set-context --current --namespace=default
实践指南
Minikube 快速安装
# macOS
brew install minikube
# Linux
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube
sudo mv minikube /usr/local/bin/
# 启动集群
minikube start
使用 kubectl 创建 Pod
# 创建简单的 Nginx Pod
kubectl run nginx --image=nginx
# 查看 Pod 状态
kubectl get pods
# 查看详细信息
kubectl describe pod nginx
创建 Deployment
# 创建部署
kubectl create deployment myapp --image=nginx
# 扩展副本数
kubectl scale deployment myapp --replicas=3
# 查看部署状态
kubectl get deployments
创建 Service
# 创建 NodePort 服务
kubectl expose deployment myapp --port=80 --type=NodePort
# 获取服务地址
minikube service myapp
# 查看服务详情
kubectl get services
常见问题
可能原因和解决方案
- 资源不足:检查节点 CPU、内存是否足够
- 调度失败:查看 Pod 事件,使用
kubectl describe pod <pod-name> - 镜像拉取失败:检查镜像名称、tag 和仓库访问权限
- 污点(Taints):检查节点是否有污点阻止调度
# 查看详细信息
kubectl describe pod <pod-name>
# 查看事件
kubectl get events --sort-by=.metadata.creationTimestamp
# 检查节点资源
kubectl describe nodes
# 检查节点污点
kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
可能原因和解决方案
- 应用错误:查看应用日志,修复代码问题
- 配置错误:检查环境变量、ConfigMap、Secret
- 资源限制:检查内存或 CPU 限制是否过小
- 健康检查失败:检查 liveness 和 readiness 探针配置
# 查看日志
kubectl logs <pod-name>
# 查看之前的容器日志
kubectl logs <pod-name> --previous
# 查看详细信息
kubectl describe pod <pod-name>
# 进入容器调试
kubectl exec -it <pod-name> -- /bin/bash
可能原因和解决方案
- 选择器错误:检查 Service 的选择器是否匹配 Pod 的标签
- 端口配置错误:检查 targetPort 是否与 Pod 暴露的端口一致
- Pod 未就绪:检查 Pod 的 readiness 探针是否通过
- 网络策略:检查是否有网络策略阻止访问
# 查看 Service 详情
kubectl describe service <service-name>
# 查看 Endpoints
kubectl get endpoints <service-name>
# 查看 Pod 标签
kubectl get pods --show-labels
# 测试 Service 连接
kubectl run -it --rm debug --image=busybox --restart=Never -- wget -O- <service-name>
可能原因和解决方案
- 镜像不存在:检查镜像名称和 tag 是否正确
- 权限问题:配置 imagePullSecrets,确保有拉取权限
- 网络问题:检查集群是否能访问镜像仓库
- 私有仓库:创建 Docker registry Secret 并配置到 Pod
# 查看详细信息
kubectl describe pod <pod-name>
# 创建 Docker registry Secret
kubectl create secret docker-registry regcred \
--docker-server=<registry> \
--docker-username=<username> \
--docker-password=<password>
# 在 Pod 中使用
spec:
imagePullSecrets:
- name: regcred
可能原因和解决方案
- kubelet 未运行:检查 kubelet 服务状态
- 资源压力:检查 CPU、内存、磁盘是否充足
- 网络问题:检查网络连接和 DNS
- 容器运行时问题:检查 Docker/containerd 状态
# 查看节点详情
kubectl describe node <node-name>
# 检查节点条件
kubectl get nodes -o wide
# 在节点上检查 kubelet
sudo systemctl status kubelet
# 查看节点日志
sudo journalctl -u kubelet -f
可能原因和解决方案
- CoreDNS Pod 问题:检查 CoreDNS Pod 是否正常运行
- DNS 配置错误:检查 /etc/resolv.conf 配置
- 网络策略:检查是否阻止了 DNS 流量
- Service 名称错误:确认 Service 名称和命名空间
# 检查 CoreDNS Pod
kubectl get pods -n kube-system -l k8s-app=kube-dns
# 查看 CoreDNS 日志
kubectl logs -n kube-system -l k8s-app=kube-dns
# 测试 DNS 解析
kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup kubernetes.default
# 查看 DNS 配置
kubectl get configmap coredns -n kube-system -o yaml
最佳实践
1. 使用命名空间隔离
# 创建专用命名空间
kubectl create namespace production
kubectl create namespace development
# 设置默认命名空间
kubectl config set-context --current --namespace=production
2. 最小权限原则(RBAC)
# 创建 ServiceAccount
kubectl create serviceaccount myapp-sa
# 创建 Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
# 绑定 Role
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: ServiceAccount
name: myapp-sa
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
3. 使用 Secret 存储敏感信息
# 避免在环境变量中直接传递密码
# 使用 Secret 或外部密钥管理系统(如 Vault)
4. 网络策略
# 限制 Pod 间通信
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
5. 镜像安全
- 使用官方或可信的镜像
- 定期扫描镜像漏洞
- 使用最小化基础镜像(如 alpine)
- 避免使用 root 用户运行容器
1. 始终设置资源请求和限制
resources:
requests:
memory: "256Mi"
cpu: "500m"
limits:
memory: "512Mi"
cpu: "1000m"
2. 使用 Horizontal Pod Autoscaler(HPA)
# 创建 HPA
kubectl autoscale deployment myapp \
--cpu-percent=50 \
--min=2 \
--max=10
# YAML 定义
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
3. 使用资源配额(Resource Quotas)
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: development
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
4. 使用 LimitRange
apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
namespace: default
spec:
limits:
- default:
memory: 512Mi
cpu: "1"
defaultRequest:
memory: 256Mi
cpu: "500m"
type: Container
1. 配置 Liveness Probe
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
2. 配置 Readiness Probe
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 3
3. 使用 Startup Probe(慢启动应用)
startupProbe:
httpGet:
path: /startup
port: 8080
initialDelaySeconds: 0
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 30 # 最多等待 150 秒
4. 探针配置建议
- initialDelaySeconds:给应用足够的启动时间
- periodSeconds:不要过于频繁,避免浪费资源
- timeoutSeconds:根据应用响应时间设置
- failureThreshold:避免因暂时性问题导致频繁重启
- 使用 TCP、HTTP、EXEC 三种探针类型
1. 使用声明式配置
# 使用 YAML 文件管理部署
kubectl apply -f deployment.yaml
# 使用 git 管理 YAML 文件
git add deployment.yaml
git commit -m "Update deployment"
git push
2. 配置滚动更新
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
3. 使用多个副本
# 生产环境至少 2-3 个副本
replicas: 3
4. 使用标签组织资源
metadata:
labels:
app: myapp
version: v1.0.0
environment: production
team: backend
5. 配置反亲和性
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- myapp
topologyKey: kubernetes.io/hostname
1. 集中式日志收集
- 使用 ELK Stack(Elasticsearch、Logstash、Kibana)
- 使用 EFK Stack(Elasticsearch、Fluentd、Kibana)
- 使用 Loki + Grafana
2. 监控指标
- 使用 Prometheus + Grafana
- 监控 Pod、Node、Cluster 指标
- 设置告警规则
3. 使用标签和注释
metadata:
labels:
app: myapp
version: v1.0.0
annotations:
description: "My application"
owner: "team@example.com"
4. 日志规范
- 使用结构化日志(JSON 格式)
- 包含时间戳、日志级别、请求 ID
- 避免记录敏感信息
1. 配置与代码分离
- 使用 ConfigMap 存储非敏感配置
- 使用 Secret 存储敏感信息
- 考虑使用外部配置中心(如 Consul)
2. 使用不可变 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: immutable-config
immutable: true
3. 配置版本管理
- 使用 git 管理 YAML 配置文件
- 使用标签区分不同环境配置
- 使用 ConfigMap 版本控制
4. 使用 Helm 管理复杂应用
# 安装 Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 使用 Helm 部署应用
helm install myapp ./myapp-chart
# 升级应用
helm upgrade myapp ./myapp-chart
# 回滚应用
helm rollback myapp