石头记

Docker、Kubernetes、CI/CD 等技术分享

Kubernetes 技术实践 -- 1.0 课程简介

为了让大家有更真实的体验,在这个培训课程中,我虚拟了一家互联网创业公司,而我们就是这家创业公司的技术人员,我们要从0开始为这家创业公司搭建IT环境,我们的所有服务都是容器化的,并运行在Kubernetes高可用集群上。我们的产品是由十一个微服务组成时尚购物网站,这十一个微服务由不同的语言写成,包括Java、Go、Python、Node.js和C#。我们通过CI/CD流水线驱动这些服务的开发迭代,并通过Istio进行服务治理,我们可以通过蓝绿部署、金丝雀部署、服务限流、熔断、链路追踪等技术来提升客户体验。我们为这家虚拟公司购买了域名(hipstershop.cn)和SSL证书,并完成了备案-_^,接下来,我们将一起完成这家公司的IT环境搭建。

能学到什么?

  • 搭建生产环境可用的Kubernetes集群 我会从Kubernetes的架构开始讲起,然后给大家介绍Kubernetes的主要组件以及一些基本概念,带大家一起部署一个生产环境可用的Kubernetes集群,安装Kubernetes常用的插件,接下来为大家讲解在生成环境如何去升级已有的Kubernetes集群,最后为大家介绍如何轻松管理多个Kubernetes集群;
  • Kubernetes编排基础 我会详细向大家讲解Pod基础与进阶,包括Pod的原理,API对象、Pod资源限制、Pod健康检查、生命周期管理、共享卷、Pod调度相关知识及生产环境建议及操作实践;Kubernetes常用资源对象,主要包括ReplicaSet、Deployment、StatefulSet、DeamonSet、Job等等;权限管理,包括ServiceAccount介绍、RBAC基于角色的访问控制等等;
  • Kubernetes容器持久化存储 我会向大家你讲解容器卷、PV、PVC、StorageClass以及本地化持久存储相关的知识,最后会带大家实践如何使用Ceph分布式存储和阿里云云盘作为Kubernetes容器持久化存储;
  • Kubernetes网络选型 我会向大家讲解容器跨主机网络、Kubernetes网络模型与CNI网络插件、常用的三层网络方案、以及Kubernetes服务发现,包括集群内部服务发现(Servcie)、集群外部服务访问(Ingress)、Headlss服务、CoreDNS以及4/7层服务发现实践;
  • Kubernetes包管理工具Helm 我会向大家讲解如何搭建私有Helm仓库、如何使用Helm仓库、如何编写Helm Charts,并带领大家为我们网站的微服务编写charts,并上传等到私有Helm仓库;
  • 部署企业级私有仓库 我会带领大家一起部署企业级代码管理平台Gitlab和容器私有仓库Harbor,学完这部分内容你将掌握如何通过容器化的方式部署Gitlab和Harbor,以及Gitlab和Harbor的基本使用;
  • CI/CD流水线 我会向大家讲解CI/CD流水线技术,并带大家认识几种CI/CD产品,介绍他们如何配置、使用,然后带大家使用CI/CD流水线将我们的网站部署到Kubernetes集群上,通过使用CI/CD流水线来提升我们的开发、测试、部署流程的自动化水平;
  • Kubernetes日志管理 我会向大家讲解Kubernetes日志处理的基本原理,以及如何通过EFK收集Kubernetes集群的日志及微服务产生的日志;
  • Kubernetes监控 我会向大家讲解Kubernetes监控原理,如何部署Prometheus,并使用它进行集群及应用监控,结合AlertManager实现故障告警;
  • 通过Istio实现服务治理 我会向大家讲解Istio是什么,他能做什么,以及如何使用Istio实现微服务服务的蓝绿部署、金丝雀部署,如何对服务进行限流、熔断和链路追踪。

学员收获

  • 从0-1全系统化学习Kubernetes,对调度系统、网络、存储、日志监控、CI/CD、服务治理等有全局了解,熟悉学习路线
  • 提高Kubernetes技术在企业落地效率,生产实践路上少走弯路
  • 熟悉Kubernetes生产最佳实践,避免踩坑
  • 专属QQ交流群,有任何问题老师会在群里给大家答疑
  • 代码开放,课程案例代码完全开发给你,你可以根据所学知识自行修改、优化

适合人群

  • 容器基础薄弱,但对容器生态技术有浓厚兴趣的小伙伴
  • 已经将容器用于生产环境,但是希望获得最佳实践,避免少走弯路的小伙伴
  • 对容器技术有一定了解和接触,期望系统化的深入理解的小伙伴
  • 容器技术爱好者、云计算从业者、运维工程师、容器项目开发工程师、架构师

技术储备要求

