Docker部署Kubernetes容器化应用详解:从镜像构建到集群部署

前言

Kubernetes(K8s)作为容器编排的事实标准,与Docker结合可实现容器化应用的高效管理与弹性扩展。本文将详细介绍在Linux环境下通过Docker构建容器镜像,并部署到Kubernetes集群的完整流程,涵盖环境准备、镜像构建、集群部署、性能优化及监控运维等核心环节,提供可落地的代码示例和生产级实践经验。


一、环境准备与基础组件安装

1. 系统要求与初始化

推荐使用CentOS 7.9/Ubuntu 20.04 LTS,配置要求:

节点数量:控制平面1-3个,工作节点按需扩展
硬件配置:单节点CPU≥2核,内存≥4GB,存储≥50GB SSD
关闭Swap:swapoff -a 并注释 /etc/fstab 中的Swap条目

# CentOS初始化
yum update -y
yum install -y wget curl net-tools

# Ubuntu初始化
apt update -y
apt install -y wget curl net-tools

2. 安装Docker引擎

# CentOS安装Docker CE
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker

# Ubuntu安装Docker CE
apt install -y docker.io
systemctl enable --now docker

# 配置阿里云镜像加速
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://your-aliyun-mirror.com"]
}
EOF
systemctl restart docker

3. 安装Kubernetes组件

# 所有节点执行(以CentOS为例)
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubeadm-1.28.3 kubectl-1.28.3 kubelet-1.28.3
systemctl enable --now kubelet

二、Kubernetes集群快速搭建

1. 单节点集群(开发环境)

# 初始化控制平面节点(替换IP为当前节点地址)
kubeadm init 
  --apiserver-advertise-address=192.168.1.100 
  --pod-network-cidr=10.244.0.0/16 
  --image-repository registry.aliyuncs.com/google_containers 
  --kubernetes-version=v1.28.3

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

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

2. 多节点集群(生产环境)

(1)主节点初始化(控制平面)
kubeadm init 
  --control-plane-endpoint="k8s-api.example.com:6443"   # 负载均衡器地址
  --upload-certs   # 生成证书并共享给其他控制节点
  --pod-network-cidr=10.244.0.0/16 
  --image-repository registry.aliyuncs.com/google_containers

# 记录节点加入命令(后续工作节点使用)
kubeadm token create --print-join-command
(2)工作节点加入集群
# 替换为实际join命令(包含token和CA哈希)
kubeadm join k8s-api.example.com:6443 
  --token abcdef.1234567890abcdef 
  --discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef

3. 集群验证

# 查看节点状态(状态应为Ready)
kubectl get nodes -o wide

# 查看核心组件运行情况
kubectl get pods -A -o wide

三、Docker镜像构建与仓库管理

1. 编写Dockerfile(以Spring Boot应用为例)

# 基础镜像(使用轻量版OpenJDK)
FROM openjdk:17-jdk-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件(提前下载加速构建)
COPY pom.xml .
RUN mvn dependency:go-offline -B

# 复制源码并构建
COPY src ./src
RUN mvn package -DskipTests

# 暴露端口
EXPOSE 8080

# 启动命令
CMD ["java", "-jar", "target/myapp.jar"]

2. 构建与推送镜像

# 构建镜像(替换项目名和版本)
docker build -t myapp:1.0 .

# 打标签并推送到私有仓库(Harbor示例)
docker tag myapp:1.0 harbor.example.com/dev/myapp:1.0
docker login harbor.example.com -u admin -p Harbor12345
docker push harbor.example.com/dev/myapp:1.0

3. 镜像安全扫描

# 使用Trivy扫描漏洞(需提前安装)
trivy image --severity HIGH,CRITICAL harbor.example.com/dev/myapp:1.0

四、Kubernetes部署应用实战

1. 定义Deployment资源

# myapp-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  namespace: dev
spec:
  replicas: 3  # 副本数
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: harbor.example.com/dev/myapp:1.0  # 使用私有镜像
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 250m  # 资源请求
            memory: 512Mi
          limits:
            cpu: 500m  # 资源限制
            memory: 1Gi
        livenessProbe:  # 存活探针(避免僵尸容器)
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10

2. 创建Service暴露服务

(1)NodePort类型(测试环境)
# myapp-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
    nodePort: 30080  # 随机端口或指定30000-32767
  type: NodePort
(2)LoadBalancer类型(生产环境,需云厂商支持)
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local  # 本地优先模式,减少跨节点流量

3. 配置Ingress实现域名访问

