Kubernetes(K8s)容器化部署

Kubernetes(简称K8s)是一个生产级别的开源容器编排平台,由Google基于其在容器集群方面的经验设计而成。它能够帮助你确保容器化应用在你想要的时间和地点运行,实现应用的自动化部署、弹性伸缩与高可用。本文将从零开始,带你完成从环境搭建到应用部署的全流程。

第一部分:Kubernetes 核心概念

在动手实践之前,理解Kubernetes的几个核心概念至关重要。

一、Pod ------ 最小部署单元

Pod是Kubernetes中最小的、可部署的计算单元。它可以包含一个或多个紧密关联的容器(如业务容器 + 日志收集容器),这些容器共享同一个网络命名空间(IP地址、端口)和存储卷,始终被调度到同一节点上运行。Pod是Kubernetes资源分配的最小单位。

二、Deployment ------ 应用生命周期管理器

Deployment负责创建和更新应用的实例。它通过ReplicaSet控制Pod的副本数量,支持滚动更新、版本回滚等策略。创建Deployment后,Kubernetes控制平面会将应用实例调度到集群中的各个节点上。如果托管实例的节点关闭或被删除,Deployment控制器会自动将其替换到另一个节点上,提供自我修复能力。

三、Service ------ 稳定的访问入口

Service是Kubernetes中用于暴露Pod网络访问的抽象组件。由于Pod的IP是临时的(Pod重建后IP会变更),Service为这组Pod提供一个稳定的虚拟IP和DNS名称。当多个Pod关联到同一个Service时,Service会自动进行负载均衡。

Service的三种主要类型:

  • ClusterIP(默认) :仅在集群内部暴露服务
  • NodePort :在每个节点上开放固定端口,外部可通过节点IP:NodePort访问
  • LoadBalancer:结合云厂商的负载均衡器对外暴露服务

四、Ingress ------ 七层路由网关

Ingress是Kubernetes的API对象,用于定义外部访问集群服务的七层(HTTP/HTTPS)路由规则。它不同于Service(仅提供四层负载均衡),而是通过Ingress控制器(如Nginx Ingress、Traefik)实现基于域名或路径的路由、SSL卸载等功能。

第二部分:环境搭建

一、前置准备

部署Kubernetes需要以下环境:

项目 要求
操作系统 Linux(建议CentOS 7.6+ / Ubuntu 18.04+)或 macOS
硬件配置 至少4核8G内存(建议)
容器运行时 Docker CE 19.03+ 或 containerd
K8s工具链 kubeadm、kubectl、kubelet(版本1.24+)
基础知识 熟悉容器化概念、YAML语法、基础Linux命令

二、开发环境:使用 Minikube 搭建本地集群

Minikube是学习Kubernetes最便捷的方式,可在本地快速启动单节点集群。

1. 安装 Minikube(以Linux为例):

bash 复制代码
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

2. 启动集群

bash 复制代码
minikube start --driver=docker --cpus=4 --memory=8192

3. 安装 kubectl(Kubernetes命令行客户端):

bash 复制代码
# 以Linux为例
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

4. 验证集群状态

bash 复制代码
kubectl get nodes -o wide
kubectl version  # 查看客户端和服务器版本

三、生产环境:使用 kubeadm 搭建多节点集群

生产环境推荐使用kubeadm搭建多节点集群。

1. 集群初始化(在控制平面节点执行):

bash 复制代码
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.24.0

# 配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

2. 添加工作节点(在每个工作节点执行):

bash 复制代码
kubeadm join <控制平面IP>:<端口> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

提示 :Token有效期为24小时,超时需通过kubeadm token create重新生成。

3. 部署CNI网络插件(如Calico):

bash 复制代码
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/calico.yaml

第三部分:部署第一个应用

一、通过命令行直接部署

最简单的入门方式,使用kubectl create deployment命令:

bash 复制代码
# 创建一个nginx deployment,副本数为3
kubectl create deployment nginx --image=nginx:latest --replicas=3

二、通过 YAML 文件部署(推荐)

YAML文件是Kubernetes的标准配置方式,便于版本控制和重复使用。

1. 创建 Deployment 配置文件 nginx-deployment.yaml

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
  labels:
    app: web
spec:
  replicas: 3                    # 副本数量
  selector:
    matchLabels:
      app: web                   # 必须与Pod模板中的标签匹配
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
        resources:               # 资源限制,防止资源争抢
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"

