Kubernetes 入门与实践
Kubernetes(通常缩写为K8s)是一个开源的容器编排平台,用于自动化应用程序的部署、扩展和管理。本文将带您从零开始了解Kubernetes的核心概念并搭建一个可用的集群。
1. Kubernetes 核心概念
1.1 Kubernetes 架构
Kubernetes采用主从架构,主要包含以下组件:
控制平面组件(Control Plane):
- API Server:所有操作的统一入口
- etcd:分布式键值存储,保存集群所有数据
- Scheduler:负责Pod的调度
- Controller Manager:维护集群状态
- Cloud Controller Manager:与云平台交互
节点组件(Node Components):
- Kubelet:确保容器在Pod中运行
- Kube-proxy:维护节点网络规则
- Container Runtime:如Docker、containerd等
1.2 基本资源对象
- Pod:最小部署单元,可包含一个或多个容器
- Service:定义Pod的访问方式
- Volume:数据卷,用于数据持久化
- Namespace:资源隔离机制
- Deployment:管理Pod的副本
- StatefulSet:有状态应用部署
- DaemonSet:确保所有节点运行相同的Pod
- Job/CronJob:一次性/定时任务
2. 集群搭建
2.1 Kubernetes安装选项
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
kubeadm(生产环境)
bash
# 安装kubeadm、kubelet和kubectl
apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF | tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
# 初始化集群(主节点)
kubeadm init --pod-network-cidr=10.244.0.0/16
# 工作节点加入集群
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
2.2 配置kubectl
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.3 安装Pod网络插件
bash
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
3. 基本操作
3.1 部署第一个应用
创建nginx-deployment.yaml
:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19
ports:
- containerPort: 80
应用配置:
bash
kubectl apply -f nginx-deployment.yaml
3.2 创建Service
创建nginx-service.yaml
:
yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: NodePort
应用配置:
bash
kubectl apply -f nginx-service.yaml
3.3 查看资源
bash
# 查看所有Pod
kubectl get pods
# 查看所有Service
kubectl get svc
# 查看所有Deployment
kubectl get deployments
# 查看Pod详情
kubectl describe pod <pod-name>
4. 高级应用
4.1 配置管理
ConfigMap
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.properties: |
env=production
log_level=info
database.properties: |
db_url=jdbc:mysql://db.example.com:3306/mydb
db_user=app_user
Secret
yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
db_password: cGFzc3dvcmQ= # base64编码的"password"
4.2 持久化存储
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
4.3 健康检查
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
# ...
template:
# ...
spec:
containers:
- name: app
image: my-app:1.0
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
5. 最佳实践
5.1 资源限制
yaml
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
5.2 滚动更新策略
yaml
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
5.3 亲和性调度
yaml
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
6. 工具生态系统
- Helm:Kubernetes的包管理器
- Prometheus:监控系统
- Grafana:可视化监控数据
- Istio:服务网格
- Knative:Serverless框架
7. 故障排查
常见故障排查命令:
bash
# 查看Pod日志
kubectl logs <pod-name>
# 进入Pod内部
kubectl exec -it <pod-name> -- /bin/bash
# 查看集群事件
kubectl get events
# 检查Pod描述
kubectl describe pod <pod-name>
总结
Kubernetes是一个功能强大的容器编排平台,掌握它可以帮助开发和运维团队更高效地管理容器化应用。本文介绍了Kubernetes的基本概念、集群搭建、基本操作和高级特性,希望能帮助你快速入门Kubernetes。
在实际生产环境中,还需要考虑更多因素,如安全性、高可用性、备份恢复等,这些将在后续文章中详细介绍。