# myapp-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
spec:
  rules:
  - host: myapp.example.com  # 替换为实际域名
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-service
            port:
              number: 80
  tls:  # 启用HTTPS(需提前申请证书)
  - hosts:
    - myapp.example.com
    secretName: tls-secret  # 存储证书的Secret

五、生产环境优化配置

1. 资源调度与弹性扩展

(1)节点亲和性调度
# 在Pod模板中添加
nodeSelector:
  disk: ssd  # 调度到标记为ssd的节点
(2)Horizontal Pod Autoscaler
# 基于CPU使用率自动扩缩容(需先安装Metrics Server)
kubectl autoscale deployment myapp-deployment 
  --min 2 --max 10 --cpu-percent=70

2. 数据持久化方案

(1)使用PersistentVolume(PV)
# pv-local.yaml(本地存储示例)
apiVersion: v1
kind: PersistentVolume
metadata:
  name: myapp-pv
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/k8s/myapp  # 宿主机存储路径
(2)PersistentVolumeClaim(PVC)
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myapp-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

3. 镜像拉取策略

# 在容器配置中添加
imagePullPolicy: IfNotPresent  # 优先使用本地镜像,不存在时拉取

六、监控与日志管理

1. 集群监控(Prometheus+Grafana)

(1)安装监控栈
# 使用Helm快速部署
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install kube-prometheus prometheus-community/kube-prometheus-stack 
  --namespace monitoring --create-namespace
(2)配置应用监控指标
# service-monitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: myapp-monitor
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: myapp
  endpoints:
  - port: 8080
    path: /actuator/prometheus  # Spring Boot指标端点
    interval: 15s

2. 日志收集(EFK Stack)

(1)部署Fluentd收集容器日志
# fluentd-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: fluentd
  template:
    spec:
      containers:
      - name: fluentd
        image: fluent/fluentd-kubernetes-daemonset:v1.14-debian-1
        volumeMounts:
        - name: var-log
          mountPath: /var/log
      volumes:
      - name: var-log
        hostPath:
          path: /var/log
(2)存储到Elasticsearch
# 部署Elasticsearch集群
kubectl apply -f https://raw.githubusercontent.com/elastic/cloud-on-k8s/master/kubernetes/elasticsearch.yaml

七、安全加固与故障排查

1. 安全最佳实践

(1)RBAC权限控制
# 创建受限ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: myapp-sa
  namespace: dev

# 绑定只读权限
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: myapp-role-binding
spec:
  roleRef:
    kind: Role
    name: view
    apiGroup: rbac.authorization.k8s.io
  subjects:
  - kind: ServiceAccount
    name: myapp-sa
    namespace: dev
(2)网络策略限制
# 禁止非集群内访问敏感端口
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-access
  namespace: dev
spec:
  podSelector:
    matchLabels:
      app: myapp
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: kube-system  # 仅允许系统命名空间访问

2. 常见问题排查

(1)Pod处于Pending状态
# 检查调度失败原因
kubectl describe pod myapp-7f9c6d98f8-5jv7b

# 查看节点资源占用
kubectl top nodes
(2)镜像拉取失败
# 检查Secret配置
kubectl get secret myapp-secret -n dev -o yaml

# 手动拉取镜像测试
docker pull harbor.example.com/dev/myapp:1.0

八、生产环境部署清单

组件 推荐方案 说明
容器运行时 Docker + containerd 主流运行时组合
网络插件 Calico 支持网络策略和IPIP/VXLAN
存储方案 NFS/GlusterFS/云存储 按需选择分布式存储
监控系统 Prometheus+Grafana 实时资源与应用指标监控
日志系统 EFK/ELK 集中式日志存储与分析
镜像仓库 Harbor/Registry 私有镜像存储与安全扫描

总结

本文详细介绍了通过Docker构建容器镜像并部署到Kubernetes集群的核心流程,包括:

环境准备:Docker/K8s组件安装与镜像加速配置
集群搭建:单节点/多节点部署及网络插件配置
镜像管理:Dockerfile编写、构建优化及安全扫描
应用部署:Deployment/Service/Ingress资源清单实战
生产优化:资源调度、数据持久化、弹性扩缩容
监控运维:Prometheus监控与EFK日志收集
安全加固:RBAC权限与网络策略配置

通过Kubernetes的容器编排能力,结合Docker的镜像化封装,可实现应用的高效部署、弹性扩展和集中管理。建议在生产环境中采用多控制平面节点+负载均衡的高可用架构,同时利用Helm等工具简化部署,并通过定期安全扫描和日志分析确保系统稳定。实践中需根据业务需求调整资源配置,逐步构建自动化CI/CD流水线,提升容器化应用的交付效率与可靠性。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容