菜单

Kubernetes 管理

相关源文件

本文档提供了 Kubernetes 管理的全面指南,涵盖了核心概念、关键组件以及有效管理 Kubernetes 集群的必备任务。本指南专为 DevOps 工程师、系统管理员以及负责操作 Kubernetes 环境的任何人设计。有关 Kubernetes 中特定部署策略的信息,请参阅 Kubernetes 部署策略,或有关 Kubernetes 配置管理详细信息,请参阅 Kubernetes 配置管理

1. Kubernetes 架构师指南

理解 Kubernetes 架构对于有效的管理至关重要。作为管理员,您需要熟悉控制平面组件和工作节点组件。

1.1 控制平面组件

组件描述管理职责
API服务器Kubernetes 控制平面的前端安全访问、监控 API 服务器日志
etcd用于集群数据的分布式键值存储备份与恢复,确保高可用性
调度器将 Pod 分配给节点配置调度策略
控制器管理器运行控制器进程监控和排查控制器问题

1.2 工作节点组件

组件描述管理职责
Kubelet确保容器在 Pod 中运行的代理监控节点健康状况,排查容器问题
Kube-proxy维护网络规则网络排查
容器运行时运行容器(例如 Docker、containerd)确保兼容性,监控性能

来源:topics/kubernetes/README.md:225-242, topics/kubernetes/CKA.md:241-266

2. 集群管理

2.1 设置 Kubernetes 集群

管理员有多种设置 Kubernetes 集群的选项

  1. Minikube:用于本地测试和开发
  2. 托管 Kubernetes 服务:EKS (AWS)、GKE (Google Cloud)、AKS (Azure)
  3. kubeadm:用于自管理的多个节点集群

设置生产集群时,请考虑

  • 高可用性要求
  • 网络插件选择
  • 存储配置
  • 安全配置

2.2 管理节点

节点管理是 Kubernetes 管理员的一项关键任务。

# View all nodes
kubectl get nodes

# Get detailed information about a node
kubectl describe node <node-name>

# Get nodes with labels
kubectl get nodes --show-labels

来源:topics/kubernetes/CKA.md:277-298

2.3 使用 Kubectl

Kubectl 是与 Kubernetes 集群交互的主要命令行工具。

# Set up helpful aliases
alias k=kubectl
alias kd=kubectl delete
alias kds=kubectl describe
alias ke=kubectl edit
alias kr=kubectl run
alias kg=kubectl get

来源:topics/kubernetes/CKA.md:29-38

3. Pod 管理

Pod 是 Kubernetes 中最小的可部署单元,也是管理员的一项基本职责。

3.1 Pod 管理命令

# Create a pod
kubectl run nginx-test --image=nginx

# List all pods
kubectl get pods

# List pods with more details
kubectl get pods -o wide

# List pods from all namespaces
kubectl get pods -A

# Delete a pod
kubectl delete pod nginx-test

来源:topics/kubernetes/CKA.md:41-76

3.2 排查 Pod 问题

常见的 Pod 问题及排查步骤

状态可能原因排查命令
待处理资源不足、调度器问题kubectl describe pod <pod-name>
CrashLoopBackOff应用程序错误、配置无效kubectl logs <pod-name>
ImagePullBackOff镜像名称无效、注册表访问问题kubectl describe pod <pod-name>
错误容器运行时问题、节点问题kubectl get events, kubectl describe pod <pod-name>

来源:topics/kubernetes/CKA.md:175-204

3.3 静态 Pod

静态 Pod 由特定节点上的 kubelet 直接管理,无需 API 服务器观察。

# Create a static pod
# First, locate the static pod path on the node
grep -i staticpod /var/lib/kubelet/config.yaml

# Create the pod definition in that directory
sudo vi /etc/kubernetes/manifests/static-nginx.yaml

要删除静态 Pod,请从静态 Pod 目录中删除其清单文件。

来源:topics/kubernetes/README.md:557-613

4. 工作负载管理

4.1 ReplicaSets

ReplicaSets 确保在任何给定时间都运行指定数量的 Pod 副本。

# Get all ReplicaSets
kubectl get rs

# Scale a ReplicaSet
kubectl scale rs <replicaset-name> --replicas=5

排查 ReplicaSets 问题

  • 检查选择器是否匹配 Pod 标签
  • 验证 Pod 模板是否有效
  • 确保没有资源限制阻止 Pod 创建

来源:topics/kubernetes/CKA.md:354-397, topics/kubernetes/CKA.md:404-464

4.2 Deployments

Deployments 提供 Pod 和 ReplicaSets 的声明式更新。

# Create a deployment
kubectl create deployment dep --image=redis --replicas 3

# List deployments
kubectl get deployments

# Update a deployment
kubectl set image deployment/dep redis=redis:alpine

# Scale a deployment
kubectl scale deployment dep --replicas=5

排查 Deployments 问题

  • 使用 kubectl describe deployment <name> 检查部署事件
  • 使用 kubectl get rs 验证 ReplicaSet 创建
  • 使用 kubectl get pods 检查 Pod 创建

来源:topics/kubernetes/CKA.md:466-598

5. 网络管理

