前言
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流水线,提升容器化应用的交付效率与可靠性。
暂无评论内容