近來和同事共同開發的遷移平臺項目想進行容器化改造,順應大趨勢往容器化這邊靠,項目前端平臺利用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 "$@"