Kubernetes 基础
核心知识点
1. Kubernetes 概述
1.1 什么是 Kubernetes
Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它提供了容器编排、负载均衡、服务发现、存储编排等功能。
1.2 Kubernetes 架构
┌─────────────────────────────────────────────────────────────┐
│ Kubernetes 集群架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Control Plane (控制平面) │ │
│ ├─────────────────────────────────────────────┤ │
│ │ API Server │ Scheduler │ Controller │ │
│ │ etcd │ Cloud Ctrl │ Node Ctrl │ │
│ └─────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Worker Nodes (工作节点) │ │
│ ├─────────────────────────────────────────────┤ │
│ │ Node 1 │ Node 2 │ Node 3 │ │
│ │ ┌─────┐ │ ┌─────┐ │ ┌─────┐ │ │
│ │ │Pod │ │ │Pod │ │ │Pod │ │ │
│ │ └─────┘ │ └─────┘ │ └─────┘ │ │
│ │ ┌─────┐ │ ┌─────┐ │ ┌─────┐ │ │
│ │ │Pod │ │ │Pod │ │ │Pod │ │ │
│ │ └─────┘ │ └─────┘ │ └─────┘ │ │
│ └─────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘2. 核心概念
2.1 Pod
Pod 是 Kubernetes 中最小的可部署单元,包含一个或多个容器。
┌─────────────────────────────────────────┐
│ Pod │
├─────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 容器 A │ │ 容器 B │ │
│ │ (主容器) │ │ (辅助容器)│ │
│ └──────────┘ └──────────┘ │
│ │ │ │
│ └────┬───────┘ │
│ │ │
│ ┌────▼────┐ │
│ │ 共享存储 │ │
│ │ 共享网络 │ │
│ └─────────┘ │
│ │
└─────────────────────────────────────────┘2.2 Node
Node 是 Kubernetes 集群中的工作节点,运行 Pod。
# Node 示例
apiVersion: v1
kind: Node
metadata:
name: node-1
labels:
role: worker
zone: us-west-1a
spec:
capacity:
cpu: "4"
memory: 16Gi
pods: "110"2.3 Namespace
Namespace 用于将集群资源划分为多个虚拟集群。
# Namespace 示例
apiVersion: v1
kind: Namespace
metadata:
name: development
labels:
name: development3. 控制平面组件
3.1 API Server
API Server 是 Kubernetes 控制平面的前端,所有内部组件和外部用户都通过 API Server 与集群交互。
# 查看 API Server 状态
kubectl get cs
# 查看 API Server 日志
kubectl logs -n kube-system kube-apiserver
# 测试 API Server 连接
kubectl cluster-info3.2 etcd
etcd 是 Kubernetes 的键值存储,存储所有集群状态数据。
# 查看 etcd 状态
kubectl get cs etcd
# 备份 etcd 数据
ETCDCTL_API=3 etcdctl snapshot save snapshot.db \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key3.3 Scheduler
Scheduler 负责将 Pod 调度到合适的 Node 上。
# 查看 Scheduler 状态
kubectl get cs scheduler
# 查看 Scheduler 日志
kubectl logs -n kube-system kube-scheduler3.4 Controller Manager
Controller Manager 运行各种控制器,维护集群的期望状态。
# 查看 Controller Manager 状态
kubectl get cs controller-manager
# 查看运行的控制器
kubectl get deployment -n kube-system4. 工作节点组件
4.1 Kubelet
Kubelet 是 Node 上的代理,负责管理 Pod 生命周期。
# 查看 Kubelet 状态
systemctl status kubelet
# 查看 Kubelet 日志
journalctl -u kubelet -f
# 查看 Kubelet 配置
cat /var/lib/kubelet/config.yaml4.2 Kube-proxy
Kube-proxy 负责维护网络规则,实现 Service 负载均衡。
# 查看 Kube-proxy 状态
kubectl get ds kube-proxy -n kube-system
# 查看 Kube-proxy 日志
kubectl logs -n kube-system kube-proxy4.3 Container Runtime
Container Runtime 负责运行容器(如 Docker、containerd)。
# 查看 Container Runtime 信息
kubectl describe node node-1 | grep "Container Runtime"
# 查看 Docker 状态
systemctl status docker5. 安装 Kubernetes
5.1 使用 Minikube(本地开发)
# 安装 Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 启动 Minikube
minikube start
# 查看状态
minikube status
# 查看仪表板
minikube dashboard
# 停止 Minikube
minikube stop
# 删除 Minikube
minikube delete5.2 使用 kubeadm(生产环境)
# 在所有节点上安装 Docker
sudo apt-get update
sudo apt-get install -y docker.io
# 在所有节点上安装 kubeadm、kubelet、kubectl
sudo apt-get update && sudo apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
# 初始化控制平面(仅在主节点)
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
# 安装网络插件(在主节点)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 加入工作节点(在工作节点)
sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
# 验证集群状态
kubectl get nodes6. kubectl 基础命令
6.1 集群管理
# 查看集群信息
kubectl cluster-info
# 查看节点状态
kubectl get nodes
# 查看节点详细信息
kubectl describe node node-1
# 查看命名空间
kubectl get namespaces
# 创建命名空间
kubectl create namespace development6.2 Pod 管理
# 查看 Pod
kubectl get pods
# 查看 Pod 详细信息
kubectl describe pod my-pod
# 查看 Pod 日志
kubectl logs my-pod
# 进入 Pod
kubectl exec -it my-pod -- /bin/bash
# 删除 Pod
kubectl delete pod my-pod6.3 资源管理
# 查看所有资源
kubectl get all
# 查看特定类型的资源
kubectl get deployments
kubectl get services
kubectl get configmaps
# 查看资源详细信息
kubectl get pod my-pod -o yaml
# 查看资源使用情况
kubectl top nodes
kubectl top pods实用案例分析
案例 1:部署第一个应用
场景描述
在 Kubernetes 集群中部署一个 Nginx 应用。
操作步骤
# 1. 创建部署文件
cat > nginx-deployment.yaml << 'EOF'
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.21
ports:
- containerPort: 80
EOF
# 2. 创建服务文件
cat > nginx-service.yaml << 'EOF'
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
EOF
# 3. 部署应用
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
# 4. 查看部署状态
kubectl get deployments
kubectl get pods
# 5. 查看服务
kubectl get services
# 6. 访问应用
minikube service nginx-service
# 7. 查看 Pod 日志
kubectl logs -l app=nginx
# 8. 清理资源
kubectl delete -f nginx-deployment.yaml
kubectl delete -f nginx-service.yaml案例 2:多副本部署
场景描述
部署多副本应用,实现高可用。
操作步骤
# 1. 创建多副本部署
cat > multi-replica-deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 5
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.21
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
EOF
# 2. 部署应用
kubectl apply -f multi-replica-deployment.yaml
# 3. 查看 Pod 分布
kubectl get pods -o wide
# 4. 扩展副本数
kubectl scale deployment web-app --replicas=10
# 5. 查看扩展后的 Pod
kubectl get pods
# 6. 查看部署事件
kubectl describe deployment web-app
# 7. 清理资源
kubectl delete -f multi-replica-deployment.yaml案例 3:命名空间隔离
场景描述
使用命名空间隔离不同环境的应用。
操作步骤
# 1. 创建命名空间
kubectl create namespace development
kubectl create namespace staging
kubectl create namespace production
# 2. 查看命名空间
kubectl get namespaces
# 3. 在不同命名空间部署应用
kubectl apply -f nginx-deployment.yaml -n development
kubectl apply -f nginx-deployment.yaml -n staging
kubectl apply -f nginx-deployment.yaml -n production
# 4. 查看各命名空间的 Pod
kubectl get pods -n development
kubectl get pods -n staging
kubectl get pods -n production
# 5. 设置默认命名空间
kubectl config set-context --current --namespace=development
# 6. 查看当前命名空间的资源
kubectl get pods
# 7. 切换到其他命名空间
kubectl config set-context --current --namespace=production
# 8. 清理资源
kubectl delete namespace development
kubectl delete namespace staging
kubectl delete namespace production最佳实践
使用命名空间隔离环境:开发、测试、生产环境分开管理。
设置资源限制:防止单个应用耗尽集群资源。
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"- 配置健康检查:确保应用正常运行。
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5- 使用标签和选择器:便于管理和查询资源。
metadata:
labels:
app: web
environment: production
version: v1.0- 定期备份 etcd:确保集群数据安全。
# 备份 etcd
ETCDCTL_API=3 etcdctl snapshot save snapshot.db \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key总结
本教程介绍了 Kubernetes 的基础概念、架构原理和核心组件。通过实际案例,我们学习了如何部署应用、管理多副本以及使用命名空间隔离环境。掌握这些基础知识后,可以继续学习 Kubernetes 的 Pod、Deployment、Service 等高级功能。