近来和同事共同开发的迁移平台项目想进行容器化改造,顺应大趋势往容器化这边靠,项目前端平台利用Django开发,后端Restful API利用高性能Web框架Tornado完成,Agent端利用Flask开发,各取了几个大Python框架的优点。前端
以前CI/CD测试环境以前用的是Gitlab CI,master提交merge request后自动构建部署,正式环境经过Jenkins pipeline手动拉去release 部署,容器化改造将Jenkins托管在Kubernetes之上,Master接受job请求,动态生成slave来完成job任务。node
此文记录了容器化改造中本身遇到的一些心得,可能本身研究的还不够,如下均为我的理解,大佬不喜勿喷,在本次利用Kubernetes将项目容器化过程当中,决定python项目有点大材小用,可是经过此次改造,理解了很多容器化的特征,不断的提高本身IT技术,丰富本身的技能栈。python
一入云原生深似海,下图为咱们更好的全局性了解云原生生态。mysql
本次项目改造用到的一些工具和应用与你们分享(后期有时间将各个工具应用单独写出来分享)git
Gitlab服务器进行代码托管,及gitlab ci/cd,后期能够将其托管至kubernetes集群之上。web
利用Harbor进行镜像存储,审计管理及镜像检查,后期可托管至kubernetes之上。redis
kubernetes-dashboard部署,web界面方便各组件查看管理,简单容器terminal管理,日志分享查看。sql
Rancher部署,导入私有化kubernetes平台,方便集群管理及app安装部署。docker
ceph到mgr分布式集群web界面管理shell
minio/chartmuseum对象存储,方便chart存储管理。
jenkins进行持续集成,持续发布,后期能够将其托管至kubernetes集群之上。
efk进行kubernetes集群容器日志监控管理,f为flutend容器化监控利器。
kubeapps进行chart,registry 添加,方便helm安装部署。
Prometheus + grafana,各个app内进行export出来,进行单个app到matric监控。
例如次项目,分为建立configmap/deployment/service已经拉去私有仓库代码的Secret。
exec "$@"
,方便后期添加配置扩展
利用云服务器搭建部署kubernetes集群,提供计算与内存资源。
须要利用云服务器磁盘部署Ceph分布式存储系统,为kubernetes提供底层存储资源。
前段须要LB,为应用代理到NodePort,kubernetes集群内部使用flannel网络,
node到node以前经过vpc私有网络通信
利用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: QVFCRitmUmM1c1FxxxxxxxxxxxxxxxxxxxxxxxxHFoQVh6NlRvQ2c9PQ==
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
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 "$@"