├── .gitignore ├── 12-factor-app.md ├── Q&A.md ├── Q&A ├── ru-he-jian-kong-pod-zhuang-tai.md ├── ru-he-zhi-xing-crontab.md └── ru-he-zi-dong-kuo-rong.md ├── README.md ├── SUMMARY.md ├── an-li ├── dockerfile.md ├── gemfile.md ├── gitlab-ciyml.md └── kube-deploymentyml.md ├── bu-shu-di-yi-ge-xiang-mu.md ├── bu-shu-di-yi-ge-xiang-mu ├── cronjob.md ├── job.md ├── scaling.md └── service.md ├── da-jian-kubernetes-ji-qun.md ├── docker ├── build-image.md ├── install.md ├── registry.md └── speed-up-build.md ├── gitalb ├── container-registry.md ├── gitlab.md └── runner.md ├── gitlab.md ├── introduction.md ├── kubernetes.md ├── kubernetes ├── bu-shu-dashboard.md ├── bu-shu-heapster.md ├── bu-shu-master.md ├── bu-shu-slave.md ├── bu-shu-slave │ ├── kube-let.md │ └── kube-proxy.md └── flannel.md ├── shen-ru-yuan-li.md ├── shen-ru-yuan-li ├── etcd.md ├── flannel.md └── iptable-load-balance.md ├── zong-lan └── asdf.md └── zuo-zhe.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Node rules: 2 | ## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 3 | .grunt 4 | 5 | ## Dependency directory 6 | ## Commenting this out is preferred by some people, see 7 | ## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git 8 | node_modules 9 | 10 | # Book build output 11 | _book 12 | 13 | # eBook build output 14 | *.epub 15 | *.mobi 16 | *.pdf -------------------------------------------------------------------------------- /12-factor-app.md: -------------------------------------------------------------------------------- 1 | THE TWELVE-FACTOR APP 2 | ========= 3 | 4 | [THE TWELVE-FACTOR APP](https://12factor.net/)一文提供了一套方法论,内容可以分成两个部分: 5 | 6 | 1. 一个最大化可移植性、可持续交付、易扩展的**项目源代码**应该符合哪些规则。 7 | 2. 应该如何部署项目代码来处理请求、处理并发、处理日志以及管理(启动、终止、监视)进程。 8 | 9 | 上述的第二条,我会在之后的章节中提到,这些也正是kubernetes解决的问题。 10 | 11 | 这里我们着重说说一点:一个最大化可移植性、可持续交付、易扩容的**项目源代码**应该符合哪些规则。重点有两个:**如何配置**,**如何处理依赖**。 12 | 13 | ### 下面先举一些反面例子: 14 | 15 | ##### 配置冗余 16 | 曾经部署过一份外包公司产出的代码,上线前需要改一个微信分享地址的url的host,测试环境与正式环境的host不同,部署一个环境,单是这一个配置就需要修改6个文件的8个地方。部署一个环境尚且费事,更不用提多环境部署。 17 | ##### 有隐式依赖 18 | 语言级别的库依赖一般会有比较好的解决方案,例如ruby的bundler,python的pip。隐式依赖的问题一般出现在系统级别的库和软件。例如在项目中需要操作图片,依赖机器安装imagemagick,但是imagemagick并没有写在项目的依赖中,而是需要部署的机器事先安装好。当把项目部署在新机器上的时候,很容易漏掉安装imagemagic的步骤,导致服务错误。快速的水平扩展无从谈起,因为需要了解项目到底有哪些隐藏的依赖没有安装。 19 | 20 | ### 最佳实践: 21 | ##### 配置 22 | 23 | 例如数据库连接地址、Redis地址、微信公众号appid与secret、用来加密cookie的SECRET_KEY_BASE、微信分享url等任何需要控制项目行为的配置。 24 | 25 | - 配置和代码严格分离。不同环境的部署使用同样的代码,不同的配置。 26 | - 使用环境变量作为配置。环境变量可以非常方便地在不同的部署间做修改,却不动一行代码,环境变量与语言和系统无关。 27 | - 环境变量的粒度要足够小,且相对独立。 28 | 29 | ##### 依赖 30 | - 使用包管理器处理语言级别的库。 31 | - 使用容器技术来确保项目的系统级别的类库依赖完整。 32 | 33 | 依赖处理发生在项目构建时,配置发生在项目运行时。所以我们接下来就要进入Docker相关的章节,来讨论如何构建项目,处理依赖;以及项目构建完成,将要运行项目时,如何注入配置。 -------------------------------------------------------------------------------- /Q&A.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/Q&A.md -------------------------------------------------------------------------------- /Q&A/ru-he-jian-kong-pod-zhuang-tai.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/Q&A/ru-he-jian-kong-pod-zhuang-tai.md -------------------------------------------------------------------------------- /Q&A/ru-he-zhi-xing-crontab.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/Q&A/ru-he-zhi-xing-crontab.md -------------------------------------------------------------------------------- /Q&A/ru-he-zi-dong-kuo-rong.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/Q&A/ru-he-zi-dong-kuo-rong.md -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Gitlab-ci、kubernetes最佳实践 2 | ======= 3 | 4 | 有一篇很出名的文章:[It's the future](https://circleci.com/blog/its-the-future/),文章大意是一个boss想要部署一个简单的CRUL rails项目,他咨询一位专家,专家极力反对他将项目部署在heroku上,并给出的建议是将他的简单的app拆分成12个微服务\(microservices\),运行在docker container中,彼此通过api调用。然后将这些微服务部署在一个由8台机器组成的kubernetes集群中。 5 | 6 | 初看这篇文章的时候,我并没有理解这种部署的优势。但随着之后[课程格子](https://www.kechenggezi.com)部署方式改进,我重新回顾了这篇文章,发现最终的解决方案和文中提到的如出一辙。 7 | 8 | # 导读 9 | 10 | 如果你想要快速搭建一个gitlab + kubernetes + docker环境,走通整个部署流程,请阅读1-5章。 11 | 如果你想要更深入的了解整个系统,请阅读6-10章。 12 | 13 | kubernetes 1.5.4 14 | docker 1.13 15 | 16 | 希望你能 enjoy Gitlab CI + Kubernetes 之旅! 17 | 18 | [开始看书](https://davidqhr.gitbooks.io/gitlab-ci-kubernetes/) 19 | 20 | 本书源码在 GitHub 上,[欢迎参与写书](https://github.com/davidqhr/gitlab-ci-kubernetes) -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | 3 | * [引言](README.md) 4 | * [开始之前](introduction.md) 5 | * [12 Factor App](12-factor-app.md) 6 | * [Docker](docker.md) 7 | * [安装docker](docker/install.md) 8 | * [创建项目image](docker/build-image.md) 9 | * [加快build速度](docker/speed-up-build.md) 10 | * [运行项目image](docker/run-image.md) 11 | * [搭建docker registry](docker/registry.md) 12 | * [Gitlab CI/CD](gitlab.md) 13 | * [搭建Gitlab](gitlab/gitlab.md) 14 | * [配置Gitlab Container Registry](gitlab/container-registry.md) 15 | * [配置Gitlab Runner](gitlab/runner.md) 16 | * [kubernetes](kubernetes.md) 17 | * [配置etcd](kubernetes/etcd.md) 18 | * [配置flannel](kubernetes/flannel.md) 19 | * [配置docker](kubernetes/docker.md) 20 | * [部署master](kubernetes/bu-shu-master.md) 21 | * kube-apiserver 22 | * kube-controller-manager 23 | * kube-scheduler 24 | * kube-dns 25 | * [部署minions](kubernetes/minion.md) 26 | * [kubelet](kubernetes/bu-shu-slave/kube-let.md) 27 | * [kube-proxy](kubernetes/bu-shu-slave/kube-proxy.md) 28 | * [部署dashboard](kubernetes/bu-shu-dashboard.md) 29 | * [部署heapster](kubernetes/bu-shu-heapster.md) 30 | * [使用kubernetes集群运行项目](bu-shu-di-yi-ge-xiang-mu.md) 31 | * deploy 32 | * rolling update 33 | * [scaling](bu-shu-di-yi-ge-xiang-mu/scaling.md) 34 | * [service](bu-shu-di-yi-ge-xiang-mu/service.md) 35 | * [ruby项目案例](an-li.md) 36 | * [.gitlab-ci.yml](an-li/gitlab-ciyml.md) 37 | * [Gemfile](an-li/gemfile.md) 38 | * [Dockerfile](an-li/dockerfile.md) 39 | * [kube-deployment.yml](an-li/kube-deploymentyml.md) 40 | * [深入原理](shen-ru-yuan-li.md) 41 | * linux namespace 42 | * docker fs 43 | * [etcd原理](shen-ru-yuan-li/etcd.md) 44 | * [kube-proxy如何用iptables实现service的load balance](shen-ru-yuan-li/iptable-load-balance.md) 45 | * [如何通过flannel实现pod之间的通信](shen-ru-yuan-li/flannel.md) 46 | * [nodejs项目案例](nodejsxiang-mu-an-li.md) 47 | * [Dockerfile](dockerfile.md) 48 | * [Q&A](Q&A.md) 49 | * [如何监控pod状态](Q&A/ru-he-jian-kong-pod-zhuang-tai.md) 50 | 51 | -------------------------------------------------------------------------------- /an-li/dockerfile.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/an-li/dockerfile.md -------------------------------------------------------------------------------- /an-li/gemfile.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/an-li/gemfile.md -------------------------------------------------------------------------------- /an-li/gitlab-ciyml.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/an-li/gitlab-ciyml.md -------------------------------------------------------------------------------- /an-li/kube-deploymentyml.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/an-li/kube-deploymentyml.md -------------------------------------------------------------------------------- /bu-shu-di-yi-ge-xiang-mu.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/bu-shu-di-yi-ge-xiang-mu.md -------------------------------------------------------------------------------- /bu-shu-di-yi-ge-xiang-mu/cronjob.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/bu-shu-di-yi-ge-xiang-mu/cronjob.md -------------------------------------------------------------------------------- /bu-shu-di-yi-ge-xiang-mu/job.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/bu-shu-di-yi-ge-xiang-mu/job.md -------------------------------------------------------------------------------- /bu-shu-di-yi-ge-xiang-mu/scaling.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/bu-shu-di-yi-ge-xiang-mu/scaling.md -------------------------------------------------------------------------------- /bu-shu-di-yi-ge-xiang-mu/service.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/bu-shu-di-yi-ge-xiang-mu/service.md -------------------------------------------------------------------------------- /da-jian-kubernetes-ji-qun.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/da-jian-kubernetes-ji-qun.md -------------------------------------------------------------------------------- /docker/build-image.md: -------------------------------------------------------------------------------- 1 | 创建项目镜像 2 | ======== 3 | 4 | 创建项目镜像就是针对这个项目写好一份Dockerfile,安装程序运行所需要的**所有依赖**,最后通过`docker build --pull -t some_name:some_tag .`命令构建打包成为一个image。最终项目源码、依赖都存储在image中,项目的依赖有了绝对的保证。 5 | 6 | 7 | 课程格子的以Ruby项目居多,针对一般的Ruby项目,会有如下的Dockerfile。其他语言的项目原理一样,Dockerfile大同小异。 8 | 9 | ```bash 10 | FROM ruby:2.3 # ruby的image的源image一般为Debain 11 | 12 | # 设置时区 13 | RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone 14 | 15 | # 拷贝项目 16 | ADD / /app/ 17 | WORKDIR /app 18 | 19 | # 如果项目中存在私有依赖,需要配置ssh_key 20 | RUN mkdir -p /root/.ssh && \ 21 | echo "StrictHostKeyChecking no" > /root/.ssh/config && \ 22 | chmod -R 700 /root/.ssh 23 | ADD path/to/id_rsa /root/.ssh/ 24 | 25 | # 安装依赖,这里安装了production与test两个环境的依赖,则这个image可以用来运行测试,也可以用来线上部署 26 | RUN bundle install --without development 27 | 28 | # 处于安全考虑,可以在此移除 ssh_key 29 | RUN rm /root/.ssh/id_rsa 30 | 31 | # 这里CMD与ENTRYPOINT根据需要自行配置 32 | CMD puma -p 80 -t 16:64 33 | ``` 34 | 35 | 而复杂一些的项目,则可能需要提前安装一些系统库,根据image的系统,自行配置国内的源,来加速一些库的安装速度,以Debain 8为例 36 | 37 | ```bash 38 | # 设置aliyun的debine源 39 | RUN echo "deb http://mirrors.aliyun.com/debian/ jessie main non-free contrib\n\ 40 | deb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib\n\ 41 | deb-src http://mirrors.aliyun.com/debian/ jessie main non-free contrib\n\ 42 | deb-src http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib"\ 43 | > /etc/apt/sources.list 44 | 45 | # 安装系统依赖 46 | RUN apt-get update && \ 47 | apt-get install -y xxxx xxxx xxxx && \ 48 | apt-get clean 49 | ``` 50 | 51 | 更简单安装依赖的方式是直接下载可运行的二进制程序,例如wkhtmltopdf,这样这个容易就可以轻易的使用wkhtmlto*命令导出pdf或图片了。一定要记得删除压缩的tar文件,这样可以使最终生成的docker image占用更少的磁盘空间 52 | 53 | ```bash 54 | RUN wget https://downloads.wkhtmltopdf.org/0.12/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz && \ 55 | tar xvf wkhtmltox-0.12.4_linux-generic-amd64.tar.xz && \ 56 | rm wkhtmltox-0.12.4_linux-generic-amd64.tar.xz 57 | 58 | ENV PATH $PATH:/wkhtmltox/bin 59 | ``` 60 | 61 | ### 问题出现 62 | 63 | 解决了项目的依赖,还没来得及高兴,就遇到了一个问题:一个项目构建Docker Image时间比较长。一个最简单的ruby项目,从头build一遍,也要花上6-10分钟左右。因为有下载源镜像、更新apt-get,安装gem等步骤,均比较耗时。 64 | 65 | 而且在我的计划中,项目的每个push到gitlab的commit都需要构建image并测试,那么这么慢的build image时间是不能接受的。 66 | 67 | 下一节我就针对国内的环境,说说为了提升build速度,我都做了哪些措施。 68 | 69 | -------------------------------------------------------------------------------- /docker/install.md: -------------------------------------------------------------------------------- 1 | # 安装Docker 2 | docker的[官方文档](https://docs.docker.com/engine/installation/)已经介绍的很详细,根据自己的平台选择即可。 3 | 4 | 安装成功之后,记得`sudo docker run hello-world`测试docker是否安装正确。 -------------------------------------------------------------------------------- /docker/registry.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/docker/registry.md -------------------------------------------------------------------------------- /docker/speed-up-build.md: -------------------------------------------------------------------------------- 1 | 加快build速度 2 | =========== 3 | 4 | 这一节的内容不是必须的,如果你认为build image的速度合理,可以接受,不会影响团队的开发、部署节奏,请直接跳过本节。 5 | 6 | 上一节提到,build一个image可能需要以下步骤。 7 | 8 | 1. 下载基础镜像(ruby:2.3) 9 | 2. 安装系统库 10 | 3. 安装语言库 11 | 12 | 接下来我就针对这些步骤,说说怎么加快build速度。 13 | 14 | ### 搭建私有registry,缓存常用的基础镜像 15 | 例如项目中常用到的基础镜像有 16 | 17 | - ubuntu:14.04 18 | - ruby:2.3 19 | - elixir:1.3 20 | - nodejs:7 21 | 22 | 当Dockerfile以这些镜像为基础的时候,执行`docker build`时,dockerd会去docker的官方registry下载基础镜像,在国内的网络环境条件下,速度慢不说,还经常被重置连接。 23 | 24 | 所以我搭建了一个私有registry来存储常用的image。搭建registry的细节,我将在后边的章节提到。先来看看,假如已经有了一个可用的私有registry以后,我们如何创建一个基础镜像的mirror。 25 | 26 | ```bash 27 | # 从官方下载 28 | docker pull ruby:2.3 29 | 30 | # 打tag 31 | docker tag ruby:2.3 registry.example.com:5555/ruby:2.3 32 | 33 | # 登录私有registry 34 | docker login registry.example.com:5555 -u username -p 35 | 36 | # 将基础镜像上传 37 | docker push registry.example.com:5555/ruby:2.3 38 | ``` 39 | 40 | 这样之后,在Dockerfile中,我们就可以这么写: 41 | 42 | ```bash 43 | FROM registry.example.com:5555/ruby:2.3 44 | RUN ... 45 | RUN ... 46 | ``` 47 | 48 | 把私有registry的机器与build image的机器放在同一个局域网内,那么下载一个镜像的速度就会很快,这样优化之后,通常可以在几十秒内搞定镜像下载的这个步骤。 49 | 50 | 只不过需要注意的是,需要确保build image的时候要有registry的权限。具体权限的操作细节,会在以后的gitlab ci章节中提到。 51 | 52 | ### 为项目创建创建特有基础镜像,缓存系统依赖 53 | 54 | 虽然上一步骤提到了缓存基础镜像,但是安装系统依赖的步骤依然很耗时间,比如`apt-get update && apt-get install -y lib-aaa lib-bbb`。这些依赖都是每个项目特有的,并且不会轻易变的。如果每次build的时候,都重复执行这些步骤,那耗时是肯定的。 55 | 56 | 解决办法和容易:**为项目构建一个特有的基础镜像**。 57 | 58 | 比如一个Elixir项目,使用phoenix作为框架,需要nodejs和elixir环境,并且需要使用wkhtmltopdf来导出内容,并且需要安装字体。最初项目的完整的Dockerfile如下: 59 | 60 | ```bash 61 | FROM elixir:1.3 62 | 63 | # 安装系统依赖、配置系统环境 64 | 65 | ENV SASS_BINARY_SITE https://npm.taobao.org/mirrors/node-sass/ 66 | RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone 67 | 68 | RUN wget https://npm.taobao.org/mirrors/node/v7.7.3/node-v7.7.3-linux-x64.tar.xz 2>&1 1> /dev/null && \ 69 | tar -C /usr/local/ --strip-components 1 -xvf /node-v7.7.3-linux-x64.tar.xz 2>&1 1> /dev/null && \ 70 | rm /node-v7.7.3-linux-x64.tar.xz 71 | 72 | RUN mkdir -p /root/.ssh && \ 73 | echo "StrictHostKeyChecking no" > /root/.ssh/config && \ 74 | chmod -R 700 /root/.ssh 75 | 76 | RUN wget https://downloads.wkhtmltopdf.org/0.12/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz && \ 77 | tar xvf wkhtmltox-0.12.4_linux-generic-amd64.tar.xz && \ 78 | rm wkhtmltox-0.12.4_linux-generic-amd64.tar.xz 79 | 80 | ENV PATH $PATH:/wkhtmltox/bin 81 | 82 | COPY /fonts/* /usr/share/fonts/truetype/cn/ 83 | RUN fc-cache 84 | 85 | # 项目相关 86 | 87 | ADD / /app 88 | WORKDIR /app 89 | 90 | ENV MIX_ENV prod 91 | ENV HEX_UNSAFE_REGISTRY 1 92 | 93 | RUN mix local.hex --force && \ 94 | mix hex.config mirror_url https://hexpm.upyun.com && \ 95 | mix hex.config repo_url https://hexpm.upyun.com && \ 96 | mix deps.get && \ 97 | mix deps.compile && \ 98 | mix compile 99 | 100 | RUN npm install --registry=https://registry.npm.taobao.org --disturl=https://npm.taobao.org/dist 101 | 102 | RUN node_modules/.bin/brunch build --production && \ 103 | mix phoenix.digest 104 | ``` 105 | 106 | 首先,我们先创建一个项目特有的基础镜像,命名为`registry.classbox.com/elixir-node-pdf:1.0`,Dockerfile如下 107 | 108 | ``` 109 | FROM elixir:1.3 110 | 111 | # 安装系统依赖、配置系统环境 112 | 113 | ENV SASS_BINARY_SITE https://npm.taobao.org/mirrors/node-sass/ 114 | RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone 115 | 116 | RUN wget https://npm.taobao.org/mirrors/node/v7.7.3/node-v7.7.3-linux-x64.tar.xz 2>&1 1> /dev/null && \ 117 | tar -C /usr/local/ --strip-components 1 -xvf /node-v7.7.3-linux-x64.tar.xz 2>&1 1> /dev/null && \ 118 | rm /node-v7.7.3-linux-x64.tar.xz 119 | 120 | RUN mkdir -p /root/.ssh && \ 121 | echo "StrictHostKeyChecking no" > /root/.ssh/config && \ 122 | chmod -R 700 /root/.ssh 123 | 124 | RUN wget https://downloads.wkhtmltopdf.org/0.12/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz && \ 125 | tar xvf wkhtmltox-0.12.4_linux-generic-amd64.tar.xz && \ 126 | rm wkhtmltox-0.12.4_linux-generic-amd64.tar.xz 127 | 128 | ENV PATH $PATH:/wkhtmltox/bin 129 | 130 | COPY /fonts/* /usr/share/fonts/truetype/cn/ 131 | RUN fc-cache 132 | ``` 133 | 134 | build 并且上传到私有仓库 135 | 136 | ```bash 137 | docker build -t registry.classbox.com/elixir-node-pdf:1.0 . 138 | docker login registry.classbox.com -u username -p 139 | docker push registry.classbox.com/elixir-node-pdf:1.0 140 | ``` 141 | 142 | 修改项目的Dockerfile为 143 | 144 | ```bash 145 | FROM registry.classbox.com/elixir-node-pdf:1.0 146 | 147 | ADD / /app 148 | WORKDIR /app 149 | 150 | ENV MIX_ENV prod 151 | ENV HEX_UNSAFE_REGISTRY 1 152 | 153 | RUN mix local.hex --force && \ 154 | mix hex.config mirror_url https://hexpm.upyun.com && \ 155 | mix hex.config repo_url https://hexpm.upyun.com && \ 156 | mix deps.get && \ 157 | mix deps.compile && \ 158 | mix compile 159 | 160 | RUN npm install --registry=https://registry.npm.taobao.org --disturl=https://npm.taobao.org/dist 161 | 162 | RUN node_modules/.bin/brunch build --production && \ 163 | mix phoenix.digest 164 | ``` 165 | 166 | 这样一来,安装系统依赖的时间就全都省下来了,每次build时,下载的特有基础镜像就已经包含了所有的系统依赖。如果将来需要修改项目的系统依赖,只需要修改一下特有的基础镜像即可。 167 | 168 | 169 | 170 | ### 使用mirror,加速语言依赖的安装 171 | 172 | 其实在本节的代码中已经存在了一些使用mirror来加速依赖安装的例子 173 | 174 | - apt-get 使用阿里源 175 | - npm 使用淘宝源 176 | - gems 使用ruby-china源 177 | - hex 使用upyun源 178 | 179 | 这里我还针对ruby gems搭建了一个私有的mirror,进一步的提升下载gem的速度。使用的是[https://github.com/bundler/gemstash](https://github.com/bundler/gemstash)。在bundle之前,将source换成私有mirror的地址。 180 | 181 | ### 总结 182 | 183 | 优化的手段其实总结起来就是:缓存。经过这些步骤优化过后,一个项目的构建时间能缩短60-70%。 -------------------------------------------------------------------------------- /gitalb/container-registry.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/gitalb/container-registry.md -------------------------------------------------------------------------------- /gitalb/gitlab.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/gitalb/gitlab.md -------------------------------------------------------------------------------- /gitalb/runner.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/gitalb/runner.md -------------------------------------------------------------------------------- /gitlab.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/gitlab.md -------------------------------------------------------------------------------- /introduction.md: -------------------------------------------------------------------------------- 1 | #### 最早课程格子的后端组织 2 | 3 | * 一个巨大rails项目,承载了app端的所有版本的api、很多h5页面、以及运营同学的运营工具 4 | * 电商运营后台 5 | * 教务爬虫系统 6 | * 后端存储服务,如MySQL,PG,Redis,ElasticSearch 7 | 8 | 项目以ruby为主,部署使用capistrano。 9 | 10 | #### 项目部署的水平扩容 11 | 12 | * 在这台机器上添加负责部署的工程师public key 13 | * 为项目添加这台机器的public key作为deploy key 14 | * 配置ruby环境 15 | * 拷贝项目的production配置文件 16 | * 配置nginx作为反向代理,serve静态文件 17 | * 针对机器硬件设置web服务器(puma)的进程数、线程数 18 | * 讲机器端口加入Load Balance 19 | 20 | 这个过程很枯燥也很机械,一个熟练的后端工程师,能在半小时内搞定这些事情。在项目少,机器数量不多的时候,这种方式可以接受。 21 | 22 | #### 随着机器增多,项目增多,以及工程师增多,问题出现: 23 | 24 | * 部署一个项目时\(多环境:sandbox, staging, production\),耗费很多时间,由于项目的增多,这个问题愈发严重 25 | * 服务器的权限管理混乱 26 | * 因为手动分配的计算资源不合理,导致集群部分机器闲的要死,部分机器忙的要命 27 | * 需要编写脚本监视管理进程(god) 28 | * 自动化程度低 29 | * 开始使用更多的语言和框架,部署方式分散,对工程师要求越来越高 30 | 31 | #### 开始探索新的部署方案,期望能达到: 32 | 33 | * 自动化部署 34 | * 简单的多环境部署 \(sandbox,staging,production\) 35 | * 进程监控、出错重启 36 | * 部署水平扩容简单\(scaling\) 37 | * 部署期间服务可用\(rolling update\) 38 | * 部署出现问题时,能快速回滚\(rollback\) 39 | * 统一多种语言、框架的部署方式 40 | * 最小程度开放服务器权限 41 | 42 | #### 最终采取的方案 43 | 44 | gitlab + docker + kubernetes 45 | 46 | #### 目前的部署流程 47 | 48 | 目前格子的开发到部署到上线的流程如下 49 | 50 | 1. 新建branch开发需求 51 | 2. commit 52 | 3. push branch 53 | * gitlab ci 构建此branch的image 54 | * gitlab ci 将构建好的image提交到registry 55 | * gitlab ci 在这个image的基础上运行测试 56 | * gitlab ci 将这个image发布到sandbox环境中 57 | 4. 创建merge request 58 | 5. Code Review 59 | 6. Merge Branch To Master 60 | * gitlab ci 构建master的image 61 | * gitlab ci 将构建好的image提交到registry 62 | * gitlab ci 在这个image的基础上运行测试 63 | * gitlab ci 将这个image发布到staging环境 64 | 7. 确认staging环境代码工作正常 65 | 8. 手动点击gitlab pipeline中的按钮,一键部署到production 66 | 67 | 目前的部署方案,解决了上文提出的问题,也满足了上文提到的对部署方式的预期。接下来的部分,我会向大家来介绍如何实现以上的部署方式。在这之前,我需要了解一下[THE TWELVE-FACTOR APP](12-factor-app.md)。 68 | 69 | -------------------------------------------------------------------------------- /kubernetes.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/kubernetes.md -------------------------------------------------------------------------------- /kubernetes/bu-shu-dashboard.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/kubernetes/bu-shu-dashboard.md -------------------------------------------------------------------------------- /kubernetes/bu-shu-heapster.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/kubernetes/bu-shu-heapster.md -------------------------------------------------------------------------------- /kubernetes/bu-shu-master.md: -------------------------------------------------------------------------------- 1 | kube-apiserver 2 | kube-controller-manager 3 | kube-schedule 4 | kube-dns -------------------------------------------------------------------------------- /kubernetes/bu-shu-slave.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/kubernetes/bu-shu-slave.md -------------------------------------------------------------------------------- /kubernetes/bu-shu-slave/kube-let.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/kubernetes/bu-shu-slave/kube-let.md -------------------------------------------------------------------------------- /kubernetes/bu-shu-slave/kube-proxy.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/kubernetes/bu-shu-slave/kube-proxy.md -------------------------------------------------------------------------------- /kubernetes/flannel.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/kubernetes/flannel.md -------------------------------------------------------------------------------- /shen-ru-yuan-li.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/shen-ru-yuan-li.md -------------------------------------------------------------------------------- /shen-ru-yuan-li/etcd.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/shen-ru-yuan-li/etcd.md -------------------------------------------------------------------------------- /shen-ru-yuan-li/flannel.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/shen-ru-yuan-li/flannel.md -------------------------------------------------------------------------------- /shen-ru-yuan-li/iptable-load-balance.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidqhr/gitlab-ci-kubernetes/dfa116cbce2b4ef33444c22a07e44b444d896f8f/shen-ru-yuan-li/iptable-load-balance.md -------------------------------------------------------------------------------- /zong-lan/asdf.md: -------------------------------------------------------------------------------- 1 | # GitLab -------------------------------------------------------------------------------- /zuo-zhe.md: -------------------------------------------------------------------------------- 1 | # 关于我 2 | 3 | 我是秦鸿儒,英文名david。课程格子架构师。 4 | 5 | 6 | 7 | --------------------------------------------------------------------------------