在AWS中国区使用Kops部署Kubernetes

说起部署Kubernetes这件事,相信做过的人都觉得挺麻烦的。目前主流的做法无非是两种:手动部署或者使用自动化工具。我们目前线上生产环境的k8s就是手动部署的。但对于我们这种小规模的技术团队,由于人力物力有限,手动部署后的运维、升级都不是很方便,而且为了简单,我们目前的集群并没有启用证书验证,也就是说整个通信是未加密的。
在侯斯特启用k8s的时候,当时还是1.5.6的版本阶段,当时为了解决我们自己的两个需求:1.在AWS中终止的ec2不要自动被从集群中删除;2.在创建service时可以选择哪些node挂载到ELB,而不是全部。其中,第一个需求目前已经不需要了;而第二个需求在k8s的1.9中已经alpha了,我也研究了他们的实现方法,与我们当时自己修改的k8s几乎一致。所以我们也不需要部署自己修改编译的版本了。所以我们选择使用Kops作为我们下一代集群的部署工具。之所以选择Kops而不是其他工具的原因是我们只使用AWS,而Kops也是专用于AWS的。
下面说说在中国区的AWS做这件事要面临的问题和解决方法:

1.DNS

以前,Kops是需要AWS的Route53服务的,而悲剧的是中国区没有这个服务,但是值得高兴的是目前新版本的Kops已经支持gossip-based cluster,只要是你的集群名称是“.k8s.local”结尾,那么就会跳过DNS检测。

2.AMI

目前Kops支持的操作系统主要有:Debian(默认),CoreOS,CentOS(并未推荐生产环境),而国际区默认的系统镜像“debian-jessie-amd64-hvm”在中国区并没有。那么要么从国际区搬一个回来(这个有很多教程,不赘述),要么使用CoreOS。这里推荐第二个办法,CoreOS已经在中国区的两个Region都有了官方的AMI:点击查看。因此,直接在创建集群的时候指定AMI的ID就好了。

3.cn-northwest-1(宁夏区域)

在目前Kops官方最新的release版本1.8.1中还不支持cn-northwest-1这个region,如果你使用这个版本在cn-northwest-1建立集群会报错,告诉你使用了不合法的区域。这个原因是两部分造成的:1.由于中国区AWS各个服务的Endpoint的格式和国际区不一致,所以在Kops中做了专门的判断,而他们的做法是判断是不是cn-north-1,那么显然cn-northwest-1就不行了;2.在Kops的依赖库中的aws sdk版本太老了,因为同样的原因不支持cn-northwest-1。所以大家可以看我的这3个PR:#4148#4234#4384。也就是说你如果想用Kops在cn-northwest-1建立集群,那么就要自行clone目前的最新稳定版并且自己Patch后编译(参照docs中开发相关的部分,很简单的)。

4.依赖的文件下载

Kops创建集群的时候要下载一些文件,主要是有两部分:1.Kops的部分(主要是用于启动集群中节点的时候初始化节点的工具);2.k8s的部分(主要是k8s的组件还有CNI)。这些默认是从国际区的某一个S3下载的,但由于众所周知的原因,在国内的网络下失败率很高,延迟很高,带宽很低……。
要解决这个问题,我们首先的思路就是把这些需要的文件都下载下来,上传到国内,之后指定新的下载地址。那么这里就要解决两个问题:

(1)下载什么?

这个问题看上去简单,但是想一想你就会发现,你要看所有Kops的代码才能知道要下载什么。这里我发现一个办法:https://github.com/kubernetes/kops/blob/master/docs/development/release.md#upload-new-version

(2)怎么修改这个默认地址?

这里要分三部分:

第一部分是k8s的组件,这里可以使用集群创建时的kubernetesVersion这个参数控制的。例如:
kubernetesVersion: https://s3.cn-northwest-1.amazonaws.com.cn/${BUCKET}/kubernetes/release/v1.9.2