课程优势

  • 系统化:网上很多课程只讲某些章节,例如,安装、监控、某几个组件;缺少系统化学习,很难对各个模块相互之间联系进行深入了解。
  • 生产化:老师不仅仅分享实操、理论,更重要是分享在生产环境实践经验,以及运维过程中踩过的一些坑。
  • 新版本:我们选择了Kubernetes的新版本(1.14.x-1.15.x)为大家讲解。如果有新版本发布,我们还会向大家讲解如何进行Kubernetes版本升级。

Gitlab部署和基本使用

关于版本控制系统

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。在软件开发过程中,为了更好的管理软件的多个开发版本我们通常需要使用版本控制系统。常用的版本控制系统有:svn和git。

svn是集中化的版本控制系统, 只有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

SVN

git是分布式的版本控制系统, 每一个终端都是一个仓库,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。每一次的提取操作,实际上都是一次对代码仓库的完整备份。

git

私有镜像仓库Harbor部署、使用

Harbor介绍

Harbor是VMware公司开源的企业级Docker Registry项目,其目标是帮助用户迅速搭建一个企业级的Docker私有镜像仓库。Harbor基于官方Registry V2实现,提供了管理UI,基于角色的访问控制,LDAP集成、镜像复制、以及审计日志等企业用户需求的功能。

  • 图形化用户界面 用户可以通过浏览器来浏览、检索Docker镜像仓库,管理项目。
  • 基于角色的访问控制 按项目对Docker镜像进行组织,可以按项目对用户授权。
  • 镜像复制 镜像可以在多个Harbor实例之间复制。镜像复制可以很好的应对多云、多数据中心的场景。
  • LDAP支持 Harbor可以集成企业内部AD/LDAP,方便统一进行用户管理。
  • 审计管理 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。

另外,Harbor也可以对上传的镜像进行漏洞扫描和签名,新版的Harbor也加入Helm仓库的功能。

Harbor

使用Terraform在阿里云创建Kubernetes集群资源

概述

HashiCorp Terraform 是一个IT基础架构自动化编排工具,可以用代码来高效地预配和管理云基础架构。Terraform的命令行接口(CLI)提供一种简单机制,用于将配置文件部署到阿里云或其他任意支持的云上,并对其进行版本控制。

Terraform是一个高度可扩展的工具,通过Provider来支持新的基础架构。您可以使用Terraform来创建、修改、删除ECS、VPC、RDS、SLB等多种资源。

优势

  • 将基础结构部署到多个云 - Terraform适用于多云方案,将相类似的基础结构部署到阿里云、其他云提供商或者本地数据中心。开发人员能够使用相同的工具和相似的配置文件同时管理不同云提供商的资源。

  • 自动化管理基础结构 - Terraform能够创建配置文件的模板,以可重复、可预测的方式定义、预配和配置ECS资源,减少因人为因素导致的部署和管理错误。能够多次部署同一模板,创建相同的开发、测试和生产环境。

  • 基础架构即代码(Infrastructure as Code) - 可以用代码来管理维护资源。允许保存基础设施状态,从而使您能够跟踪对系统(基础设施即代码)中不同组件所做的更改,并与其他人共享这些配置 。

安装和配置Terraform

1、前往Terraform官网下载适用于您的操作系统的程序包。

在Kubernetes Ingress中使用Cert-Manager管理TLS证书

Kubernetes Ingresses 允许你灵活的将外部流量路由到集群内部。我们通过Ingress资源定义规则路由HTTP和HTTPS流量到Kubernetes Services。本文中我们通过cert-manager来管理TLS证书以加密HTTP流量。

部署后端服务

首先我们需要一个事例服务,部署配置文件(echo.yaml)如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
apiVersion: v1
kind: Service
metadata:
name: echo
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo
spec:
selector:
matchLabels:
app: echo
replicas: 2
template:
metadata:
labels:
app: echo
spec:
containers:
- name: echo1
image: hashicorp/http-echo
args:
- "-text=echo"
ports:
- containerPort: 5678

在这个配置文件中我们定义了一个服务叫做echo,它会将来自于80端口的TCP流量路由到标签为app: echo的Pods中的5678端口上。
我们定义了名为echo的Deployment,它用来管理打了app: echo标签的Pods。我们在Deployment中定义Pod的副本数为2,Pod启动的容器名为echo,使用的镜像为hashicorp/http-echo,我们给echo传递了text参数,值为echo,意思是我们在访问这个服务时,他向我们返回echo字符串。最后,我们打开了5678端口来监听用户请求。

Kubernetes 常用组件安装

视频课程地址:戳我开始学习

创建集群管理员账户(Cluster Admin)

编写配置文件 admin-role.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: admin
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile

执行命令创建账户

1
2
3
$ kubectl create -f admin-role.yaml
clusterrolebinding.rbac.authorization.k8s.io/admin created
serviceaccount/admin created

Kubernetes 集群升级

视频课程地址:戳我开始学习

