

-
原有業務佈署在虛擬機器ECS、KVM上,指令碼分散、日誌分散、難於集中收集管理,監控不統一,CPU、記憶體、磁碟資源使用率低,運維效率極低,無法集中管理。
-
新業務佈署需要開通新的虛擬機器,需要單獨定製監控,各種Crontab,配置指令碼,效率低下,CI/CD Jenkins配置繁瑣。

-
利用Kubernetes容器平臺namespaces對不同環境進行區分,建立不同dev、test、stage、prod環境,實現隔離。
-
透過容器化集中佈署所有業務,實現一鍵佈署所需環境業務。
-
統一集中監控報警所有容器服務異常狀態。
-
統一集中收集所有服務日誌至ELK叢集,利用Kibana面板進行分類,方便開發查日誌。
-
基於Kubernetes命令列二次開發,相關開發、測試人員直接操作容器。
-
基於RBAC對不同的環境授於不同的開發、測試訪問Kubernetes許可權,防止越權。
-
透過Jenkins統一CI/CD編譯釋出過程。
-
專案容器化後,整體伺服器CPU、記憶體、磁碟、資源利用減少50%,運維效率提高60%,原來需要N個運維做的事,現在一個人即可搞定。

-
Flannel是 CoreOS 團隊針對 Kubernetes 設計的一個改寫網路(Overlay Network)工具,所有節點透過flanneld節點服務同步路由,使用簡單、方便、穩定,是Kubernetes入門首選。
-
Calico是基於BGP協議的路由方案,支援ACL,部署複雜,出現問題難排查。
-
Weave是基於UDP承載容器之間的資料包,並且可以完全自定義整個叢集的網路拓撲,國內使用較少。
-
Open vSwitch是一個生產質量的多層虛擬交換機,它旨在透過程式設計擴充套件實現大規模網路自動化,同時仍支援標準管理介面和協議,OpenShift-kubernetes平臺和混合雲使用比較多。

-
Pod網路和物理網路不通,Windows辦公電腦、Linux虛擬機器上現有的業務和Kubernetes是隔離的。
-
SVC網路和物理網路不通,Windows辦公電腦、Linux虛擬機器上現有的業務和Kubernetes是隔離的。
-
SVC域名和物理網路不通,Windows辦公電腦、Linux虛擬機器上現有的業務和Kubernetes是隔離的。
-
原有Nginx配置太多的location路由規則,有的有幾百層,不好遷移到ingress-nginx,ingress只支援簡單的規則。
-
SVC-NodePort訪問,在所有Node上開啟埠監聽,佔用Node節點埠資源,需要記住埠號。
-
ingress-nginx http 80埠, 必需透過域名引入,http 80埠必需透過域名引入,原來簡單nginx的location可以透過ingress引入。
-
ingress-nginx tcp udp埠訪問需要配置一個lb,很麻煩,要先規劃好lb節點同樣也需要訪問lb埠。
-
原有業務不能停,繼續執行,同時要能相容Kubernetes環境,和Kubernetes叢集內服務互相通訊呼叫,網路需要通。
vim /etc/sysctl.confnet.ipv4.ip_forward = 1
route add -net 172.20.0.0 netmask 255.255.0.0 gw 192.168.2.71route add -net 172.21.0.0 netmask 255.255.0.0 gw 192.168.2.71
[root@master1 kube-dns-proxy-1.10]# cat tcp-services-configmap.yamlkind: ConfigMapapiVersion: v1metadata:name: tcp-servicesnamespace: ingress-nginxdata:53: "kube-system/kube-dns:53"[root@master1 kube-dns-proxy-1.10]# cat udp-services-configmap.yamlkind: ConfigMapapiVersion: v1metadata:name: udp-servicesnamespace: ingress-nginxdata:53: "kube-system/kube-dns:53"[root@master1 kube-dns-proxy-1.10]# cat ingress-nginx-deploy.yamlapiVersion: extensions/v1beta1kind: Deploymentmetadata:name: nginx-ingress-controller-dnsnamespace: ingress-nginxspec:replicas: 1selector:matchLabels:app: ingress-nginx-dnstemplate:metadata:labels:app: ingress-nginx-dnsannotations:prometheus.io/port: '10254'prometheus.io/scrape: 'true'spec:hostNetwork: trueserviceAccountName: nginx-ingress-serviceaccountcontainers:- name: nginx-ingress-controller-dnsimage: registry-k8s.novalocal/public/nginx-ingress-controller:0.12.0args:- /nginx-ingress-controller- --default-backend-service=$(POD_NAMESPACE)/default-http-backend# - --configmap=$(POD_NAMESPACE)/nginx-configuration- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services- --udp-services-configmap=$(POD_NAMESPACE)/udp-services- --annotations-prefix=nginx.ingress.kubernetes.ioenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespaceports:- name: httpcontainerPort: 80#- name: https# containerPort: 443livenessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254scheme: HTTPinitialDelaySeconds: 10periodSeconds: 10successThreshold: 1timeoutSeconds: 1readinessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254scheme: HTTPperiodSeconds: 10successThreshold: 1timeoutSeconds: 1nodeSelector:node: dns
no-resolvserver=/local/192.168.1.97server=114.114.114.114