第二部分是Kops的组件,这里需要用环境变量处理:
export KOPS_BASE_URL=https://s3.cn-north-1.amazonaws.com.cn/$ASSET_BUCKET/kops/$KOPS_VERSION/

第三部分是CNI,这里也需要环境变量去处理,但是区别是需要两个环境变量:
export CNI_VERSION_URL=https://s3.cn-north-1.amazonaws.com.cn/$ASSET_BUCKET/kubernetes/network-plugins/$CNI_FILENAME
export CNI_ASSET_HASH_STRING=afbb526e7d976f98353ac96f73043031 (此处为$CNI_FILENAME的md5值)

5.hub.docker.com的加速和镜像

有一些依赖的镜像,例如weave是要从docker官方的镜像仓库拉取的。同样由于众所周知的原因,很慢,很不稳,很难……。那么我们就要用registry mirror的方案。我们直接在创建集群的yaml文件中增加一段描述就可以了:

docker:
registryMirrors:
- https://registry.docker-cn.com

6.gcr.io的镜像拉取

除了上文提到的那些文件和镜像,还有很多镜像需要从gcr.io这个仓库拉取,如果说上面提到的问题如果都不处理,就用默认的,那么运气好或者有耐心还有可能等到成功下载。那么这个gcr.io就是个完全无法成功的事情了,你问为什么?我的博客在国内,不敢说……。那么怎么办呢?依然是镜像的方式。但是不能像上面那么简单直接定义一个镜像地址就可以了。这里依然有两个办法:

首先要明确都要下载哪些images?主要有3部分:1.etcd;2.dns;3.pause。我可以列出来:
gcr.io/google_containers/etcd
gcr.io/google_containers/pause-amd64
gcr.io/google_containers/cluster-proportional-autoscaler-amd64
gcr.io/google_containers/k8s-dns-kube-dns-amd64
gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64
gcr.io/google_containers/k8s-dns-sidecar-amd64
gcr.io/google_containers/kubedns-amd64
gcr.io/google_containers/k8s-dns-dnsmasq-amd64
gcr.io/google_containers/dnsmasq-metrics-amd64
gcr.io/google_containers/exechealthz-amd64

(1)做个假的:
自己搭建一个docker registry,把上面的镜像自己想办法pull下来再push上去,之后在你的所有ec2上配置一下hosts或者配置你的内部dns解析gcr.io到这个假的registry。这样的好处是不用再修改Kops了。

(2)自定义镜像仓库地址(这里指写出关键部分,本文最后会提供完整的集群配置文件):

etcd:
image: $REGISTRY/etcd:3.2.14
version: 3.2.14

pause:
podInfraContainerImage: $REGISTRY/pause-amd64:3.1

dns:
这个有点麻烦,要修改upup/models/cloudup/resources/addons/kube-dns.addons.k8s.io/k8s-1.6.yaml.template里面对应的值,之后重新编译Kops。

7.尾声

如果上面的步骤都做完了,那么就可以参照这片官方的aws china的文档的前半部分创建集群了:文档忽略掉Image部分就好了。

最后附上完整的配置文件(要修改里面的一些地方,改成你自己的):

https://gist.github.com/leeeboo/abf83d811617d21bb5425737dd0df006

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 今天又是我们两周一次的小桥音乐会,这让我感到特别紧张,因为今天我有一个节目,我怕演砸了 下次就再也上不了了,...
    辛梓轩阅读 329评论 2 2
  • 国庆假期,懒惰的我只想宅家,刷遍朋友圈。已经厌倦了人山人海的景点,也厌倦了从活到腻的地方去到别人活腻的地方。 直到...
    芷晨_菇菇菇姐阅读 486评论 0 1
  • 他们已经到了成家立业的年龄,正如现在的我们。身边不少曾经稚嫩的男生已经娶妻生子,不少曾经青涩的少女也已嫁为人妇。身...
    奕子观阅读 315评论 0 1