美文网首页IT共论
使用CodeRun部署阿里云Kubernetes

使用CodeRun部署阿里云Kubernetes

作者: Hellwen | 来源:发表于2019-02-15 16:06 被阅读25次

    今天给大家介绍下我们的程序是如何部署到阿里云Kubernetes(托管版)的

    我们使用三种开发语言,分别是:js, python, golang.三种语言的部署有一些差别,但主要步骤都是一样的.我们今天先介绍下js(前端)的部署方式.

    核心的部署步骤如下:

    1. Git Clone
    2. 编译与Build镜像
    3. 部署到Kubernetes,通过Helm或者Deployment

    配置Kubernetes

    阿里云的Kuberntes支持三种模式:

    1. 自部署,阿里云仅提供一键部署但不提供管理和后续维护.要求用户水平较高
    2. 托管模式,阿里云提供一键部署,并负责管理Master节点.这种模式用户仅需要管理Node节点,基本不需要担心节点挂了,并且可以自行确定Node节点要求的性能.后续升级也可以交给阿里云负责
    3. serverless,终极模式,啥都不需要管理,只需要把镜像提交上去,并确定资源需求即可.不需要维护任何服务器.

    上面的三种模式我们选择了第2种,因为托管模式可以提供用户足够的自由度又不需要要求太高的管理水平.当然对于三种模式CodeRun都是支持的.我们来看下具体如何配置集群.

    获取KubeConfig

    不管哪种集群创建后都可以在控制台获取到KubeConfig配置,在阿里云控制台点击某个集群后可以看到下图KubeConfig

    aliyun_kubeconfig.png

    我们需要三个信息:

    1. 集群地址,阿里云为每个Kubernetes集群都分配了一个外部地址(如果是自部署模式好像需要自己配置)
    2. 证书,集群的访问证书
    3. Key,证书对应的Key,相当与密钥

    有了这三个信息我们就可以配置集群

    配置CodeRun的Kubernetes集群

    CodeRun控制台的整合->Kubernetes,点击右边的添加按钮选择证书模式,如图:

    kubernetes_conf2.png
    • 其中上图中的名称是你可以自行定义的名称,这个名称可以方便后续在Pipeline中使用,所以最好取一个好记的名称(这里使用myk8s).

    Pipeline可以参考

    添加仓库

    CodeRun控制台的Repo|仓库,点击添加仓库.在右侧选择代码仓库,(如果不是当前用户的Git仓库,参见添加Git配置),如下图:

    add_repo1.png

    选择Build类型

    add_repo2_type.png

    三种类型分别是:

    1. coderun.yml,使用代码仓库中的coderun.yml文件进行构建
    2. Dockerfile,使用代码仓库中的Dockerfile作为镜像的构建
    3. 模板,和上述的Dockerfile类似,只是使用CodeRun内置的各语言Dockerfile模板

    我们这里选择使用模板创建,选择node语言.Dockerfile内容预览如下:

    FROM node:8.0-alpine AS builder
    
    WORKDIR /app
    
    COPY package.json /app
    
    # Creating tar of productions dependencies
    RUN npm install --production && cp -rp ./node_modules /tmp/node_modules
    
    # Installing all dependencies
    RUN npm install
    
    # Copying application code
    COPY . /app
    
    # Running tests
    RUN npm test
    
    FROM node AS runner
    
    EXPOSE 3000
    WORKDIR /app
    
    # Adding production dependencies to image
    COPY --from=builder /tmp/node_modules /app/node_modules
    
    # Copying application code
    COPY . /app
    
    CMD npm start
    

    上述模板是采用Dockerfile的多阶段模式进行处理的,分成两大部分:

    1. 第一部分是安装依赖,然后进行npm test
    2. 第二部分是复制第一部分的node_models,并启动npm start

    因为我们的代码中没有测试所以可以注释掉npm test这段,另外我们代码使用vue-cli3所以npm start修改成npm run serve
    最后如下:

    FROM node:8.0-alpine AS builder
    
    WORKDIR /app
    
    COPY package.json /app
    
    # Creating tar of productions dependencies
    RUN npm install && cp -rp ./node_modules /tmp/node_modules
    
    FROM node AS runner
    
    EXPOSE 3000
    WORKDIR /app
    
    # Adding production dependencies to image
    COPY --from=builder /tmp/node_modules /app/node_modules
    
    # Copying application code
    COPY . /app
    
    CMD npm run serve
    

    点击创建后,我们可以看到添加好的仓库:

    repo_list.png

    切换到Yaml

    点击coderuntop/startup后我们可以看到Pipeline页面,如图:

    repo_pipeline.png

    因为我比较习惯使用Yaml配置,所以点击上图右边的Yaml选项,并且确定进行覆盖后可以看到Yaml配置:

    repo_pipeline_yml.png

    配置如下:

    steps:
      docker:
        image: crun/docker
        registry_name: coderun
        repo_name: hellwen/startup
        dockerfile_content: |
          FROM node:8.0-alpine AS builder
    
          WORKDIR /app
    
          COPY package.json /app
    
          # Creating tar of productions dependencies
          RUN npm install && cp -rp ./node_modules /tmp/node_modules
    
          FROM node AS runner
    
          EXPOSE 8080
          WORKDIR /app
    
          # Adding production dependencies to image
          COPY --from=builder /tmp/node_modules /app/node_modules
    
          # Copying application code
          COPY . /app
    
          CMD npm run serve
        context: .
        tags: latest
    

    其中,repo_name配置的名称需要进行修改,如上已经修改成:coderuntop/startup修改成用户名/项目名格式,其中用户名就是
    你当前用户的名称,可以通过控制台的右上角看到.

    配置好我们就可以进行下测试了,选择仓库的分支,因为这个项目我把前端代码写在node分支中,所以这里直接点击node分支的Build按钮

    repo_branch.png

    点击后在Build页面可以看到正在跑的Build任务:

    repo_build_running.png

    Build右边的绿色打勾图标说明这次Build成功,我们的Dockerfile是正常的.

    点击进入某个Build任务后可以看到对应的Build日志:

    repo_build_log.png

    增加部署步骤

    增加的部署配置如下:

    deploy:
      image: crun/kube
      cluster_name: myk8s
      namespace: default
      template_content: |
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: startup-node
          spec:
            replicas: 1
            selector:
              matchLabels:
                app: startup-node
            template:
              metadata:
                labels:
                  app: startup-node
              spec:
                containers:
                - name: startup-node
                  image: {{CR_IMAGE}}
    
    • 其中crun/kube是官方提供的k8s插件
    • cluster_name这里指定的是上面配置的k8s集群,我们命名为:myk8s
    • namespace指定k8s集群的命名空间
    • template_content指定k8s能有效识别的yaml配置(可以包含:servicedeployment等)
    • image中我们使用了一个变量{{CR_IMAGE}}这个变量会自动从crun/docker获取到build后的完整镜像地址

    增加部署步骤后我们再Build一次,我们可以看到我们的部署增加了一个Log

    repo_build_log2.png

    部署后的k8s效果:

    $ kubectl get deployment startup-node
    NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    startup-node   1         1         1            1           3h
    
    $ kubectl get deployment startup-node -o=custom-columns=NAME:.metadata.name,IMAGE:.spec.template.spec.containers[0].image,STATUS:.status.availableReplicas
    NAME           IMAGE                               STATUS
    startup-node   r.crun.top/hellwen/startup:latest   1
    

    要使用kubectl命令连接阿里云需要把前面的KubeConfig配置到当前Shell.kube/config文件中,至于如何配置可以参考kubernetes.io
    上面的结果我们可以看到k8s上的运行镜像被替换成r.crun.top/hellwen/startup:latest这样我们就省去了填写镜像地址的麻烦.

    到这里我们的部署就完成了.比起自己搭建Jenkins是不是方便不少.

    相关文章

      网友评论

        本文标题:使用CodeRun部署阿里云Kubernetes

        本文链接:https://www.haomeiwen.com/subject/jchmeqtx.html