5.1 Services

Services 使得 Kubernetes 中的一组 Pod 能够被网络访问。

# Create a service for an existing deployment
kubectl expose deployment web --port=80 --name=web-service

# List all services
kubectl get svc

# Get more details about a service
kubectl describe svc web-service
Service 类型用例特性
ClusterIP内部通信默认类型,集群内部 IP
NodePort访问固定端口的外部在节点 IP 上以静态端口公开服务
LoadBalancer生产环境外部访问与云负载均衡器集成
ExternalName服务别名将服务映射到 DNS 名称

来源:topics/kubernetes/CKA.md:299-353

5.2 Network Policies

Network Policies 指定 Pod 组之间以及 Pod 与其他网络端点之间的通信方式。

# Get network policies
kubectl get networkpolicies

6. 调度器管理

调度器负责决定哪个节点将托管新创建的 Pod。

6.1 节点亲和性

节点亲和性允许您根据节点标签来限制 Pod 可以调度到的节点。

来源:topics/kubernetes/CKA.md:619-656

6.2 Taints 和 Tolerations

Taints 和 Tolerations 协同工作,确保 Pod 不会被调度到不合适的节点上。

# Add a taint to a node
kubectl taint node <node-name> app=web:NoSchedule

# Check taints on a node
kubectl describe node <node-name> | grep -i taints

# Remove a taint
kubectl taint node <node-name> app=web:NoSchedule-

要使 Pod 能够调度到带有 taint 的节点上,它必须具有匹配的 toleration。

来源:topics/kubernetes/CKA.md:710-751, topics/kubernetes/exercises/taints_101/exercise.md:1-12, topics/kubernetes/exercises/taints_101/solution.md:1-30

7. 资源管理

7.1 资源请求和限制

作为管理员,您需要管理资源分配以确保集群的稳定性。

资源请求保证了最低资源,而限制则限制了容器可以使用的最大资源。

# Check if pods have resource limits
kubectl describe pod <pod-name> | grep -i limits

来源:topics/kubernetes/CKA.md:753-806

7.2 配额和 Limit Ranges

资源配额限制命名空间中的总资源消耗。

8. 身份验证和授权

8.1 RBAC(基于角色的访问控制)

RBAC 允许管理员通过 Kubernetes API 动态配置策略。

关键 RBAC 组件

  • Roles:定义命名空间内的权限
  • ClusterRoles:定义集群范围的权限
  • RoleBindings:将角色权限授予命名空间中的用户
  • ClusterRoleBindings:将集群范围的权限授予用户
# Create a role
kubectl create role pod-reader --verb=get,list,watch --resource=pods

# Create a role binding
kubectl create rolebinding bob-pod-reader --role=pod-reader --user=bob

9. 监控和排查

9.1 监控资源

# Deploy metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# View node resource usage
kubectl top nodes

# View pod resource usage
kubectl top pods

来源:topics/kubernetes/CKA.md:808-826

9.2 排查方法论

在排查 Kubernetes 问题时,请遵循系统化的方法。

  1. 确定问题范围:Pod、节点、集群、网络
  2. 检查状态:使用 kubectl get 命令查看资源状态
  3. 检查详细信息:使用 kubectl describe 查看事件和配置
  4. 检查日志:使用 kubectl logs 调查应用程序问题
  5. 检查事件:使用 kubectl get events 查看集群范围的事件
  6. 验证配置:确保 YAML 配置正确

10. 备份和灾难恢复

10.1 etcd 备份与恢复

etcd 是 Kubernetes 集群中最关键的需要备份的组件。

# Backup etcd
ETCDCTL_API=3 etcdctl snapshot save snapshot.db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key
  
# Restore etcd
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \
  --data-dir /var/lib/etcd-from-backup

10.2 资源导出备份

您可以将资源导出为 YAML 文件,作为一种备份形式。

# Backup all deployments to YAML files
kubectl get deployments -o yaml > deployments-backup.yaml

# Backup specific namespaces
kubectl -n <namespace> get all -o yaml > namespace-backup.yaml

11. 安全管理

11.1 管理 Secret

# Create a secret
kubectl create secret generic db-credentials \
  --from-literal=username=admin \
  --from-literal=password=secret

# Get secrets
kubectl get secrets

11.2 Security Contexts

Security contexts 定义了权限和访问控制设置。

12. 升级 Kubernetes 集群

升级 Kubernetes 集群需要仔细规划和执行。

  1. 首先升级控制平面组件
  2. 升级工作节点
  3. 更新任何自定义资源或控制器
  4. 升级后测试应用程序
# Check current versions
kubectl version

# Drain a node before upgrade
kubectl drain <node-name> --ignore-daemonsets

结论

有效的 Kubernetes 管理需要对架构和日常操作任务都有深入的了解。本指南涵盖了 Kubernetes 管理的各个关键方面,但该领域不断发展。定期的实践、了解最新动态和持续学习是成功进行 Kubernetes 管理的关键。

来源:topics/kubernetes/CKA.md, topics/kubernetes/README.md, topics/kubernetes/exercises/taints_101/exercise.md, topics/kubernetes/exercises/node_selectors/exercise.md