Kubernetes
GCP原生K8S工作坊
这是一个简单有趣的Kubernetes工作坊。专为喜欢探索、喜欢动手和独立思考的人而准备。
我们会有一个简单的Web应用程序,和一个数据库,应用程序会写入数据库一些数据。我们的目标是用K8S将这些服务按产品环境的要求,以高可用,分布式的方式部署到不同的数据中心。
我们不需要提前刻意去学习Docker、GCP、K8S等相关知识,因为我们相信,你一定可以在规定的时间里,通过不断学习,达到目标。也可以在这个过程中,让我们多加一些元素,让这个过程变得更加有趣 - 鼓励大家加入DevOps/自动化/快速反馈的思考和实践。
我们的工作坊将会涉及到的知识点:
Docker - 容器化
Kubernetes
Google Cloud Platform
Infrastructure as Code
Scaling
Rolling updated / rolling back
Distributed secret storage by K8S
需要提前准备的环境
规则说明
全过程中不允许使用GUI,页面进行操作,所有和变更和修改都需要通过命令行来实现,这是为了更好的模拟实际生产过程中的使用场景,如CI/CD
全过程中不允许进入服务器,并直接在服务中直接操作,如ssh登陆到GCP服务器,并在上面查看日志或重启服务,因为在生产环境中,是不会有这样的操作的
步骤
第一步,服务容器化,将服务打包成Docker image
验收标准
基于centos 7 docker image将web服务打包成docker image
用脚本管理打包境像,需要基于docker-compose build
用docker-compose命令运行服务,并可以在本地用http://localhost:9000进行访问
第二步,基础设施既代码 - Infrastructure as code,在GCP上创建高可用K8S集群
验收标准
集群结点类型为 n1-standard-2
鸡蛋分开放,部署在两个不同的区域,比如:asia-northeast1-a, asia-northeast2-b
将日志信息都上传到Stack Driver进行管理
使用Terraform进行初始化管理
添加功能到上一次的脚本
Apply terraform并且构建集群
用GCloud CLI管理和更新kubectl CLI的密钥
列出所有在kube-system namespace下的pods
第三步,将redis服务部署到新起的集群
验收标准
使用脚本用kubectl构建新的redis pod以及service
列出所有在default namespace下的pods,正常情况下会有一个running状态的redis pod
列出所有在default namespace下的services,正常情况下会有一个redis service
第四步,将web前端应用镜像部署到集群
验收标准
将本地构建好的docker web app镜像,以私有的形式,推送到google container registry
同样使用kubectl将该服务apply成新的pod和service
列出所有在默认命名空间下的pods,正常情况下可以看到一个运行中的web服务pod
列出所有在默认命名空间下的services,正常情况下可以看到一个运行中的web服务service,并且这个服务会有一个external IP地址
通过链接http://<external ip>:<port>/访问该服务
第五步,水平将web服务扩展到5个实例
验收标准
需要用kubectl命令行实现
列出所有web服务pods,正常情况会看到5个
第六步,更新web服务
验收标准
需要为自己最新的docker image打一个新的好识别的标签,如 image_name:step6
更新pod的定义,并采用新标签
使用rolling updates,遵循0宕机标准
第七步,将服务回滚到上一个版本
验收标准
使用命令行回滚到前一版本
通过链接http://<external ip>:<port>/访问到的服务是上一个版本
第八步,回收集群,需要用`terraform destroy`来删除集群。如果已经删除成功,那么下一个目标就是用10分钟从头到尾部署一个你的真实服务
进阶
如果我们还有时间,建议可以思考和实践一下在我们待办列表里的任务
自定义域名
集成云端数据库
集群本身的管理,如命名空间管理,升级管理等
自定义网络
自定义k8s组件
Helm的定位
...
最后更新于