Skip to content

Kubernetes 入门与实践

Kubernetes(通常缩写为K8s)是一个开源的容器编排平台,用于自动化应用程序的部署、扩展和管理。本文将带您从零开始了解Kubernetes的核心概念并搭建一个可用的集群。

1. Kubernetes 核心概念

1.1 Kubernetes 架构

Kubernetes采用主从架构,主要包含以下组件:

  • 控制平面组件(Control Plane)

    • API Server:所有操作的统一入口
    • etcd:分布式键值存储,保存集群所有数据
    • Scheduler:负责Pod的调度
    • Controller Manager:维护集群状态
    • Cloud Controller Manager:与云平台交互
  • 节点组件(Node Components)

    • Kubelet:确保容器在Pod中运行
    • Kube-proxy:维护节点网络规则
    • Container Runtime:如Docker、containerd等

1.2 基本资源对象

  • Pod:最小部署单元,可包含一个或多个容器
  • Service:定义Pod的访问方式
  • Volume:数据卷,用于数据持久化
  • Namespace:资源隔离机制
  • Deployment:管理Pod的副本
  • StatefulSet:有状态应用部署
  • DaemonSet:确保所有节点运行相同的Pod
  • Job/CronJob:一次性/定时任务

2. 集群搭建

2.1 Kubernetes安装选项

Minikube(本地开发)

bash
# 安装Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# 启动集群
minikube start --driver=docker

kubeadm(生产环境)

bash
# 安装kubeadm、kubelet和kubectl
apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF | tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

# 初始化集群(主节点)
kubeadm init --pod-network-cidr=10.244.0.0/16

# 工作节点加入集群
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

2.2 配置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

2.3 安装Pod网络插件

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

3. 基本操作

3.1 部署第一个应用

创建nginx-deployment.yaml

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19
        ports:
        - containerPort: 80

应用配置:

bash
kubectl apply -f nginx-deployment.yaml

3.2 创建Service

创建nginx-service.yaml

yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: NodePort

应用配置:

bash
kubectl apply -f nginx-service.yaml

3.3 查看资源

bash
# 查看所有Pod
kubectl get pods

# 查看所有Service
kubectl get svc

# 查看所有Deployment
kubectl get deployments

# 查看Pod详情
kubectl describe pod <pod-name>

4. 高级应用

4.1 配置管理

ConfigMap

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  app.properties: |
    env=production
    log_level=info
  database.properties: |
    db_url=jdbc:mysql://db.example.com:3306/mydb
    db_user=app_user

Secret

yaml
apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
data:
  db_password: cGFzc3dvcmQ=  # base64编码的"password"

4.2 持久化存储

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

4.3 健康检查

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
spec:
  # ...
  template:
    # ...
    spec:
      containers:
      - name: app
        image: my-app:1.0
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5

5. 最佳实践

5.1 资源限制

yaml
resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"

5.2 滚动更新策略

yaml
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0

5.3 亲和性调度

yaml
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: disktype
          operator: In
          values:
          - ssd

6. 工具生态系统

  • Helm:Kubernetes的包管理器
  • Prometheus:监控系统
  • Grafana:可视化监控数据
  • Istio:服务网格
  • Knative:Serverless框架

7. 故障排查

常见故障排查命令:

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

# 进入Pod内部
kubectl exec -it <pod-name> -- /bin/bash

# 查看集群事件
kubectl get events

# 检查Pod描述
kubectl describe pod <pod-name>

总结

Kubernetes是一个功能强大的容器编排平台,掌握它可以帮助开发和运维团队更高效地管理容器化应用。本文介绍了Kubernetes的基本概念、集群搭建、基本操作和高级特性,希望能帮助你快速入门Kubernetes。

在实际生产环境中,还需要考虑更多因素,如安全性、高可用性、备份恢复等,这些将在后续文章中详细介绍。