k8s 在线上的实践

1、k8s 部署方式

https://github.com/easzlab/kubeasz

2、在实践中做了哪些调整

2.1 基于alpine基础镜像构建最小容器

https://github.com/gliderlabs/docker-alpine

基于Alpine Linux的超小型Docker镜像,该映像只有5 MB

image-20191127172616387

2.2 在k8s集群中引入内部DNS解析

https://kubernetes.io/zh/docs/tasks/administer

查询首先被发送到 kube-dns 中的 DNS 缓存层。
从缓存层,检查请求的后缀,并根据下面的情况转发到对应的 DNS 上:
具有集群后缀的名字(例如 “.cluster.local”):请求被发送到 kube-dns。
具有存根域后缀的名字(例如 “.feier.local”):请求被发送到配置的自定义 DNS 解析器(例如:监听在 1.2.3.4)。

image-20191127172725941

2.3 跨集群镜像同步

https://github.com/goharbor/harbor

在跨集群或多集群部署时,依然采用单镜像仓库,各节点通过公网同时拉取镜像,这对于服务器公网带宽将是个很大的考验,特别是在同时部署多个组件的情况下,由于同时下载镜像节点过多带宽很容易打到上限,导致整个部署时间延长。

Harbor镜像仓库,它具备多项目管理和多租户功能,可以针对项目划分不同权限。
在Harbor中,用户主要分为两类。一类为管理员,另一类为普通用户。两类用户都可以成为项目的成员。而管理员可以对该项目下的用户进行管理。
Harbor目前支持的同步方式:手动,定时,事件驱动。

image-20191127172848575

2.4 镜像对业务镜像层调整

业务组件放在镜像中的一层中,每次更新都需要上传和下载除基础镜像外的所有层(几十兆)

如下图所示:

image-20191127173103064

更改后的镜像层

image-20191127173140033

一般情况下服务组件的lib库很少会改动,在docker镜像中没有发生改变的镜像层其ID是不变的同时会根据镜像层的ID进行存储,在进行上传和下载时如果服务器或本地存在相同的ID则该ID的镜像层不会进行上传或下载。按照这个特性我们把lib库单独放一层;而config配置jar包每次组件更新在一定程度上会发生变化但它的体积确极小,大概只有几百kb。

经过调整后同样更新1千次版本调整前需要58G左右的空间,而后者只需要500M左右。

2.5 针对docker本身的调整

各个公司对于服务器的操作规范不尽相同,例如:数据存放目录,服务器操作账户,日志存储周期等……
对docker做以下调整:

image-20191127174016598

insecure-registries:增加私有镜像仓库,优先使用本集群仓库
storage-driver:修改存储驱动,默认安装docker时会自动选择适合的驱动类型
log-driver:使用json日志格式,默认已使用json格式
logs-opts:调整容器单个日志大小,最多保留历史日志数量
data-root:修改docker工作目录

-------------本文结束感谢您的阅读-------------