控制平面升级

只有master节点需要执行如下操作,需要逐节点操作。将集群从当前的v1.14.3升级到v1.15.0。

列出可用的kubeadm软件包

1
$ yum list --showduplicates kubeadm --disableexcludes=kubernetes

安装kubeadm新版本软件包

1
$ yum install -y kubeadm-1.15.0-0 --disableexcludes=kubernetes

确认kubeadm为正确的版本

1
$ kubeadm version

查看升级计划

1
$ kubeadm upgrade plan

升级第一个控制节点

1
$ kubeadm upgrade apply v1.15.0

升级kubelet软件包

1
$ yum install -y kubelet-1.15.0-0 kubectl-1.15.0-0 --disableexcludes=kubernetes

重启kubelet服务

1
$ systemctl restart kubelet

高可用 Kubernetes 集群部署

视频课程地址:戳我开始学习

Kubernetes版本选择

Kubernetes 1.14是2019年发布的第一个正式版本。新版本有31个增强功能:其中有10个功能进入了生产可用状态,12个进入了beta版本,另外,增加了7个新功能。1.14版本的主题是可扩展性,支持更多Kubernetes工作负载,其中三个主要功能正式推出,以及一个重要的安全功能转向beta。与之前发布的Kubernetes版本相比,1.14版本中的更多功能逐渐稳定,这是大家期望的重要里程碑。

  • 生产级别的Windwos节点支持 Kubernetes1.14版本正式支持将Windows节点添加为工作节点,这意味着可以在生产环境使用Windows容器了,使庞大的Windows应用生态系统能够利用Kubernetes平台的强大功能了。
  • Kubectl的更新 新版本Kubectl可以使用声明性Resource Config来管理资源。kubectl的文档也从头进行编写,可参考文档
  • 持久化本地Volumes 本地SSD比远程磁盘能提供更好的性能。对性能要求比较高的数据库和分布式文件系统可以使用久化本地存储。

Docker Compose 搭建 PHP 开发环境

Docker PHP 可以快速构建基于 Docker 的 PHP 本地开发环境,此套 LNMP 环境同时支持 PHP 5 和 PHP 7。请克隆此项目使用:https://github.com/ist0ne/docker-php.git

启动服务

PHP/FPM 7.2/5.6、Nginx 1.12、Mysql 5.7、Redis 4.0、Memcached 1.5

目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
├── add_project.sh  新建项目脚本(Linux)
├── build 镜像构建目录
│   ├── memcached
│   │   └── Dockerfile
│   ├── mysql
│   │   └── Dockerfile
│   ├── nginx
│   │   └── Dockerfile
│   ├── php5
│   │   └── Dockerfile
│   ├── php7
│   │   └── Dockerfile
│   └── redis
│   └── Dockerfile
├── config 服务配置目录
│   ├── mysql
│   │   ├── backup
│   │   ├── config
│   │   │   └── mysql.cnf
│   │   ├── crontabs
│   │   └── docker-entrypoint-initdb.d 数据库初始化脚本目录
│   ├── nginx
│   │   ├── conf.d
│   │   │   ├── bar.example.com.conf
│   │   │   ├── foo.example.com.conf
│   │   │   └── example.com.conf.template
│   │   ├── fastcgi_mysql
│   │   ├── fastcgi_web
│   │   └── nginx.conf
│   ├── php5
│   │   ├── php.ini
│   │   └── php.ini-production
│   ├── php7
│   │   ├── php.ini
│   │   └── php.ini-production
│   └── redis
│   └── redis.conf
├── data 服务数据目录
│   ├── mysql 数据库数据存储目录
│   ├── nginx
│   │   ├── cache 应用缓存目录
│   │   └── data 应用数据目录
│   └── redis 缓存数据目录
├── docker-compose.yml 项目配置文件
├── logs 服务日志目录
│   ├── access Nginx访问日志目录
│   │   ├── bar.example.com
│   │   │   └── bar.example.com.log
│   │   └── foo.example.com
│   │   └── foo.example.com.log
│   ├── app 应用日志目录
│   │   ├── bar.example.com
│   │   └── foo.example.com
│   └── srv 服务日志目录
│   ├── memcached
│   ├── mysql
│   │   └── error.log
│   ├── nginx
│   │   └── nginx_error.log
│   ├── php5
│   │   └── php_errors.log
│   ├── php7
│   │   └── php_errors.log
│   └── redis
│   └── redis.log
├── README.md
└── webapps 应用代码目录
├── bar.example.com
│   └── htdocs
│   └── index.php
└── foo.example.com
└── htdocs
└── index.php

Docker Compose

简介

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。Compose 定位是 「定义和运行多个 Docker 容器化应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。

在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上缓存服务容器,已经后端的数据库服务容器。Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

Proudly powered by Hexo and Theme by Hacker
© 2019 ist0ne