项目容器化改造心得

发布时间:2020-07-30 17:01:21 作者:KaliArch
来源:网络 阅读:745

一.概述

1.1 背景

近来和同事共同开发的迁移平台项目想进行容器化改造,顺应大趋势往容器化这边靠,项目前端平台利用Django开发,后端Restful API利用高性能Web框架Tornado完成,Agent端利用Flask开发,各取了几个大Python框架的优势。

之前CI/CD测试环境之前用的是Gitlab CI,master提交merge request后自动构建部署,正式环境通过Jenkins pipeline手动拉去release 部署,容器化改造将Jenkins托管在Kubernetes之上,Master接受job请求,动态生成slave来完成job任务。

此文记录了容器化改造中自己遇到的一些心得,可能自己研究的还不够,以下均为个人理解,大佬不喜勿喷,在本次利用Kubernetes将项目容器化过程中,决定python项目有点大材小用,但是通过这次改造,理解了不少容器化的特征,不断的提升自己IT技术,丰富自己的技能栈。

1.2 容器化改造优势

1.3 容器化改造的要求

二.工具

2.1 云原生生态

一入云原生深似海,下图为我们更好的全局性了解云原生生态。

项目容器化改造心得

2.2 工具应用

本次项目改造用到的一些工具和应用与大家分享(后期有时间将各个工具应用单独写出来分享)

Gitlab服务器进行代码托管,及gitlab ci/cd,后期可以将其托管至kubernetes集群之上。

利用Harbor进行镜像存储,审计管理及镜像检查,后期可托管至kubernetes之上。

kubernetes-dashboard部署,web界面方便各组件查看管理,简单容器terminal管理,日志分享查看。

Rancher部署,导入私有化kubernetes平台,方便集群管理及app安装部署。

ceph到mgr分布式集群web界面管理

minio/chartmuseum对象存储,方便chart存储管理。

jenkins进行持续集成,持续发布,后期可以将其托管至kubernetes集群之上。

efk进行kubernetes集群容器日志监控管理,f为flutend容器化监控利器。

kubeapps进行chart,registry 添加,方便helm安装部署。

Prometheus + grafana,各个app内进行export出来,进行单个app到matric监控。

项目容器化改造心得

三.改造的要求

3.1 程序要求

3.1.1 项目结构

项目容器化改造心得

项目容器化改造心得

项目容器化改造心得

例如次项目,分为创建configmap/deployment/service已经拉去私有仓库代码的Secret。

项目容器化改造心得

3.1.2 代码要求

项目容器化改造心得

项目容器化改造心得

3.2 架构要求

3.2.1 基础资源

利用云服务器搭建部署kubernetes集群,提供计算与内存资源。

需要利用云服务器磁盘部署Ceph分布式存储系统,为kubernetes提供底层存储资源。

前段需要LB,为应用代理到NodePort,kubernetes集群内部使用flannel网络,

node到node之前通过vpc私有网络通讯

3.2.2 流量引入

四.项目部分示例

4.1 存储类

利用ceph集群,构建存储类,同时利用CephFS来解决跨node挂载的应用。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rdb
provisioner: ceph.com/rbd
reclaimPolicy: Retain
parameters:
  monitors: 10.xx.xx.xx:6789
  pool: kube
  adminId: admin
  adminSecretName: ceph-admin-secret
  adminSecretNamespace: kube-system
  userId: kube
  userSecretName: ceph-client-secret
  userSecretNamespace: kube-system
  fsType: xfs
  imageFormat: "2"
  imageFeatures: "layering"
apiVersion: v1
kind: Secret
metadata:
  name: ceph-admin-secret
  namespace: kube-system
type: "kubernetes.io/rbd"
data:
  # ceph auth get-key client.admin |base64
  key: QVFCRitmUmM1c1FxxxxxxxxxxxxxxxxxxxxxxxxHFoQVh7NlRvQ2c9PQ==
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: go2cloud-api-pvc
  namespace: default
