Kubernetes完全入门指南:从零到生产环境部署

Kubernetes完全入门指南:从零到生产环境


前言

本教程专为以下读者编写:

目标读者

  • 刚开始接触容器技术,希望系统学习Kubernetes的新手
  • 有Linux运维经验,想转向云原生运维的工程师
  • 需要在生产环境部署Kubernetes集群的运维人员
  • 想考取CKA(Kubernetes管理员认证)的学习者
  • 学完本教程后,你将能够: 1. 理解Kubernetes核心架构和组件 2. 使用kubectl命令管理集群资源 3. 编写和部署Pod、Deployment、Service等资源 4. 配置资源限制和健康检查 5. 搭建开发环境和生产集群


1. Kubernetes核心概念

1.1 什么是Kubernetes

Kubernetes(简称K8s)是Google开源的容器编排平台,已成为云原生应用部署和管理的行业标准。它提供了以下核心能力:

能力 说明
容器部署和调度 自动将容器部署到集群节点
自动扩缩容 根据负载自动调整容器数量
服务发现和负载均衡 自动服务注册和DNS负载均衡
配置和密钥管理 集中管理应用配置和敏感信息
存储编排 自动挂载存储卷
批量执行 支持批处理任务
自愈能力 自动重启失败的容器

1.2 Kubernetes架构

控制平面(Control Plane)组件

组件 端口 功能 说明
kube-apiserver 6443 API服务器 提供RESTful API,是集群的网关
etcd 2379-2380 分布式存储 存储集群所有配置数据
kube-scheduler - 调度器 根据资源需求选择最优节点
kube-controller-manager - 控制器 管理各种控制器确保状态一致

工作节点(Worker Nodes)组件

组件 功能 说明
kubelet 节点代理 负责容器生命周期管理
kube-proxy 网络代理 实现服务网络和负载均衡
container runtime 容器执行 Docker/containerd/containerd

2. 安装Kubernetes集群

2.1 minikube(开发环境)


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

# 启动集群(使用Docker驱动)
minikube start --driver=docker --cpus=4 --memory=8192

# 验证安装
minikube status
minikube kubectl -- get pods -A
minikube dashboard

2.2 kind(Docker中的Kubernetes)


# 安装kind
curl -LO https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
sudo install kind-linux-amd64 /usr/local/bin/kind

# 创建集群
kind create cluster --name my-cluster --config kind-config.yaml

# kind-config.yaml
cat > kind-config.yaml << 'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30080
    hostPort: 30080
- role: worker
- role: worker
EOF

# 查看集群
kind get clusters
kubectl cluster-info
kubectl get nodes

2.3 kubeadm(生产环境)


# 所有节点安装kubeadm
apt-get update
apt-get install -y kubeadm kubelet kubectl
kubeadm version

# 主节点初始化
kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

# 配置kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 安装网络插件(Calico)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 工作节点加入
kubeadm join :6443 --token  --discovery-token-ca-cert-hash sha256:

3. kubectl命令详解

3.1 基础命令


# 集群信息
kubectl cluster-info              # 集群信息
kubectl get nodes                 # 查看节点
kubectl get nodes -o wide        # 详细输出
kubectl describe node      # 节点详情

# Pod管理
kubectl get pods                 # 查看Pod
kubectl get pods -A              # 所有命名空间
kubectl get pods -o wide         # 详细输出
kubectl describe pod        # Pod详情
kubectl logs               # 查看日志
kubectl logs -f           # 实时日志
kubectl exec -it  -- /bin/bash  # 进入Pod

# 应用配置
kubectl apply -f deployment.yaml   # 应用配置
kubectl apply -f .                # 应用目录下所有文件
kubectl delete -f deployment.yaml   # 删除资源
kubectl delete pod            # 删除Pod

3.2 资源操作命令


# 扩缩容
kubectl scale deployment  --replicas=3

# 更新镜像
kubectl set image deployment/ nginx=nginx:1.26

