云效平台

云效平台

war/jar包构建脚本

#source /etc/profile
#使用jdk的版本
export JAVA_HOME=/usr/install/java8
#进入应用目录如果是应用名字可以写成{appName}
cd ${appName}
#编译打包
/usr/install/maven3/bin/mvn clean install -D maven.test.skip
#进入target目录
cd target
#命名一个参数
request1="buildNum=${BUILD_NUMBER}"
#命名一个参数,warName上传的jar包一定要写正确
packageName="warName=@springboot-1.2.3-SNAPSHOT.jar"
#上传war包
curl -X POST -F "${packageName}" -F 'crid=${crid}' -F 'compileId=${compileId}' -F 'appName=${appName}' -F "${request1}"  http://package.switch.uatyx.yundasys.com:9090/upload

K8s构建脚本-jar包

#source /etc/profile
#使用jdk的版本
export JAVA_HOME=/usr/install/java8
#进入应用目录如果是应用名字可以写成{appName}
cd ${appName}
#编译打包
/usr/install/maven3/bin/mvn clean install -D maven.test.skip

docker login -u alauda/yunxiaodev01 -p Yunxiaodev01@123 10.131.9.12:5000
docker build -t 10.131.9.12:5000/a05-international/${appName}:${version}  .
docker push 10.131.9.12:5000/a05-international/${appName}:${version}
#镜像命名
packageName="10.131.9.12:5000/a05-international/${appName}:${version}"
#上传镜像
curl -X POST -F "imageName=${packageName}" -F 'crid=${crid}' -F 'compileId=${compileId}' -F 'appName=${appName}'   http://package.switch.uatyx.yundasys.com:9090/callBack

k8s构建脚本

#source /etc/profile
cd ${appName}
docker login -u alauda/yunxiaodev01 -pYunxiaodev01@123 10.131.9.12:5000
docker build -t 10.131.9.12:5000/a03-finance/${appName}:${version} .
docker push 10.131.9.12:5000/a03-finance/${appName}:${version}
packageName="10.131.9.12:5000/a03-finance/${appName}:${version}"
#回调
curl -X POST -F "imageName=${packageName}" -F 'crid=${crid}' -F 'compileId=${compileId}' -F 'appName=${appName}'   http://package.switch.uatyx.yundasys.com:9090/callBack

部署方式

  • k8s

  • base

部署配置

部署使用到的模板

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: ${wayne-app}
  labels:
    wayne-app: ${wayne-app}
    wayne-ns: default
    app: ${wayne-app}
spec:
  selector:
    matchLabels:
      app: ${wayne-app}
  template:
    metadata:
      labels:
        wayne-app: ${wayne-app}
        wayne-ns: default
        app: ${wayne-app}
    spec:
      containers:
        - resources:
            limits:
              memory: ${lim_mem}
              cpu: '${lim_cpu}'
            requests:
              memory: ${req_mem}
              cpu: '${req_cpu}'
          env: []
          envFrom: []
          imagePullPolicy: IfNotPresent
          image: '${image}'
          name: ${wayne-app}
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 20%
      maxUnavailable: 1
---
apiVersion: v1
kind: Service
metadata:
  name: ${wayne-app}
  labels:
    wayne-app: ${wayne-app}
    wayne-ns: default
    app: ${wayne-app}
spec:
  selector:
    app: ${wayne-app}
  ports:
    - protocol: TCP
      targetPort: ${serviceTarPort}
      port: ${servicePort}
      name: ${wayne-app}
  type: NodePort

以上,凡是存在${变量名}的变量,在部署的时候,要求填写变量,

以下为变量,

req_mem:4Gi; 
lim_cpu:2; 
req_cpu:1; 
serviceTarPort:8081; 
wayne-app:yajun-test-application; 
servicePort:8081; 
lim_mem:4Gi