2. 部署应用

bash 复制代码
kubectl apply -f nginx-deployment.yaml

3. 验证部署状态

bash 复制代码
kubectl get deployments          # 查看Deployment状态
kubectl get pods -l app=web      # 查看Pod状态(-l表示按标签筛选)
kubectl describe deployment nginx-demo  # 查看详细信息

第四部分:暴露服务 ------ 让应用可访问

一、创建 Service

配置文件 nginx-service.yaml

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: web                    # 关联标签为 app:web 的Pod
  ports:
  - protocol: TCP
    port: 80                    # Service的端口
    targetPort: 80              # 容器内部的端口
  type: LoadBalancer            # 服务类型

部署Service:

bash 复制代码
kubectl apply -f nginx-service.yaml

查看Service信息:

bash 复制代码
kubectl get svc

在Minikube环境中,可通过以下命令获取访问URL:

bash 复制代码
minikube service nginx-service

二、使用 Ingress 实现七层路由(进阶)

对于生产环境,通常使用Ingress实现基于域名的路由。

1. 安装 Nginx Ingress 控制器

bash 复制代码
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml

2. 创建 Ingress 配置 ingress.yaml

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: http-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80
      - path: /web
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80
  tls:                          # HTTPS配置(可选)
  - hosts:
    - example.com
    secretName: tls-secret

3. 部署 Ingress

bash 复制代码
kubectl apply -f ingress.yaml

第五部分:持久化存储

容器是无状态的,当Pod被重建时,容器内的数据会丢失。对于数据库等有状态应用,需要持久化存储。

Kubernetes通过 PersistentVolume(PV)PersistentVolumeClaim(PVC) 实现存储管理:

  • PV:集群中的存储资源,由管理员事先制备或通过StorageClass动态制备
  • PVC:用户对存储的请求,指定大小和访问模式

创建 PVC 示例:

yaml 复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
  - ReadWriteOnce              # 访问模式:单节点读写
  storageClassName: mysc       # 存储类(用于动态制备)
  resources:
    requests:
      storage: 100Gi           # 请求的存储大小

创建PVC:

bash 复制代码
kubectl apply -f pvc.yaml
kubectl get pvc                 # 查看PVC状态,Bound表示已绑定

在Pod中挂载PVC:

yaml 复制代码
spec:
  containers:
  - name: app
    image: myapp
    volumeMounts:
    - mountPath: /data
      name: storage
  volumes:
  - name: storage
    persistentVolumeClaim:
      claimName: my-pvc

第六部分:配置管理 ------ ConfigMap 与 Secret

一、ConfigMap ------ 非敏感配置

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  app.properties: |
    database.url=jdbc:mysql://localhost:3306/mydb
    log.level=INFO

二、Secret ------ 敏感信息(密码、证书等)

yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: YWRtaW4=      # base64编码后的值
  password: cGFzc3dvcmQ=

第七部分:更新与回滚

一、滚动更新

Kubernetes支持滚动更新,实现零停机部署。

方式一:修改YAML文件后重新apply

bash 复制代码
# 修改nginx-deployment.yaml中的镜像版本为 nginx:1.26
kubectl apply -f nginx-deployment.yaml

方式二:直接使用命令

bash 复制代码
kubectl set image deployment/nginx-demo nginx=nginx:1.26

二、查看更新状态与回滚

bash 复制代码
kubectl rollout status deployment/nginx-demo   # 查看更新状态
kubectl rollout history deployment/nginx-demo  # 查看历史版本
kubectl rollout undo deployment/nginx-demo     # 回滚到上一版本
kubectl rollout undo deployment/nginx-demo --to-revision=2  # 回滚到指定版本

第八部分:扩缩容

一、手动扩缩容

bash 复制代码
kubectl scale deployment/nginx-demo --replicas=5   # 扩容到5个副本
kubectl get pods -l app=web                        # 验证副本数

二、自动扩缩容(HPA)

HorizontalPodAutoscaler可根据CPU利用率自动调整副本数:

bash 复制代码
kubectl autoscale deployment/nginx-demo --cpu-percent=50 --min=2 --max=10

第九部分:进阶工具 ------ Helm

Helm是Kubernetes的包管理工具,类似于Linux的yum/apt。它将应用及其依赖打包为Chart,实现了应用部署的标准化和自动化。

安装与使用:

