k8s部署doccano开源文本标注工具

k8s部署doccano开源文本标注工具

doccano

  • 版本:v.1.7.0

镜像构建:

  • 下载v1.7.0版本代码
git clone -b v.17.0  https://github.com/doccano/doccano.git
  • 思路

阅读docker/docker-compose.prod.yaml文件,我们知道doccano项目有五个服务,分别是doccano_backend、doccano_fronted、doccano_celery、postgres、rabbitmq。只需要构建前三个镜像即可。

  • 构建doccano_backend 镜像
# 在doccano文件夹下执行
docker build -t doccano_backend:prod -f docker/Dockerfile.prod .
  • 构建doccano_celery 镜像

阅读分析docker-compose.prod.yaml文件,我们知道doccano_celery用的是同一个Dockerfile.prod文件,只是入口不同,doccano_celery 的入口是entrypoint: ["/opt/bin/prod-celery.sh"];即只需要将Dockerfile.prod最后一行替换就行。我复制了一份再替换,文件名为Dockerfile.prod-celery,避免文件混乱。

# 在doccano文件夹下面执行
docker build -t doccano_celery:prod -f docker/Dockerfile.celery .
  • 构建doccano_fronted
# 在doccano文件夹下面执行
docker build -t doccano_frontend:prod -f docker/Dockerfile.nginx .
  • 填坑

在国内编译很慢,可以在google 云服务器上编译。

  • 如果在谷歌云服务器上构建,还需要将镜像导出,并导入自己的服务器
# 导出
docker save doccano_backend:prod -o doccano_backend-prod.tar
# 导入
docker load -i doccano_backend-prod.tar
# 其他镜像类似

k8s yaml文件

在本文中,我把postgres数据库服务拆分出来单独部署。剩下四个服务部署在一个pod中,通过服务发现的方式访问postgres数据库。

postgres数据库Yaml文件

apiVersion: v1
kind: Namespace
metadata:
  labels:
    app: postgres
  name: postgres
---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: postgres-pv-volume
  namespace: postgres
  labels:
    type: local
    app: postgres
spec:
  storageClassName: manual
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/opt/data/postgres"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgres-pv-claim
  namespace: postgres
  labels:
    app: postgres
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  • postgres pod service 部署Yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
  namespace: postgres
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: postgres
  replicas: 1
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:11.7
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 5432
          envFrom:
            - configMapRef:
                name: postgres-config
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgredb
      
      volumes:
        - name: postgredb
          persistentVolumeClaim:
            claimName: postgres-pv-claim
---
apiVersion: v1
kind: Service
metadata:
  name: postgres-service
  namespace: postgres
  labels:
    app: postgres
spec:
  type: NodePort
  ports:
  - port: 5432
    targetPort: 5432
    protocol: TCP
  selector:
   app: postgres

doccano 部署Yaml文件

apiVersion: v1
kind: Namespace
metadata:
  labels:
    app: doccano
  name: doccano
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: doccano-config
  namespace: doccano
  labels:
    app: doccano
data:
  ADMIN_USERNAME: admin
  ADMIN_PASSWORD: password
  ADMIN_EMAIL: admin@example.com

  RABBITMQ_DEFAULT_USER: doccano
  RABBITMQ_DEFAULT_PASS: doccano
  RABBITMQ_HOST: 127.0.0.1

  POSTGRES_DB: doccano
  POSTGRES_USER: postgresadmin
  POSTGRES_PASSWORD: admin12345
  # 通过服务发现的方式访问postgres 数据库,原理:postgres-service.default.svc.cluster.local
  # 是postgres-service的域名,5432是postgres-service服务在k8s集群内部暴露的端口
  # 如果postgres service 部署方式更改,则这里也要更改。原理详情见k8s service 
  POSTGRES_HOST: postgres-service.default.svc.cluster.local
  POSTGRES_PORT: "5432"

  DOCCANO_BACKEND_HOST: 127.0.0.1
  DOCCANO_BACKEND_PORT: "8000"
  
  ALLOW_SIGNUP: "False"
  DEBUG: "False"
  PYTHONUNBUFFERED: "1"
  GOOGLE_TRACKING_ID: ""
  • doccano-pod部署Yaml文件
# doccano-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: doccano
  namespace: doccano
  labels:
    app: doccano
