Kubernetes (K8s) 集群详解:从零开始构建高效容器编排平台

发布于:2025-07-24 ⋅ 阅读:(31) ⋅ 点赞:(0)

一、什么是 Kubernetes?

Kubernetes(简称 K8s) 是一个开源的容器编排平台,用于自动化应用程序的部署、扩展和管理。它支持多种容器运行时,并提供了一套强大的工具集来帮助开发者更轻松地管理大规模分布式应用。

核心概念:

概念

解释

Pod

Kubernetes 中最小的可部署单元,包含一个或多个容器。

Node

Kubernetes 工作节点,可以是物理机或虚拟机。

Service

定义一组 Pod 的访问策略,提供稳定的网络端点。

Namespace

逻辑隔离不同的项目、团队或环境。

Deployment

管理无状态应用的更新与回滚。

StatefulSet

管理有状态应用,如数据库等。

ConfigMap / Secret

分别用于存储非敏感和敏感配置信息。

Volume

提供持久化存储解决方案。


二、为什么选择 Kubernetes?

  • 自动恢复:当容器失败时,Kubernetes 可以自动重启它们。
  • 水平扩展:根据负载情况动态调整服务实例数量。
  • 滚动更新:无需停机即可进行应用更新。
  • 资源调度:智能分配计算资源给各个容器。
  • 跨云兼容性:可在公有云、私有云或混合云环境中运行。

三、Kubernetes 集群架构概览

1. Master 节点组件

  • API Server:集群入口,所有操作均通过 REST API 进行。
  • Controller Manager:负责维护集群状态,如副本数量、节点健康检查等。
  • Scheduler:决定将 Pod 放置在哪个 Node 上执行。
  • etcd:高可用键值存储系统,保存集群的所有状态数据。

2. Worker 节点组件

  • Kubelet:负责与 Master 节点通信,确保 Pod 正常运行。
  • Kube-proxy:为 Service 提供网络代理功能。
  • Container Runtime:如 Docker、containerd 等,负责实际运行容器。

四、安装 Kubernetes 集群(使用 kubeadm)

1. 准备工作

(1) 更新系统并关闭交换内存
sudo apt-get update && sudo apt-get upgrade -y
sudo swapoff -a
(2) 安装 Docker 或 containerd
sudo apt-get install -y docker.io
sudo systemctl enable docker.service
sudo systemctl start docker.service

对于 containerd:

sudo apt-get install -y containerd.io
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
(3) 安装 kubeadm, kubelet 和 kubectl
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

2. 初始化 Master 节点

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

3. 部署网络插件

这里我们使用 Flannel 作为网络插件:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

4. 加入 Worker 节点

在每个 Worker 节点上运行以下命令(来自 Master 节点初始化输出):

sudo kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

5. 验证集群状态

kubectl get nodes

你应该看到所有节点的状态为 Ready


五、Kubernetes 基础操作

1. 创建 Deployment

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.14.2
        ports:
        - containerPort: 80

创建 Deployment:

kubectl apply -f nginx-deployment.yaml

2. 查看 Pods 和 Deployments

kubectl get pods
kubectl get deployments

3. 创建 Service

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

创建 Service:

kubectl apply -f nginx-service.yaml

查看 Service:

kubectl get svc

六、深入理解 Kubernetes 核心对象

1. ConfigMap 和 Secret

ConfigMap 示例:
apiVersion: v1
kind: ConfigMap
metadata:
  name: game-config
data:
  # 属性格式
  special.how: very
  special.type: charm

挂载到 Pod 中:

volumeMounts:
- name: config-volume
  mountPath: /etc/config
volumes:
- name: config-volume
  configMap:
    name: game-config
Secret 示例:
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm

注意:Secret 数据需要 base64 编码。

2. StatefulSet

适用于需要稳定标识符的应用,如数据库。示例如下:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web

3. Horizontal Pod Autoscaler (HPA)

自动根据 CPU 使用率或其他指标调整 Pod 数量:

kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=10

七、Kubernetes 实战案例

1. 部署 Spring Boot 应用

Dockerfile 示例:
FROM openjdk:17-jdk-alpine
COPY target/myapp.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
Kubernetes Deployment YAML:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: springboot-app
  template:
    metadata:
      labels:
        app: springboot-app
    spec:
      containers:
      - name: springboot-app
        image: your-dockerhub-username/springboot-app:latest
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: springboot-service
spec:
  selector:
    app: springboot-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

2. 使用 Helm 简化应用部署

Helm 是 Kubernetes 的包管理器,简化了复杂应用的部署流程。

安装 Helm:
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
使用 Helm Chart 部署 Nginx Ingress Controller:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx

八、Kubernetes 最佳实践建议

类别

建议

高可用

至少三个 Master 节点,使用外部 etcd 集群

监控告警

使用 Prometheus + Grafana 监控集群健康状况

日志收集

ELK Stack 或 Fluentd + Elasticsearch + Kibana

CI/CD 集成

Jenkins、GitLab CI 等工具实现持续集成与交付

安全加固

RBAC 权限控制,启用 Network Policy


九、学习路线图(建议)

阶段

学习内容

目标

第1阶段

Kubernetes 基本概念

理解核心术语及架构

第2阶段

安装与配置集群

掌握集群搭建技巧

第3阶段

基础对象操作

熟练使用 Pod、Deployment、Service 等

第4阶段

高级对象与特性

ConfigMap、Secret、StatefulSet、HPA 等

第5阶段

CI/CD 流水线集成

自动化构建与部署

第6阶段

监控与日志管理

实现全面监控与故障排查

第7阶段

大规模集群管理

处理复杂场景下的运维问题


十、推荐学习资源

📘 官方文档与书籍

🌐 在线课程


十一、总结

Kubernetes 是现代 DevOps 工作流中不可或缺的一部分,能够极大地提升应用开发和运维效率。通过本文的学习,你已经掌握了 Kubernetes 的基础概念、集群搭建方法以及一些高级特性的使用技巧。

希望这篇博客能成为你踏上 Kubernetes 之旅的良好起点。如果你有任何疑问或需要进一步的帮助,请随时留言!


网站公告

今日签到

点亮在社区的每一天
去签到