-
client——-ingress-nginx—–upstream—-podip,對於ingress-nginx官方使用的原始方案,先配置ingress規則路由,ingress對接不同的service-dns域名,ingress自動發現後端podip,透過upstream負載不同的後端podip,不同的域名路由到不同的Kubernetes後端podip,使用者客戶端訪問流量會負載到不同的Pod上。
-
client——nginx——-upstream——svc—–podip改造現有nginx相容Kubernetes,對接Kubernetes service服務。對於nginx location規則過多,不能很好的相容nginx-ingress導致使用Kubernetes非常困難,難以普及,在不變更現有nginx配置的情況下如何對接Kubernetes這是一個問題,經過前面網路打通的步驟我們所有網路的問題都已解決。現在只需改動很小部分即可相容,由於Kubernetes podip是漂移的,IP總是會變的,nginx只能是對接SVC域名才能持久,但是nginx解析域名有個bug,只解析一次,如果在此期間刪除了yaml,nginx會找不到後端svcip,所以這裡要設定代理變數set $backend,設定resolver的DNS為代理DNS地址,設定解析域名時間和變數解決該問題。
location /tomcat/ {resolver 192.168.1.97 valid=3600s;set $backend "tomcat.dac-prod.svc.cluster.local";error_log logs/dac_error.log error;access_log logs/dac_access.log main;proxy_set_essay-header X-real-ip $remote_addr;proxy_read_timeout 300;proxy_connect_timeout 300;proxy_redirect off;client_max_body_size 100M;proxy_pass http://${backend}:9090;}



#!/bin/bash#最大記憶體排除的node節點exclude_node="node7|node1|node2|node3|master1"exclude_pod="redis|kafka|mongo|zookeeper|Evicted|Completed"#node使用的最大報警記憶體%比node_mem_max="100"#node最大使用cpu百分比node_cpu_max="80"#pod使用的最大報警記憶體MBpod_mem_max="4096"pod_top="5"pod_top_cpu="10"#pod的啟動錯誤時間,單位為秒spod_error_m_time="120"pyding="$HOME/k8s-dev/dingd-zabbix.python"#pod的記憶體以及cpu的使用狀態pod_mem=$(/usr/local/bin/kubectl top pod --all-namespaces |sort -n -k4 )#node的記憶體使用狀態node_status=$(/usr/local/bin/kubectl top node|egrep -v "${exclude_node}" |egrep -v "MEMORY%")#pod的執行狀態pod_status=$(/usr/local/bin/kubectl get pod --all-namespaces -o wide|grep -v NAMESPACE)#設定有問題的pod存取檔案路徑alert_error_pod="/tmp/alert-error-pod.txt"#設定最大記憶體佔用節點上pod的檔案串列路徑alert_list="/tmp/alert-mem-list.txt"#監控cpu百分比檔案輸出路徑alert_node_cpu_list="/tmp/alert_node_cpu_list.txt"#取node記憶體的百分比數字值#node_pre_mem=$(echo "${node_mem}"|awk '{print $5}'|sed -e "s/%//g")#監控node的記憶體百分比,列出佔用記憶體最高的應用並重啟top5應用node_mem_mon () {echo "${node_status}" |awk '{print $1,$5}'|sed -e "s/%//g" |while read node_name node_mem_status;do#echo $node_name $node_mem_statusif [ "${node_mem_status}" -gt "${node_mem_max}" ];then>${alert_list}#找到該節點上的所有的pod名find_pod=$(echo "${pod_status}"|egrep ${node_name}|awk '{print $2}')#找到所有節點倒排序使用最大的記憶體的pod串列for i in $(echo "${find_pod}");doecho "${pod_mem}"|grep $i >>${alert_list}donedate_time=`date +'%F-%T'`echo -e "\n${node_name}最大記憶體超過 %${node_mem_max} 以下pod應用將被重啟 ------------------\n"cat ${alert_list}|sort -n -k 4|tail -${pod_top}python ${pyding} "`echo -e "\n ${date_time} ${node_name}當前記憶體為${node_mem_status}%,最大記憶體超過 %${node_mem_max} 以下pod應用將被重啟 ------------------\n" ;cat ${alert_list}|sort -n -k 4|egrep -v "$exclude_pod"|tail -${pod_top}` "cat ${alert_list}|sort -n -k 4|egrep -v "$exclude_pod"|tail -${pod_top}|egrep -v "應用將被重啟" | awk '{print "/usr/local/bin/kubectl delete pod "$2" -n "$1" " | "/bin/bash"}'fidone}


[root@master1 config]# lspublic-dev_app_list.conf public-test-base.ymlpublic-dev-base.yml sms-test_app_list.confpublic-pretest_app_list.conf sms-test-base.ymlpublic-pretest-base.yml wbyh-dev_app_list.confpublic-stage_app_list.conf wbyh-dev-base.ymlpublic-stage-base.yml wbyh-stage_app_list.confpublic-test_app_list.conf wbyh-stage-base.yml
[root@master1 k8s-dev]# ./k8s wbyh-stage init-yml/root/k8s-dev/config[root@master1 k8s-dev]# treewbyh-stage/├── app│ ├── dac-api-center│ │ └── dac-api-center.yml│ ├── dac-app-web│ │ └── dac-app-web.yml│ ├── dac-config-server│ │ └── dac-config-server.yml│ ├── dac-eureka-server│ │ └── dac-eureka-server.yml│ ├── dac-task│ │ └── dac-task.yml│ ├── dac-task-apply│ │ └── dac-task-apply.yml│ ├── dac-task-h5│ │ └── dac-task-h5.yml│ ├── dac-web│ │ └── dac-web.yml│ ├── dac-message-center│ │ └── dac-message-center.yml│ ├── dac-quartz-jfdata│ │ └── dac-quartz-jfdata.yml│ ├── dac-quartz-mach│ │ └── dac-quartz-mach.yml│ ├── dac-quartz-dac│ │ └── dac-quartz-dac.yml│ ├── dac-resources-center│ │ └── dac-resources-center.yml│ ├── dac-resources-item│ │ └── dac-resources-item.yml│ ├── dac-usercenter-web│ │ └── dac-usercenter-web.yml│ └── tomcat│ └── tomcat.yml└── stateful-sets├── kafka│ ├── 10kafka-config-0420yml│ ├── 10kafka-config.yml│ ├── 20dns.yml│ └── 50kafka.yml├── mongo│ └── mongo-statefulset.yml├── redis│ ├── primary.yml│ └── redis-configmap.yml└── zookeeper├── 10zookeeper-config.yml├── 30service.yml└── 50pzoo.yml22 directories, 26 files
[root@master1 k8s-dev]# ./k8s wbyh-stage create_all/root/k8s-dev/configconfigmap "dac-eureka-server-filebeat-config" createdservice "dac-eureka-server" createddeployment.extensions "dac-eureka-server" createdconfigmap "dac-config-server-filebeat-config" createdservice "dac-config-server" createddeployment.extensions "dac-config-server" createdconfigmap "tomcat-filebeat-config" createdservice "tomcat" createddeployment.extensions "tomcat" created
add svn-jar-version ll itemcommit 29dc05530d839c826130eef81541ce96a155107bAuthor: idea77 <idea77@qq.com>Date: Thu Sep 20 16:11:00 2018 +0800mod ossfs to /Rollback/osscommit 880bcd9483a6ee1f5ca440fef017b30ba7cd14feAuthor: idea77 <idea77@qq.com>Date: Wed Sep 19 16:57:43 2018 +0800

- name: tomcat-imgnfs:path: /home/k8s-nfs-data/dac-test-tomcat-imgserver: 192.168.8.30
ceph-class.yamlapiVersion: storage.k8s.io/v1beta1kind: StorageClassmetadata:name: ceph-dbprovisioner: kubernetes.io/rbdparameters:monitors: 192.168.1.31:6789adminId: adminadminSecretName: ceph-secretadminSecretNamespace: kube-systempool: rbduserId: adminuserSecretName: ceph-secret



-
容器釋出後啟動基礎JDK映象,Wget去http伺服器下載對應目錄編譯好的jar包,然後啟動,即無映象樣式,適合頻繁釋出型別的業務,push jar to oss有一部份業務是跑虛擬機器,需要jar包,oss可以做共享。
-
容器釋出按照標準的方式打image update-imae樣式,適合出錯及時回滾的業務,即編譯dockerfile-push-docke-image-update-deployment。
if [[ $MY_POD_NAMESPACE =~ -dev ]];then#定義啟動基礎鏡相base_image="registry-k8s.novalocal/public/yh-centos7-jdk-1.8"#定義APP映象倉庫地址image_path="registry-k8s.novalocal/xl_public/$MY_POD_NAMESPACE/${APP}"elif [[ $MY_POD_NAMESPACE =~ "-test" ]];then#定義啟動基礎鏡相base_image="registry-k8s.novalocal/public/yh-centos7-jdk-1.8"#定義APP映象倉庫地址image_path="registry-k8s.novalocal/xl_public/$MY_POD_NAMESPACE/${APP}:${date_time}"elif [[ $MY_POD_NAMESPACE =~ -stage ]];then#定義啟動基礎鏡相base_image="registry-k8s.novalocal/xl_public/wbyh-base/centos7-jdk-1.8"#定義idc鏡相倉庫路徑image_path="registry.cn-hangzhou-idc.com/xl_dac/wbyh-stage-${APP}:${date_time}"vpc_image_path="registry-vpc.cn-hangzhou-idc.com/wbyh-stage-${APP}:${date_time}"fi#初始化dockerfileinit_dockerfile () {#生成Dockerfilecd /Rollback/build-docker/echo "" >$MY_POD_NAMESPACE/${APP}/Dockerfile#生成基礎映象地址echo -e "${base_image}" >>${MY_POD_NAMESPACE}/${APP}/Dockerfile#生成docker作者echo -e "MAINTAINER idea77@qq.com" >>${MY_POD_NAMESPACE}/${APP}/Dockerfileecho -e "USER root" >>${MY_POD_NAMESPACE}/${APP}/Dockerfile#獲取啟動指令碼\cp -f start-sh/${MY_POD_NAMESPACE}-sh/${APP}.sh $MY_POD_NAMESPACE/${APP}/echo -e "ADD ./${APP}.sh /home/deploy/" >>${MY_POD_NAMESPACE}/${APP}/Dockerfile#新增 jar包到/home/deploy/echo -e "${add_jar}" >>${MY_POD_NAMESPACE}/${APP}/Dockerfile#暴露埠echo -e "EXPOSE 9090" >>${MY_POD_NAMESPACE}/${APP}/Dockerfile#新增docker入口啟動檔案\cp -f start-sh/templates/docker-entrypoint.sh $MY_POD_NAMESPACE/${APP}/echo -e "ADD ./docker-entrypoint.sh /docker-entrypoint.sh" >>$MY_POD_NAMESPACE/$APP/Dockerfileecho -e "RUN chown -R deploy:deploy /home/deploy && chown -R deploy:deploy /docker-entrypoint.sh && ls -t --full /home/deploy " >>$MY_POD_NAMESPACE/$APP/Dockerfileecho -e "USER deploy" >>$MY_POD_NAMESPACE/$APP/Dockerfileecho -e 'ENTRYPOINT ["/docker-entrypoint.sh"]' >>$MY_POD_NAMESPACE/$APP/Dockerfileif [[ ${MY_POD_NAMESPACE} =~ -prod ]];thendocker images |grep xl_prod|grep ${APP}|awk '{print $1":"$2}'|xargs docker rmi -felsedocker images |grep min-test|grep ${APP}|awk '{print $1":"$2}'|xargs docker rmi -ffiname="${MY_POD_NAMESPACE},build ${image_path}-${svn_version}"cd /Rollback/build-docker/$MY_POD_NAMESPACE/$APP/docker build --no-cache -t ${image_path}-${svn_version} .checkif [[ $MY_POD_NAMESPACE =~ -stage ]];then#vpc專有鏡相地址修改到yml檔案sed -i "s@registry-vpc.cn-hangzhou-idc.com/xl_public\(.*\)@${vpc_image_path}-${svn_version}@g" /home/deploy/k8s-dev/${MY_POD_NAMESPACE}/app/$APP/$APP.ymlelif [[ $MY_POD_NAMESPACE =~ -test ]];thensed -i "s@registry-k8s.novalocal/xl_public/\(.*\)@${image_path}-${svn_version}@g" /home/deploy/k8s-dev/${MY_POD_NAMESPACE}/app/$APP/$APP.ymlfiname="push ${APP}"docker push ${image_path}-${svn_version}check}



-
應用打到docker stdout前臺輸出,Docker輸出到/var/lib/containers,透過Filebeat、Fluentd、DaemonSet元件收集,這種對於小量日誌還可以,大量日誌效能很差,寫入很慢。
-
Pod掛載host-path把日誌打到宿主機,宿主機啟動Filebeat、Fluentd、DaemonSet收集,無法判斷來自哪個容器,哪個Pod和namespace空間。
-
Pod的yml中定義兩個container,同時啟動一個附加的Filebeat,兩個container掛載一個共享捲來收集日誌。
filebeat----kafkacluster-----logstash----esapiVersion: v1kind: ConfigMapmetadata:namespace: dac-prodname: dac-config-server-filebeat-configdata:filebeat.yml: |filebeat.prospectors:- input_type: logfields:namespace: dac-prodservice-name: dac-config-server#pod-ip:paths:- "/mnt/*.log"multiline:pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}'negate: truematch: after#output.elasticsearch:output.kafka:hosts: ["10.31.222.108:9092", "10.31.222.109:9092", "10.31.222.110:9092"]topic: applogrequired_acks: 1compression: gzip# Available log levels are: critical, error, warning, info, debuglogging.level: info---apiVersion: v1kind: Servicemetadata:name: dac-config-servernamespace: dac-prodspec:ports:- port: 9090name: httpselector:app: dac-config-server---apiVersion: apps/v1kind: Deploymentmetadata:name: dac-config-servernamespace: dac-prodlabels:app: dac-config-serverspec:replicas: 1strategy:rollingUpdate:maxSurge: 1maxUnavailable: 1type: RollingUpdateselector:matchLabels:app: dac-config-servertemplate:metadata:labels:app: dac-config-serverspec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- dac-config-servertopologyKey: "kubernetes.io/hostname"imagePullSecrets:- name: myregistrykeycontainers:- image: registry-vpc.cn-hangzhou-idc.com/dac-prod-dac-config-server:v1name: dac-config-serverimagePullPolicy: Alwaysresources:limits:cpu: 4000mmemory: 4096Mirequests:cpu: 150mmemory: 1024Mienv:- name: APPvalue: dac-config-server#public- name: JAVA_OPTSvalue: "-Xms4g -Xmx4g"- name: CONTAINER_CORE_LIMITvalue: "4"- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIP- name: MY_POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespacereadinessProbe:tcpSocket:port: 9090initialDelaySeconds: 60timeoutSeconds: 3livenessProbe:tcpSocket:port: 9090initialDelaySeconds: 60timeoutSeconds: 3ports:- name: httpcontainerPort: 9090volumeMounts:#- name: opt-data#mountPath: /home/deploy- name: logsmountPath: /home/deploy/logs- name: host-timemountPath: /etc/localtimereadOnly: true- image: registry-vpc.cn-hangzhou-idc.com/dac_prod/filebeat:6.0.0name: filebeatimagePullPolicy: Alwaysenv:- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIPvolumeMounts:- name: logsmountPath: /mnt- name: filebeat-confmountPath: /etc/filebeat- name: host-timemountPath: /etc/localtimereadOnly: truenodeSelector:node: publicvolumes:- name: logsemptyDir: {}- name: filebeat-confconfigMap:name: dac-config-server-filebeat-config#- name: opt-data#nfs:#path: /home/k8s-nfs-data/public-dev-base#server: 10.10.1.30- name: host-timehostPath:path: /etc/localtime




[deploy@185 app]# k8s dac-test get_allNAME READY STATUS RESTARTS AGE IP NODEaccountant-3536198527-dtrc9 2/2 Running 0 21h 172.20.1.5 node3.k8s.novalocalanalyzer-1843296997-vz9nc 2/2 Running 0 21h 172.20.87.15 node5.k8s.novalocalapi-1260757537-gxrp2 2/2 Running 0 21h 172.20.71.6 k8s-monitor.novalocalcalculator-1151720239-pr69x 2/2 Running 0 21h 172.20.1.12 node3.k8s.novalocalconsul-0 1/1 Running 0 21h 172.20.87.3 node5.k8s.novalocaldispatcher-2608806384-kp433 2/2 Running 0 21h 172.20.4.6 lb1.k8s.novalocalgeo-1318383076-c7th2 2/2 Running 0 5m 172.20.94.6 node6.k8s.novalocalgreeter-79754259-s3bs2 2/2 Running 0 21h 172.20.19.5 jenkins-master.k8s.novalocalkafka-0 1/1 Running 0 21h 172.20.1.4 node3.k8s.novalocalmqtt-0 1/1 Running 0 21h 172.20.94.15 node6.k8s.novalocalmysql-0 2/2 Running 0 21h 172.20.47.7 elk-k8sdata.novalocalpusher-2834145138-lfs21 2/2 Running 0 21h 172.20.19.6 jenkins-master.k8s.novalocalrecovery-261893050-70s3w 2/2 Running 0 21h 172.20.32.13 node4.k8s.novalocalredis-0 1/1 Running 0 21h 172.20.4.5 lb1.k8s.novalocalrobot-1929938921-6lz6f 2/2 Running 0 21h 172.20.47.8 elk-k8sdata.novalocalscheduler-3437011440-rsnj6 2/2 Running 0 21h 172.20.5.10 db.k8s.novalocalvaluation-2088176974-5kwbr 2/2 Running 0 21h 172.20.94.20 node6.k8s.novalocalzookeeper-0 1/1 Running 0 21h 172.20.4.4 lb1.k8s.novalocal
註意,如何操作使用者自己有許可權的空間,必需填寫default-namespace.conf註意,當gitlab master分支有合併的時候,目前我們ci自動會構建編譯最新的jar版本,推送至nexus倉庫,k8s容器裡的jar包可以指定更新k8s init-yml #初始化生成使用者自己本人的yml檔案k8s get_all #檢視使用者自己本人空間下的所有執行的容器k8s create_all #建立使用者自己本人所有服務k8s delall_app #刪除本人空間下所有app服務,除基礎服務mysql、 consul、 kafka、 redis、 zookeeper、mqtt 以外的所有服務k8s apply api #修改了使用者自己本人yml配置檔案,應用配置生效k8s create api #使用者自己本人空間下建立一個api服務k8s delete api #使用者自己本人空間下刪除一個api服務k8s scale api 2 #使用者自己本人空間下把api服務擴容成2個podk8s login api #使用者本人空間下登入api所在的docker容器k8s logs api #使用者自己本人空間用tail -f 命令的方式檢視容器內/home/deploy/api/logs/api.log 的日誌k8s error-logs api #使用者自己本人空間用tail -f 命令的方式檢視容器內/home/deploy/api/logs/api.error.log 的日誌k8s clean api #如果編譯出錯,在使用者自己本人空間用gradlew clean清理命令的方式清理編譯k8s push_jar #更新本人空間下所有容器的jar包版本,重啟所有容器,預設拉取backend / push-envelope -git最終版本,該版本為合併編譯成功後的最新版本號k8s push_jar 20170927-1731 #選擇指定的jar版本號20170927-1731 進行更新 ,重啟所有容器k8s reinit-mysql #重新更新所有容器jar版本後api無法啟動,清空使用者空間下的資料庫,重新建立匯入資料批次操作k8s scale api-geo 2 #在dev使用者下把api和geo 擴容k8s delete api-geo #在dev使用者下刪除api 和geo服務k8s create api-geo #在dev使用者下建立api和geo服務所有人員通用命令,要操作某個使用者的資源,必需先生成所需要的yml檔案但是必需指定第二個引數名dev test stage等。k8s stage init-yml #初始化生成stage使用者的yml檔案 註意要操作stage使用者的容器要先成配置檔案k8s test init-yml #初始化生成test空間的yml檔案k8s dev init-yml #初始化生成dev空間的yml檔案k8s dev get_all #檢視dev使用者空間下的所有執行的容器k8s dev create_all #建立dev空間下所有服務k8s dev delall_app #刪除dev空間下的app服務,除基礎服務mysql、 consul、 kafka、 redis、 zookeeper、mqtt 以外的所有服務k8s dev apply api #修改了yml配置檔案,應用配置生效k8s dev create api #dev空間下建立一個api服務k8s dev delete api #dev空間下刪除一個api服務k8s dev scale api 2 #dev空間下把api服務擴容成2個podk8s dev login api #dev空間下登入api所在的docker容器k8s dev logs api #dev空間用tail -f 命令的方式檢視容器內/home/deploy/api/logs/api.log 的日誌k8s dev error-logs api #dev空間用tail -f 命令的方式檢視容器內/home/deploy/api/logs/api.error.log 的日誌k8s dev push_jar #更新dev空間下所有容器的jar包版本,重啟所有容器,預設拉取backend /-git最終版本,該版本為合併編譯成功後的最新版本號k8s dev push_jar 20170927-1731 #選擇指定的jar版本號20170927-1731 進行更新 ,重啟所有容器k8s dev clean api #如果編譯出錯,dev使用者空間用gradlew clean清理命令的方式清理編譯k8s dev reinit-mysql #重新更新所有容器jar版本後api無法啟動,清空dev空間下的資料庫,重新建立匯入資料批次操作k8s dev scale api-geo 2 #在dev空間把api和geo 擴容k8s dev delete api-geo #在dev空間刪除api 和geo服務k8s dev create api-geo #在dev空間下建立api和geo服務管理員專用命令,註意管理員第二個引數一定要填k8s dev create_rsync #建立dev空間的rsync配置k8s dev create_passwd #建立dev空間的解壓密碼下發金鑰k8s dev create rbac #建立dev空間的叢集授權認證k8s dev delete rbac #刪除dev空間的叢集授權認證k8s dev delete_all #刪除dev空間下所有服務

if [ "x$CONTAINER_CORE_LIMIT" != "x" ]; thenLIBSYSCONFCPUS="$CONTAINER_CORE_LIMIT"if [ ${LIBSYSCONFCPUS} -lt 2 ]; thenLIBSYSCONFCPUS=2fiexport LIBSYSCONFCPUSfiexport LD_PRELOAD="/usr/local/lib/libsysconfcpus.so:$LD_PRELOAD"


知識星球
