Kubernetes入门指南

Kubernetes入门指南

Kubernetes入门指南

Kubernetes(通常简称为K8s)是一个开源的容器编排平台,用于自动化容器化应用程序的部署、扩展和管理。

Kubernetes基本概念

什么是Kubernetes?

Kubernetes是Google基于其内部系统Borg开发的开源容器编排平台,现在由Cloud Native Computing Foundation (CNCF) 维护。

主要功能:

  • 容器编排
  • 服务发现和负载均衡
  • 存储编排
  • 自动部署和回滚
  • 自动装箱(资源调度)
  • 自我修复
  • 配置管理
  • 水平扩展

Kubernetes架构

Kubernetes采用主从架构,由以下组件组成:

控制平面组件

kube-apiserver

  • 公开Kubernetes API
  • 所有操作的前端接口

etcd

  • 一致且高可用的键值存储
  • 存储所有集群数据

kube-scheduler

  • 监视新创建的Pod,并将其分配到节点

kube-controller-manager

  • 运行控制器进程
  • 包括节点控制器、复制控制器、端点控制器等

cloud-controller-manager

  • 与云提供商交互的控制器

节点组件

kubelet

  • 确保容器在Pod中运行
  • 管理Pod生命周期

kube-proxy

  • 维护节点上的网络规则
  • 允许从集群内部或外部与Pod通信

容器运行时

  • 负责运行容器
  • 如Docker、containerd、CRI-O等

Kubernetes对象

Kubernetes使用"对象"来表示系统状态:

基本对象

Pod

  • Kubernetes中最小的可部署单元
  • 包含一个或多个容器
  • 共享网络和存储
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

Service

  • 定义一组Pod的访问方式
  • 提供稳定的网络端点
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP

Volume

  • 提供持久化存储
  • 多种存储后端支持

Namespace

  • 提供资源隔离
  • 将集群划分为虚拟子集群

控制器对象

Deployment

  • 管理Pod的部署和更新
  • 提供声明式更新
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

StatefulSet

  • 管理有状态应用
  • 提供稳定的网络标识和持久存储

DaemonSet

  • 确保所有(或部分)节点运行Pod的副本
  • 适用于节点监控、日志收集等

Job/CronJob

  • 运行一次性或定期任务

Kubernetes网络

Kubernetes网络模型基于以下原则:

  • 所有Pod可以不使用NAT互相通信
  • 所有节点可以不使用NAT与所有Pod通信
  • Pod内部的容器共享网络命名空间

网络解决方案

  • Calico
  • Flannel
  • Cilium
  • Weave Net

Kubernetes存储

存储类型

临时存储

  • emptyDir:Pod被删除时,数据也会被删除

持久存储

  • PersistentVolume (PV):集群中的存储资源
  • PersistentVolumeClaim (PVC):存储请求
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: standard

StorageClass

  • 定义动态配置的存储类型

Kubernetes安全

认证

  • X.509 客户端证书
  • 静态令牌文件
  • OpenID Connect
  • Webhook令牌认证

授权

  • RBAC(基于角色的访问控制)
  • ABAC(基于属性的访问控制)
  • Node授权
  • Webhook授权

RBAC示例

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: jane
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

Kubernetes资源管理

资源请求与限制

apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: resource-demo-ctr
    image: nginx
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

命名空间资源配额

apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-quota
  namespace: development
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi

Kubernetes部署策略

滚动更新

  • 逐步替换旧版本Pod
  • 默认的部署策略

蓝绿部署

  • 同时维护两个版本
  • 一次性切换流量

金丝雀部署

  • 将少量流量路由到新版本
  • 逐步增加流量比例

Kubernetes监控

监控方案

  • Prometheus + Grafana
  • Kubernetes Dashboard
  • Datadog
  • New Relic

日志收集

  • EFK/ELK堆栈
  • Loki + Grafana
  • Fluentd + CloudWatch

常用kubectl命令

# 获取资源信息
kubectl get pods
kubectl get deployments
kubectl get services

# 查看详细信息
kubectl describe pod <pod-name>

# 创建资源
kubectl apply -f manifest.yaml

# 删除资源
kubectl delete -f manifest.yaml
kubectl delete pod <pod-name>

# 查看日志
kubectl logs <pod-name>

# 进入容器
kubectl exec -it <pod-name> -- /bin/bash

# 端口转发
kubectl port-forward <pod-name> 8080:80

Kubernetes最佳实践

  1. 使用命名空间组织资源

    • 按团队、环境或应用划分
  2. 设置资源请求和限制

    • 避免资源争用
    • 提高集群稳定性
  3. 使用标签和注解

    • 组织和识别资源
    • 支持选择器查询
  4. 实施健康检查

    • 存活探针
    • 就绪探针
    • 启动探针
  5. 配置管理

    • 使用ConfigMap和Secret
    • 避免硬编码配置
  6. 安全最佳实践

    • 使用RBAC限制权限
    • 定期更新和修补
    • 使用网络策略限制流量
  7. 备份etcd数据

    • 定期备份
    • 测试恢复流程