Kubernetes基础 ( 10 ) - 小结
一、概述
1.1 背景
接触运维以后,发现系统整体资源利用率不高,由于各种环境、软件依赖的问题,大部分机器也只部署一种服务, 所以机器资源浪费比较严重,平均CPU使用率大概只有10%。所以要想提升机器利用率,第一步得解决软件依赖的问题。而容器也许是比较好的方案,进而需要了解容器的编排工具kubernetes。
1.2 容器化改造
对旧系统的改造设计一整套运维流程的变更,镜像打包、发布流程、容器管理、容器监控、日志的收集处理。
二、Docker + Kubernetes

2.1 关于Docker
Docker是一个开源的应用容器引擎, 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
2.2 容器解决了什么问题
虚拟机上一个机器运行多个项目需要考虑软件的环境,系统资源的抢占,而容器之间是完全隔离的,它的运行环境不受其他容器的影响,容器的资源可以做独立控制。这样下来,一台虚拟机就变成了多台容器,管理的粒度更细,资源的利用率会更好些。
2.3 关于Kubernetes
Kubernetes是Google在2014年开源的一个容器集群管理系统,简称k8s。
2.4 k8s解决了什么问题?
主要解决了容器的编排问题,让容器化在生产环境落地。k8s把虚拟机当做一个整体的资源池,自己实现资源的管理,用户只需要向k8s申请需要什么样的资源,要部署什么样的应用,k8s会从这个资源池中自己寻找资源,创建对应的资源对象。
三、Kubernetes特性
3.1 健康监测
通过Pod的readiness可以判断容器是否准备好了,而通过liveness可以判断容器是否还存活,类似阿里云SLB的端口监听,如果有异常会且走流量,而k8s如果检测到Pod异常则会自动修复,确保服务的可靠性。
3.2 自我修复
比如supervisor突然挂了,进程突然退出了,健康检测失败后则会重启Pod尝试恢复服务。
3.3 滚动更新与回滚
以往的更新可能会需要自己来控制不同节点的更新,服务的发布重启可能有短暂的服务不可用。而k8s的Deploy机制可以让Pod一个一个被替换掉,从而实现不间断更新,从系统层面实现不同类型应用的更新。
3.4 服务发现
传统配置上需要配置后端IP实现负载均衡,如果IP变化则需要手动调整。而Service可以自动发现Pod,当新增、重建、或者删除Pod后,Service都可以自动维护后端PodIP列表,不再需要手动管理后端PodIP。
3.5 负载均衡
k8s对外暴露服务的方式有NodePort、LoadBalancer、Ingress。Service实现的是4层的负载均衡,Ingress实现的是7层的负载均衡,通过ingress-controller将请求转向到后端的Service。Service则可以通过iptables、ipvs将请求转向后端Pod实现负载均衡。
3.6 弹性收缩
可以通过对系统资源的监控,实现对Pod的自动扩容与缩容,让资源利用上更合理,也让服务变得更高可用。
3.7 资源调度
大部分情况都是运维根据项目要求来选择对应的机器,资源的控制由运维控制,k8s将这种控制进行抽象,根据调度策略将Pod调度到最优的Node节点上,从而充分利用系统资源。当然机器资源的不同,应用要求不同,也可以人为控制节点亲和性。
四、k8s如何使用?
4.1 基础镜像
比如Python的镜像或者PHP的镜像,基础镜像应该满足不了项目使用,那我们自己就需要在这些基础镜像上做一些扩展或者第三方包的安装,这里应该有两种方式:
Dockerfile继承官方基础镜像。Dockerfile继承自定义的基础镜像。
自定义相当于在上面在封装一层,安装一些日常需要使用的扩展,大部分应用的Dockerfile可能就不需要参与到具体环境的编译来了。
4.2 源代码镜像如何打?
4.1.1 以运行环境镜像为基础打镜像
比如Python项目的源代码,基础镜像为已打好的镜像,直接将代码文件拷贝到镜像中,镜像文件有项目运行的环境。如果对运行环境有什么特殊要求,也可以在Dockerfile里直接处理了。
4.1.2 以通用镜像为基础打镜像
比如以Alpine或者busybox为基础镜像,只需要将源代码拷贝到镜像中即可,镜像不具备项目运行的环境。隔离了源代码和环境,应用需要的独立环境只能运维处理,Yaml文件的容器部分需要将源代码镜像和运行环境镜像连接起来。
4.3 配置文件如何管理?
应用层级与依赖的数据库配置、日志级别等配置,服务层级有Nginx配置文件、PHP配置文件等。直接打进镜像后面任意修改就都得更新镜像了。而Kubernetes提供了ConfigMap、Secret、PV这些存储方式,类似这种配置文件使用ConfigMap、Secret这种应该就可以满足了。
然后在initC容器里可以将配置文件拷贝到容器里,或者容器直接挂载到特定目录去。
4.4 源代码文件如何共享?
比如Python的项目需要配个Nginx的话,Nginx只需要配置反向代理的IP即可,而PHP必须借助Nginx,他们俩都需要可以访问到源代码,就涉及到同一个Pod中多容器或者不同Pod中数据共享的问题。比如PHP+Nginx:
如果处在不同的Pod中,Nginx的配置文件fastcgi_pass可以通过php-svc进行关联,如果处理同一个Pod里,直接通过9000端口关联即可。数据存储上就必须借助Volumes了,比如挂载同一个nfs,或者挂载同一个空目录,然后在initC容器里将数据写入到这个目录里。
@todo
五、相关资料
6.1 官方仓库
| 项目 | 官网 | Github | 说明 |
|---|---|---|---|
| Kubernetes | kubernetes.io | https://github.com/kubernetes/kubernetes | Kubernetes项目 |
| Etcd | etcd.io | https://github.com/etcd-io/etcd | 配置管理 |
| Coredns | coredns.io | https://github.com/coredns/coredns | DNS服务 |
| Flannel | https://github.com/coreos/flannel | 网络插件 | |
| kubeadm | https://github.com/kubernetes/kubeadm | k8s安装 | |
| minikube | https://github.com/kubernetes/minikube | k8s安装 | |
| ingress-nginx | https://github.com/kubernetes/ingress-nginx | ingress | |
| traefik | traefik.io | https://github.com/traefik/traefik | ingress |
| Dashboard | https://github.com/kubernetes/dashboard | ||
| Helm | helm.sh | https://github.com/helm/helm | 包管理 |
| Prometheus | prometheus.io | https://github.com/prometheus/prometheus | 监控报警 |
| Grafana | grafana.com | https://github.com/grafana/grafana | 图表展示 |
| Istio | istio.io | https://github.com/istio/istio |
6.2 个人整理
| 地址 | 说明 |
|---|---|
| Docker ( 1 ) - 小试Docker容器环境 | Docker基本介绍 |
| Docker ( 2 ) - Dockerfile | 尝试通过Dockerfile来构建镜像 |
| Docker ( 3 ) - Docker Compose | 通过Docker Compose来组合容器 |
| Docker ( 4 ) - Docker Api | Docker的API接口与基本架构介绍 |
| Docker ( 5 ) - Docker小结 | Docker小结 |
| Kubernetes基础 ( 1 ) - 环境搭建及概念说明 | k8s基础概念介绍,能通过minukube或者docker搭建一套环境。 |
| Kubernetes基础 ( 2 ) - 资源清单 | 通过2、3、4三个章节对基础的Pod和资源清单、存储做介绍。 |
| Kubernetes基础 ( 3 ) - Pod | Pod的写法及生命周期介绍 |
| Kubernetes基础 ( 4 ) - 存储 | Pod依赖的存储介绍 |
| Kubernetes基础 ( 5 ) - 控制器 | 各种控制器的初步介绍,通过控制器来管理Pod |
| Kubernetes基础 ( 6 ) - Service | 通过Service暴露Pod |
| Kubernetes基础 ( 7 ) - Ingress | 通过7层负载暴露服务 |
| Kubernetes基础 ( 8 ) - 调度器 | 介绍k8s调度器的逻辑 |
| Kubernetes基础 ( 9 ) - 示例 | 通过示例来演示基本的用法 |
| Kubernetes基础 ( 10 ) - 小结 | Kubernetes小结 |
6.3 容器化经验
- [1] 历时3年,美图全面容器化踩过的坑
- [2] 有赞容器化实践
- [3] 独角兽完美日记电商系统容器化改造实践
- [4] 腾讯万台规模的 Docker 应用实践
- [5] 京东 618:15 万个 Docker 实例,所有业务全部容器化
- [6] 运维的辛酸泪:陌陌K8s容器化改造之路
- [7] 拉勾网基于 UK8S 平台的容器化改造实践
6.4 学习资料
- [1] kubernetes中文社区
- [2] Linux系统运维之路
- [3] BenjaminYangIn

2020-11-11 08:45
Kubernetes
容器化