bash 复制代码
# 安装Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 添加仓库
helm repo add stable https://charts.helm.sh/stable
helm repo update

# 安装应用
helm install my-nginx stable/nginx-ingress

# 升级应用
helm upgrade my-nginx stable/nginx-ingress --set controller.replicaCount=3

第十部分:CI/CD 自动化部署

将Kubernetes与CI/CD工具集成,可实现从代码提交到生产环境部署的全自动化。

常用CI/CD工具与Kubernetes的集成方式:

工具 集成方式
GitHub Actions 在workflow中执行kubectl applyhelm upgrade
GitLab CI/CD 通过.gitlab-ci.yml配置,执行kubectl/helm命令
Jenkins 部署Jenkins到K8s集群,通过Pipeline执行部署
Argo CD GitOps方式,自动同步Git仓库中的配置到集群

典型CI/CD流水线示例(GitHub Actions):

yaml 复制代码
name: Deploy to Kubernetes
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Build and push image
      run: |
        docker build -t myapp:${{ github.sha }} .
        docker push myapp:${{ github.sha }}
    - name: Deploy to K8s
      run: |
        kubectl set image deployment/myapp app=myapp:${{ github.sha }}
        kubectl rollout status deployment/myapp

第十一部分:常用命令速查

命令 说明
kubectl get nodes 查看集群节点
kubectl get pods 查看所有Pod
kubectl get pods -l app=web 按标签筛选Pod
kubectl get deployments 查看所有Deployment
kubectl get svc 查看所有Service
kubectl get ingress 查看所有Ingress
kubectl describe pod <名称> 查看Pod详细信息
kubectl logs <Pod名称> 查看Pod日志
kubectl exec -it <Pod名称> -- /bin/bash 进入Pod容器
kubectl apply -f <文件> 创建/更新资源
kubectl delete -f <文件> 删除资源
kubectl scale deployment/<名称> --replicas=N 扩缩容
kubectl rollout status deployment/<名称> 查看滚动更新状态

第十二部分:常见问题与排查

1. Pod一直处于Pending状态

  • 原因:集群资源不足或节点未就绪
  • 排查kubectl describe pod <名称> 查看事件信息

2. Pod一直处于ImagePullBackOff

  • 原因:镜像不存在、镜像仓库认证失败或网络问题
  • 排查:检查镜像名称是否正确,配置ImagePullSecrets

3. Service无法访问

  • 原因:标签选择器不匹配、端口配置错误
  • 排查kubectl describe svc <名称> 查看Endpoints是否包含Pod IP

4. PVC处于Pending状态

  • 原因:没有匹配的PV或StorageClass
  • 排查kubectl get pv 查看可用PV,检查StorageClass配置

总结

Kubernetes作为容器编排的事实标准,为容器化应用提供了从部署、扩缩容到自愈的完整解决方案。本文从核心概念出发,逐步讲解了环境搭建、应用部署、服务暴露、存储管理、配置管理、更新回滚以及CI/CD集成等全流程操作。

在实际生产环境中,建议:

  1. 开发测试使用Minikube或Kind快速验证
  2. 生产环境使用云厂商托管K8s服务或kubeadm搭建高可用集群
  3. 复杂应用使用Helm进行标准化部署管理
  4. 自动化运维结合CI/CD工具实现GitOps流水线

掌握Kubernetes容器化部署,是迈向云原生架构的关键一步。

相关推荐
gx234833 分钟前
k8spod管理
linux·容器·kubernetes
Henry-SAP6 小时前
AI突破重塑未来科技格局
人工智能·云原生·sap·erp
国医中兴8 小时前
电子病历的时序数据分析:ClickHouse在临床指标监控中的落地
微服务·云原生·容器·kubernetes·k8s
小谈不敲代码11 小时前
【12-kubenetes的持久化存储】
运维·kubernetes
小谈不敲代码13 小时前
Higress 生产级调优手册
云原生·kubernetes·gateway·负载均衡·higress
MyFreeIT14 小时前
Docker Network
运维·docker·容器
ezreal_pan14 小时前
Docker 多容器日志统一查看
运维·docker·容器
潘正翔14 小时前
Memcached构建缓存服务器
运维·服务器·数据库·缓存·云原生·memcached
叫我弓木吉15 小时前
从零开始:在宝塔面板上搭建你的专属隐私搜索引擎(SearXNG)
搜索引擎·docker·容器·开源·mango