完整的K8s教程:涵盖安装、配置、运维及故障排查
完整的 Kubernetes (K8s) 教程:涵盖安装、配置、运维及故障排查
Kubernetes,通常被称为 K8s,是一个开源的容器编排引擎,用于自动化部署、扩展和管理容器化应用程序。它提供了一个强大的平台,用于管理跨多个主机的容器,以及处理应用程序生命周期中的各种任务,例如自动缩放、服务发现和负载均衡。
本教程将带你了解 Kubernetes 的各个方面,从安装到配置,再到运维和故障排查。
一、Kubernetes 简介
1.1 什么是 Kubernetes?
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化工作负载和服务,可促进声明式配置和自动化。它拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。
1.2 核心概念
- 节点 (Node): K8s 集群中的工作机器,可以是物理机或虚拟机。
- 集群 (Cluster): 一组节点,用于运行容器化应用程序。
- Pod: K8s 中最小的可部署单元,包含一个或多个容器。
- Deployment: 用于管理 Pod 的副本集,确保指定数量的 Pod 副本正在运行。
- Service: 为一组 Pod 提供稳定的访问点,即使 Pod 的 IP 地址发生变化。
- Namespace: 用于在集群中创建逻辑隔离的组。
- ConfigMap: 用于存储配置数据,例如环境变量。
- Secret: 用于存储敏感信息,例如密码和 API 密钥。
- Ingress: 管理对集群服务的外部访问,通常是 HTTP。
- Volume: 提供一种方式将数据持久化,即使 Pod 被删除或重新创建。
二、Kubernetes 安装
2.1 安装方式
Kubernetes 可以通过多种方式安装,包括:
- minikube: 用于在本地机器上运行单节点 K8s 集群,主要用于开发和测试。
- kubeadm: 用于在多台机器上安装和配置 K8s 集群。
- 托管服务: 例如 Google Kubernetes Engine (GKE)、Amazon Elastic Kubernetes Service (EKS) 和 Azure Kubernetes Service (AKS)。
2.2 使用 kubeadm 安装 (示例:在 Ubuntu 20.04 上)
步骤 1: 安装 Docker
bash
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker
sudo systemctl start docker
步骤 2: 安装 kubeadm, kubelet, kubectl
bash
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
步骤 3: 初始化 Master 节点
bash
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
注意: --pod-network-cidr
参数根据你选择的网络插件而定。
步骤 4: 配置 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
步骤 5: 安装网络插件 (示例:Flannel)
bash
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
步骤 6: 加入 Worker 节点 (在 Master 节点上执行 kubeadm init
后会输出 join 命令)
bash
sudo kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
2.3 使用 minikube 安装
步骤 1: 安装 minikube
参考 minikube 官方文档:https://minikube.sigs.k8s.io/docs/start/
步骤 2: 启动 minikube
bash
minikube start
三、Kubernetes 配置
3.1 使用 YAML 文件进行配置
Kubernetes 使用 YAML 文件来描述资源对象,例如 Pod、Deployment 和 Service。
示例:创建一个 Nginx Deployment
yaml
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:latest
ports:
- containerPort: 80
应用配置:
bash
kubectl apply -f nginx-deployment.yaml
3.2 使用 kubectl 命令行工具进行配置
kubectl 也可以用于创建和管理资源对象。
示例:创建一个 Nginx Pod
bash
kubectl run nginx --image=nginx:latest
3.3 ConfigMap 和 Secret
- ConfigMap: 用于将配置数据与 Pod 分离。
- Secret: 用于存储敏感信息,例如密码和 API 密钥。
示例:创建一个 ConfigMap
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
key1: value1
key2: value2
示例:创建一个 Secret
bash
kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=password123
四、Kubernetes 运维
4.1 资源管理
- 查看资源:
kubectl get pods
,kubectl get deployments
,kubectl get services
,kubectl get nodes
- 描述资源:
kubectl describe pod <pod-name>
,kubectl describe deployment <deployment-name>
- 删除资源:
kubectl delete pod <pod-name>
,kubectl delete deployment <deployment-name>
- 扩展/缩减 Deployment:
kubectl scale deployment <deployment-name> --replicas=5
4.2 日志和监控
- 查看 Pod 日志:
kubectl logs <pod-name>
- 进入 Pod 容器:
kubectl exec -it <pod-name> -- /bin/bash
- 监控工具: Prometheus、Grafana、Heapster 等
4.3 更新和回滚
- 更新应用: 修改 Deployment 的 YAML 文件,然后执行
kubectl apply -f <deployment-file>.yaml
- 回滚 Deployment:
kubectl rollout undo deployment <deployment-name>
- 查看 Deployment 历史:
kubectl rollout history deployment <deployment-name>
4.4 自动扩缩容 (HPA - Horizontal Pod Autoscaler)
HPA 可以根据 CPU 使用率或其他指标自动调整 Pod 的副本数量。
示例:根据 CPU 使用率自动扩缩容 Nginx Deployment
yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
五、Kubernetes 故障排查
5.1 常见问题
- Pod 状态异常: Pending、CrashLoopBackOff、ImagePullBackOff 等
- Service 无法访问: 检查 Service 配置、Pod 状态、网络策略等
- 节点故障: 节点 NotReady 状态
- 资源不足: CPU、内存、磁盘空间不足
5.2 排查步骤
- 查看 Pod 状态:
kubectl get pods -o wide
- 查看 Pod 事件:
kubectl describe pod <pod-name>
- 查看 Pod 日志:
kubectl logs <pod-name>
- 查看节点状态:
kubectl get nodes
,kubectl describe node <node-name>
- 查看集群事件:
kubectl get events
- 检查网络配置: 确保 Pod 可以互相通信,以及可以访问外部服务
- 检查资源使用情况: 使用
kubectl top
命令或监控工具查看 CPU、内存、磁盘空间使用情况
5.3 常用工具
- kubectl: 命令行工具
- Dashboard: Web 界面
- Prometheus: 监控系统
- Grafana: 数据可视化工具
- cAdvisor: 容器监控工具
六、总结
本教程涵盖了 Kubernetes 的基本概念、安装、配置、运维和故障排查。希望能够帮助你入门 Kubernetes,并将其应用于实际的生产环境中。
进一步学习:
- Kubernetes 官方文档: https://kubernetes.io/docs/home/
- Kubernetes 中文社区: https://www.kubernetes.org.cn/
记住,Kubernetes 是一个复杂的系统,需要不断学习和实践才能熟练掌握。祝你在 Kubernetes 的学习之旅中取得成功!