# 回滚
kubectl rollout status deployment/
kubectl rollout undo deployment/
kubectl rollout undo deployment/ --to-revision=3

# 命名空间
kubectl create namespace dev
kubectl config set-context --current --namespace=dev

4. Pod详解

4.1 Pod完整示例


apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
    environment: production
spec:
  # 初始化容器
  initContainers:
  - name: init-myservice
    image: busybox:1.36
    command: ['sh', '-c', 'echo Initializing...; sleep 10']

  # 主容器
  containers:
  - name: nginx
    image: nginx:1.25-alpine
    ports:
    - containerPort: 80
      name: http

    # 环境变量
    env:
    - name: NGINX_HOST
      value: "localhost"
    - name: ENV_TYPE
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: environment

    # 资源限制(重要!)
    resources:
      requests:
        cpu: "100m"
        memory: "128Mi"
      limits:
        cpu: "500m"
        memory: "256Mi"

    # 健康检查
    livenessProbe:
      httpGet:
        path: /healthz
        port: 80
      initialDelaySeconds: 15
      periodSeconds: 20

    readinessProbe:
      httpGet:
        path: /ready
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 10

    # 卷挂载
    volumeMounts:
    - name: nginx-config
      mountPath: /etc/nginx/conf.d

  # 数据卷
  volumes:
  - name: nginx-config
    configMap:
      name: nginx-config

  restartPolicy: Always
  terminationGracePeriodSeconds: 30

5. Deployment详解

5.1 Deployment完整示例


apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
    version: v1.0.0
spec:
  replicas: 3
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      app: nginx

  # 滚动更新策略
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0

  # Pod模板
  template:
    metadata:
      labels:
        app: nginx
        version: v1.0.0
    spec:
      containers:
      - name: nginx
        image: nginx:1.25-alpine
        ports:
        - containerPort: 80

        # 资源限制
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "256Mi"

        # 健康检查
        livenessProbe:
          httpGet:
            path: /healthz
            port: 80
          initialDelaySeconds: 15
          periodSeconds: 20

        readinessProbe:
          httpGet:
            path: /ready
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10

        # 卷挂载
        volumeMounts:
        - name: nginx-config
          mountPath: /etc/nginx/conf.d

      volumes:
      - name: nginx-config
        configMap:
          name: nginx-config

      # 拓扑分布
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app: nginx

6. Service详解

6.1 Service完整示例


apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  # Service类型
  # ClusterIP - 集群内部访问(默认)
  # NodePort - 暴露到节点端口
  # LoadBalancer - 云负载均衡器
  type: ClusterIP

  ports:
  - name: http
    protocol: TCP
    port: 80              # Service端口
    targetPort: 80        # Pod端口

  selector:
    app: nginx

7. 常见问题

7.1 Pod状态异常


# Pod一直Pending
kubectl get pod -o wide
# 可能原因:资源不足、节点不可用

# Pod CrashLoopBackOff
kubectl logs  --previous
kubectl describe pod  | grep -A 10 "State:"

7.2 Service无法访问


# Service无endpoint
kubectl get endpoints 

# 测试Service连通性
kubectl run test --image=busybox:1.36 --rm -it --restart=Never -- wget -qO- http://:80

总结

核心要点: 1. Kubernetes架构分为控制平面和工作节点 2. Pod是最小部署单元,Deployment管理Pod副本 3. Service提供稳定的网络访问入口 4. 资源限制和健康检查是生产环境必备 5. kubectl是日常管理的主要工具

下一步学习

  • 学习Helm包管理器
  • 掌握Ingress配置
  • 配置监控和告警
  • 学习网络策略和安全策略
  • 参考资源

  • 官方文档:https://kubernetes.io/docs/home/
  • kubectl参考:https://kubernetes.io/docs/reference/kubectl/
  • 交互式教程:https://kubernetes.io/tutorials/kubernetes-basics/

发表回复

后才能评论