docker compose 与 k8s 使用

Docker compose

Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。

Docker技术的三大核心概念,分别是:

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

负责对Docker镜像进行管理的,是Docker Registry服务(类似仓库管理员)。

 

yaml文件结构

project/
├── docker-compose.base.yml      # 基础配置
├── docker-compose.services.yml  # 服务定义
├── docker-compose.dev.yml       # 开发环境扩展
├── docker-compose.prod.yml      # 生产环境扩展
└── .env                         # 环境变量
# 启动多个独立的 compose 文件
docker-compose -f docker-compose.base.yml -f docker-compose.override.yml up -d

# 更复杂的组合
docker-compose \
  -f docker-compose.base.yml \
  -f docker-compose.services.yml \
  -f docker-compose.volumes.yml \
  -f docker-compose.networks.yml \
  up -d
version : '3.8'
services:
  # 前端 nginx部署
  ecms-front:
    container_name: ecms-front
    image: data-center-front:0.6.1
    ports:
      - "20080:80"
    volumes:
      - ./ecms-front/nginx.conf:/etc/nginx/nginx.conf
      - ./ecms-front/default.conf:/etc/nginx/conf.d/default.conf
    networks:
      - energuard_net
    restart: unless-stopped

  # 后端-平台
  ecms-api:
    container_name: ecms-api
    image: ecms-api:0.6.1-SNAPSHOT
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "8080:8080"
    volumes:
      - ./ecms-api/config:/home/config
      - ./ecms-api/logs:/home/logs
      - ./ecms-api/data/upload:/home/upload
      - /etc/localtime:/etc/localtime:ro
    networks:
      - energuard_net

  # 后端-数据采集
  ecms-acquisition:
    container_name: ecms-acquisition
    image: ecms-acquisition-api:0.6.1-SNAPSHOT
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "8090:8090"
    volumes:
      - ./ecms-acquisition/config:/home/config
      - ./ecms-acquisition/logs:/home/logs
      - ./ecms-acquisition/data/upload:/home/upload
      - /etc/localtime:/etc/localtime:ro
    networks:
      - energuard_net

networks:
  energuard_net:
    external: true      # 表明网络是外部已存在的网络

 

k8s

Docker应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理。

K8S,基于容器的集群管理平台(kubernetes)

 

一个K8S系统,通常称为一个K8S集群(Cluster)。

这个集群主要包括两个部分:

  • 一个Master节点(主节点)
  • 一群Node节点(计算节点)

 Master节点主要还是负责管理和控制。Node节点是工作负载节点,里面是具体的容器。

Master节点包括API Server、Scheduler、Controller manager、etcd。

API Server是整个系统的对外接口,供客户端和其它组件调用。

Scheduler负责对集群内部的资源进行调度。

Controller manager负责管理控制器。

Node节点包括Docker、kubelet、kube-proxy、Fluentd、kube-dns(可选),还有就是Pod。

Pod是Kubernetes最基本的操作单元。一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个紧密相关的容器。除了Pod之外,K8S还有一个Service的概念,一个Service可以看作一组提供相同服务的Pod的对外访问接口。

Docker:创建容器的。

Kubelet:主要负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除等。

Kube-proxy:主要负责为Pod对象提供代理。

Fluentd:主要负责日志收集、存储与查询。

 

K8s 资源 YAML 文件都包含以下四个核心字段:

apiVersion: <API组/版本>       # 使用的 API 版本

kind: <资源类型> # 资源类型,如 Deployment、Service、pod 等

metadata: # 元数据:名称、命名空间、标签等

spec: # 资源的具体配置(核心内容)

 

# Pod 是 K8s 中最小的运行单元,通常不直接创建,而是由控制器(如 Deployment)管理。

# Deployment(管理无状态应用) 用于声明 Pod 的期望状态(副本数、更新策略等),自动创建和管理 ReplicaSet。

# Service(服务发现与负载均衡) 为一组 Pod 提供稳定的网络访问入口。

# ConfigMap(非敏感配置) 存储配置数据,可挂载为文件或环境变量。

# Secret(敏感信息) 存储密码、token 等,Base64 编码(不是加密! )

# PersistentVolumeClaim(PVC,存储申请) 用户对持久化存储的“请求”。

 

********************************************************************************************************
configs/
├── nginx/
│ ├── deployment.yaml
│ └── service.yaml
├── backend/
│ ├── deployment.yaml
│ └── service.yaml
└── database/
├── statefulset.yaml
└── service.yaml
# 部署整个目录(按字母顺序)
kubectl apply -f configs/

# 或部署特定目录
kubectl apply -f configs/nginx/
kubectl apply -f configs/backend/
********************************************************************************************************

yaml文件编写

kubectl apply -f web-app.yaml
访问:http://<NodeIP>:30080

# Deployment 创建 2 个运行 nginx 的 Pod
# Service 创建一个负载均衡器,将流量分发到这两个 Pod
# 用户可通过任意 Kubernetes 节点的 30080 端口访问该 web 应用
# Service 自动监控 Pod 变化,如果 Pod 重启或迁移,会自动更新路由

应用部署:
创建和管理 2 个相同的 Pod,每个 Pod 运行一个 nginx 1.25 版本的容器。
---
# Deployment  # 注释:这是一个 Deployment 资源
apiVersion: apps/v1  # 使用的 API 版本
kind: Deployment  # 资源类型:部署
metadata:
  name: web-app  # Deployment 的名称
spec:
  replicas: 2  # 需要运行的 Pod 副本数量(2 个实例)
  selector:
    matchLabels:
      app: web  # 选择器:选择标签为 app=web 的 Pod
  template:     # template 包含了一个完整的 Pod 定义,Deployment 会根据这个模板创建新的 Pod。
    metadata:
      labels:
        app: web  # Pod 的标签:app=web
    spec:
      containers:
      - name: web  # 容器名称
        image: nginx:1.25  # 使用的容器镜像
        ports:
        - containerPort: 80  # 容器内监听的端口
---
# Service 作用: 为 Deployment 创建的 Pod 提供网络访问
# Service  # 注释:这是一个 Service 资源

apiVersion: v1  # Service 使用的 API 版本
kind: Service  # 资源类型:服务
metadata:
  name: web-service  # Service 的名称
spec:
  type: NodePort  # Service 类型:NodePort(将服务暴露到集群外)
  selector:
    app: web  # 选择器:将流量路由到标签为 app=web 的 Pod
  ports:
    - port: 80  # Service 本身的端口(集群内访问使用)
      targetPort: 80  # 容器内的目标端口
      nodePort: 30080  # 节点上的端口,外部通过此端口访问

Kubernetes 支持多种方式来组织配置

单文件多资源:在单个文件中编写多个deployment,使用 --- 分隔符在单个文件中定义多个资源:

多文件按组件划分:按业务划分,在多个yaml文件中分开进行存储

 

posted @ 2022-07-29 15:40  wangssd  阅读(420)  评论(0)    收藏  举报