服务中的三个端口:

  • port 端口 (内部访问端口)

    k8s集群内部服务之间相互访问service的端口。

  • targetPort端口 (docker暴露端口)

    它就是容器真正暴露的端口(使用DockerFile中的EXPOSE),targetPort是pod上的端口,从port和nodePort上来的流量,经过kube-proxy流入到后端pod的targetPort上,最后进入容器内。

  • nodePort 端口 (对外访问端口)

    k8s集群中发发布完service之后,如果需要外部访问,nodePort是一种访问方式,即nodePort是提供给外部流量访问k8s集群中service使用的端口。

    例如外部用户要访问k8s集群中的一个Web应用,那么我们可以配置对应的service如下,就可以从外部通过浏览器http://node:28080访问到该web服务。

针对公司云效平台部署的时候,从外部访问时,端口变化,可以增加倒数第3行内容。如下:

spec:
  selector:
    app: ${wayne-app}
  ports:
    - protocol: TCP
      targetPort: ${serviceTarPort}
      port: ${servicePort}
      nodePort: ${nodePort}  #固定外部访问端口。
      name: ${wayne-app}
  type: NodePort

k8s资源对象yaml参数说明

pod

apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中  
kind: Pod #指定创建资源的角色/类型  
metadata: #资源的元数据/属性  
  name: web04-pod #资源的名字,在同一个namespace中必须唯一  
  labels: #设定资源的标签,详情请见http://blog.csdn.net/liyingke112/article/details/77482384
    k8s-app: apache  
    version: v1  
    kubernetes.io/cluster-service: "true"  
  annotations:            #自定义注解列表  
    - name: String        #自定义注解名字  
spec: #specification of the resource content 指定该资源的内容  
  restartPolicy: Always #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器  
  nodeSelector:     #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1  
    zone: node1  
  containers:  
  - name: web04-pod #容器的名字  
    image: web:apache #容器使用的镜像地址  
    imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略,
                           # Always,每次都检查
                           # Never,每次都不检查(不管本地是否有)
                           # IfNotPresent,如果本地有就不检查,如果没有就拉取
    command: ['sh'] #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT  
    args: ["$(str)"] #启动容器的命令参数,对应Dockerfile中CMD参数  
    env: #指定容器中的环境变量  
    - name: str #变量的名字  
      value: "/etc/run.sh" #变量的值  
    resources: #资源管理,请求请见http://blog.csdn.net/liyingke112/article/details/77452630
      requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行  
        cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m)
        memory: 32Mi #内存使用量  
      limits: #资源限制  
        cpu: 0.5  
        memory: 32Mi  
    ports:  
    - containerPort: 80 #容器开发对外的端口
      name: httpd  #名称
      protocol: TCP  
    livenessProbe: #pod内容器健康检查的设置,详情请见http://blog.csdn.net/liyingke112/article/details/77531584
      httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常  
        path: / #URI地址  
        port: 80  
        #host: 127.0.0.1 #主机地址  
        scheme: HTTP  
      initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始  
      timeoutSeconds: 5 #检测的超时时间  
      periodSeconds: 15  #检查间隔时间  
      #也可以用这种方法  
      #exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常  
      #  command:  
      #    - cat  
      #    - /tmp/health  
      #也可以用这种方法  
      #tcpSocket: //通过tcpSocket检查健康   
      #  port: number   
    lifecycle: #生命周期管理  
      postStart: #容器运行之前运行的任务  
        exec:  
          command:  
            - 'sh'  
            - 'yum upgrade -y'  
      preStop: #容器关闭之前运行的任务  
        exec:  
          command: ['service httpd stop']  
    volumeMounts:  #详情请见http://blog.csdn.net/liyingke112/article/details/76577520
    - name: volume #挂载设备的名字,与volumes[*].name 需要对应    
      mountPath: /data #挂载到容器的某个路径下  
      readOnly: True  
  volumes: #定义一组挂载设备  
  - name: volume #定义一个挂载设备的名字  
    #meptyDir: {}  
    hostPath:  
      path: /opt #挂载设备类型为hostPath,路径为宿主机下的/opt,这里设备类型支持很多种