完整的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 排查步骤

  1. 查看 Pod 状态: kubectl get pods -o wide
  2. 查看 Pod 事件: kubectl describe pod <pod-name>
  3. 查看 Pod 日志: kubectl logs <pod-name>
  4. 查看节点状态: kubectl get nodes, kubectl describe node <node-name>
  5. 查看集群事件: kubectl get events
  6. 检查网络配置: 确保 Pod 可以互相通信,以及可以访问外部服务
  7. 检查资源使用情况: 使用 kubectl top 命令或监控工具查看 CPU、内存、磁盘空间使用情况

5.3 常用工具

  • kubectl: 命令行工具
  • Dashboard: Web 界面
  • Prometheus: 监控系统
  • Grafana: 数据可视化工具
  • cAdvisor: 容器监控工具

六、总结

本教程涵盖了 Kubernetes 的基本概念、安装、配置、运维和故障排查。希望能够帮助你入门 Kubernetes,并将其应用于实际的生产环境中。

进一步学习:

记住,Kubernetes 是一个复杂的系统,需要不断学习和实践才能熟练掌握。祝你在 Kubernetes 的学习之旅中取得成功!

THE END