spec:
  containers:
  - name: doccano-backend
    image: harbor.com:5080/prod/doccano_backend:prod
    env:
      - name: ADMIN_USERNAME
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: ADMIN_USERNAME
      - name: ADMIN_PASSWORD
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: ADMIN_PASSWORD
      - name: ADMIN_EMAIL
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: ADMIN_EMAIL
      - name: RABBITMQ_DEFAULT_USER
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: RABBITMQ_DEFAULT_USER
      - name: RABBITMQ_DEFAULT_PASS
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: RABBITMQ_DEFAULT_PASS
      - name: RABBITMQ_HOST
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: RABBITMQ_HOST
      - name: CELERY_BROKER_URL
        value: "amqp://$(RABBITMQ_DEFAULT_USER):$(RABBITMQ_DEFAULT_PASS)@$(RABBITMQ_HOST)"
      - name: POSTGRES_USER
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: POSTGRES_USER
      - name: POSTGRES_PASSWORD
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: POSTGRES_PASSWORD
      - name: POSTGRES_HOST
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: POSTGRES_HOST
      - name: POSTGRES_PORT
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: POSTGRES_PORT
      - name: POSTGRES_DB
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: POSTGRES_DB
      - name: DATABASE_URL
        value: "postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT)/$(POSTGRES_DB)?sslmode=disable"
      - name: ALLOW_SIGNUP
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: ALLOW_SIGNUP
      - name: DEBUG
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: DEBUG
      - name: DJANGO_SETTINGS_MODULE
        value: config.settings.production
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 8000
    volumeMounts:
      - mountPath: /backend/staticfiles
        name: static-volume
      - mountPath: /backend/media
        name: media
      - mountPath: /backend/filepond-temp-uploads
        name: tmp-file

  - name: doccano-celery
    image: harbor.com:5080/prod/doccano_celery:prod
    env:
      - name: PYTHONUNBUFFERED
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: PYTHONUNBUFFERED
      - name: RABBITMQ_DEFAULT_USER
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: RABBITMQ_DEFAULT_USER
      - name: RABBITMQ_DEFAULT_PASS
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: RABBITMQ_DEFAULT_PASS
      - name: RABBITMQ_HOST
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: RABBITMQ_HOST
      - name: CELERY_BROKER_URL
        value: "amqp://$(RABBITMQ_DEFAULT_USER):$(RABBITMQ_DEFAULT_PASS)@$(RABBITMQ_HOST)"
      - name: POSTGRES_USER
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: POSTGRES_USER
      - name: POSTGRES_PASSWORD
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: POSTGRES_PASSWORD
      - name: POSTGRES_HOST
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: POSTGRES_HOST
      - name: POSTGRES_PORT
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: POSTGRES_PORT
      - name: POSTGRES_DB
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: POSTGRES_DB
      - name: DATABASE_URL
        value: "postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT)/$(POSTGRES_DB)?sslmode=disable"
      - name: DJANGO_SETTINGS_MODULE
        value: config.settings.production
    imagePullPolicy: IfNotPresent
    volumeMounts:
      - mountPath: /backend/media
        name: media
      - mountPath: /backend/filepond-temp-uploads
        name: tmp-file

  - name: doccano-frontend
    image: harbor.com:5080/prod/doccano_frontend:prod
    env:
      - name: DOCCANO_BACKEND_HOST
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: DOCCANO_BACKEND_HOST
      - name: DOCCANO_BACKEND_PORT
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: DOCCANO_BACKEND_PORT
      - name: API_URL
        value: "http://$(DOCCANO_BACKEND_HOST):$(DOCCANO_BACKEND_PORT)"
      - name: GOOGLE_TRACKING_ID
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: GOOGLE_TRACKING_ID
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 8080
    volumeMounts:
      - mountPath: /static
        name: static-volume
      - mountPath: /media
        name: media

  - name: doccano-rabbitmq
    image: rabbitmq:3.8
    env:
      - name: RABBITMQ_DEFAULT_USER
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: RABBITMQ_DEFAULT_USER
      - name: RABBITMQ_DEFAULT_PASS
        valueFrom:
          configMapKeyRef:
              name: doccano-config
              key: RABBITMQ_DEFAULT_PASS
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 5672

  restartPolicy: Always
  hostAliases:
  - ip: "127.0.0.1"
    hostnames:
    - "backend"
  volumes:
    - name: static-volume
      emptyDir: {}
    - name: media
      emptyDir: {}
    - name: tmp-file
      emptyDir: {}
  • doccano-service 部署Yaml文件
# doccano-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: doccano
  namespace: doccano
  labels:
    app: doccano
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
    protocol: TCP
  selector:
   app: doccano

部署

  • 执行Yaml文件
# 部署
kubectl apply -f xxx.yaml
  • 查看服务运行
kubectl get pods,svc -n doccano
doccano 运行状态
  • 访问doccano

service/doccano 的8080:30053端口是doccano对外的访问端口,通过k8s集群的任意一个IP + 30053端口都可以访问

  • 我构建好的镜像以及Yaml文件,仅供参考

代做工资流水公司南昌银行流水电子版查询上饶对公银行流水公司曲靖车贷银行流水 费用广州办理转账银行流水新乡制作银行流水电子版深圳流水公司莆田银行流水修改代做上饶查个人工资流水菏泽房贷工资流水许昌工资代付流水打印银川银行流水电子版样本揭阳打印转账银行流水中山工资流水app截图公司扬州银行流水PS打印商丘个人工资流水 样本常德做工资流水单烟台打车贷工资流水潮州打车贷工资流水遵义车贷银行流水 办理南昌做公司流水沈阳车贷流水费用金华车贷银行流水 查询德阳工资代付流水制作温州银行流水单代办信阳银行流水修改公司汕头做签证流水北京查转账流水成都工资流水账单西安银行流水电子版南昌查签证工资流水香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化