spec:
  storageClassName: "ceph-rdb"
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
apiVersion: v1
data:
  config.yaml: |
    ---
    DB_ENGINE: mysql
    DB_HOST: mariadb-cluster-mariadb-master.default.svc.cluster.local
    DB_PORT: 3306
    DB_USER: go2clouduser
    DB_PASSWORD: go2xxxxxxxxx
    DB_NAME: go2cxxxxxxxx

    # Use Redis as cache
    # Redis配置,连接replication的master节点
    REDIS_HOST: redis-cluster-redis-ha-announce-0.default.svc.cluster.local
    REDIS_PORT: 6379
    REDIS_PASSWORD: go2cloxxxxxxxx
    # go2cloud-platform 监听端口
    HTTP_LISTEN_PORT: 8088
    # callback url
    API_MIGRATE_SERVER_URL: http://go2cloud-api-service.default.svc.cluster.local:8004
    PLATFORM_CALLBACK_URL: http://go2cloud-platform-service.default.svc.cluster.local:8088
kind: ConfigMap
metadata:
  name: go2cloud-platform-cm

4.2 应用相关资源

apiVersion: apps/v1
kind: Deployment
metadata:
  name: go2cloud-platform
  namespace: default
spec:
  selector:
    matchLabels:
      # 匹配下面选择的template 中的label.app名称
      app: go2cloud-platform
  replicas: 2
  template:
    metadata:
      labels: 
        app: go2cloud-platform
        release: latest
    spec: 
      imagePullSecrets:
      - name: registry-secret
      containers:
      - name: go2cloud-platform
        image: 10.234.xxx.xxx/go2cloud/go2cloud-plaxxxxx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8088
          protocol: TCP
        volumeMounts:
          # 必须匹配volumes的名称
        - name: go2cloud-platform-config
          mountPath: /data/config
          readOnly: true
        resources:
          requests:
            cpu: 250m
            memory: 520Mi
          limits:
            cpu: 500m
            memory: 1024Mi
        livenessProbe:
          tcpSocket: 
            port: 8088
          initialDelaySeconds: 20
      volumes:
      # 定义逻辑卷的名称
      - name: go2cloud-platform-config
        configMap:
          # 使用configmap资源的名称
          name: go2cloud-platform-cm
          items:
          # 使用configmap中到那个key
          - key: config.yaml
            # 使用configmap中到key映射到容器中到文件名称
            path: config.yaml
            mode: 0644 
apiVersion: v1
kind: Service
metadata:
  name: go2cloud-platform-service
  namespace: default
spec:
  selector:
    app: go2cloud-platform
  type: NodePort
  ports:
  - name: http
    nodePort: 30020
    port: 8088
    targetPort: 8088
    protocol: TCP
apiVersion: v1
kind: Secret
metadata:
  name: registry-secret
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxMC4yMzQuMi4yMTgiOiB7CgkJCSJhdXRoIjogIllXNWphRzVsZERwWWVIcDRRRGM0T1E9PSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2Vyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
FROM python:latest
LABEL maintainer="kaliarch"
ENV BASE_ROOT="/data" 
ADD . ${BASE_ROOT}
RUN pip install --default-timeout=100 -r ${BASE_ROOT}/requirements/requirements.txt \
&& ln -s ${BASE_ROOT}/entrypoint.sh /bin/entrypoint.sh

EXPOSE 8088/tcp
ENTRYPOINT ["/bin/sh","/bin/entrypoint.sh"]
CMD ["python","/data/runserver","start","all"]
#!/bin/sh
# config go2cloud-api configfile

exec "$@"

五.反思

推荐阅读:
  1. MyBank怎么进行容器化
  2. 一个项目的SpringCloud微服务改造过程

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

云原生 容器化改造 kubernetes

上一篇:如何去除php末尾字符

下一篇:如何修改php文件创建时间

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》