在滴滴云上学习 Kubernetes v1.13.0:集群搭建

前言

Kubernetes 1.13 在 2018 年 12 初 GA,这是今年的第四次也是最后一次大版本。此版本继续关注 Kubernetes 的稳定性和可扩展性,其中在存储和群集生命周期领域的三个主要功能实现普遍可用(GA);Kubeadm 简化集群管理、容器存储接口(CSI)和 CoreDNS 作为默认 DNS。

我们用最新的版本来学习,通过使用 Kubeadm 来安装 Kubernetes1.13.0。Kubernetes 的网络要求各节点间可以相互通信, 滴滴云 的 VPC 环境是天然的支持。

1. 目标

第一次安装,我们设一个简单的目标:

  • 完成 Kubernetes 1.13 最简单的安装

  • 可以在集群中部署简单的服务

2. 准备环境

滴滴云 上创建三台 DC2(虚拟机)

其实不用每个 DC2 都申请 EIP,这里为了安装简单,都配置上。(如果部署单机版,则创建一台,其安装区别是单机版安装后,把 master 设置为可以部署应用,下面安装的时候会有提示)

节点属性 外网 IP 内网 IP 操作系统 配置
master 116.85.57.121 10.254.11.44 CentOS 7.4 4核/8G内存/40G
node-1 116.85.10.12 10.254.203.71 CentOS 7.4 4核/8G内存/40G
node-2 116.85.45.220 10.254.56.33 CentOS 7.4 2核/4G内存/40G

后面的安装均以 root 用户进行操作,切换到 root,在命令行中 root 用户的提示符为 #,普通用户的为 $

  [ dc2 - user @ 10 - 254 - 165 - 64   ~ ] $   sudo   - i

  [ root @ 10 - 254 - 165 - 64   ~ ] #

默认情况下 滴滴云 的 DC2 的防火墙是关着的,这里不用再关闭。如果你的环境开着,先关闭。关闭的方式如下:

3. 安装

添加 Kubernetes yum 源

执行 yum 安装

  [ root @ 10 - 254 - 165 - 64   ~ ] # yum install -y docker kubelet kubeadm kubectl kubernetes-cni

安装完成后,可以看见下面安装成功的提示:

安装好后检查一下 Docker和 Kubeadm 版本

启动 Docker 和 Kubelet 服务

执行  kubeadm config images list  查看安装 Kubernetes 需要哪些依赖

这个操作会卡一会儿,提示  dl.k8s.io  不可达,但是会输出需要的镜像源及对应的版本,这一步可以直接跳过。

下载依赖包,国内的网络环境下载依赖包比较困难,笔者已经把对应的包同步到 Docker Hub 上面了


上面的内容在每个节点上面都执行,下面的在 master 上面执行。


初始化集群
这儿带上参数  --kubernetes-version=v1.13.0  是为了防止以后看教程的时候版本更新了,会安装更新的版本,导致安装失败。使用  --pod-network-cidr=172.16.0.0/12  是为了支持 CNI 网络插件。

  [ root @ 10 - 254 - 11 - 44   ~ ] # kubeadm init --pod-network-cidr=172.16.0.0/12 --kubernetes-version=v1.13.0

看见下面的输出,表示初始化成功了, 输出的结果中的   kubeadm join ...  的内容为以后在 Node 节点上面添加到集群中需要执行的命令。

初始化成功后执行正面的命令复制配置文件到 root 用户和普通用户的 home 目录下,以便连上集群使用,执行上面提示中的三行语句

添加 Weave 网络插件

  [ root @ 10 - 254 - 165 - 64   ~ ] # kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

添加成功后提示:

如果是单机版本,则执行下面的命令让 master 可以部署应用

  [ root @ 10 - 254 - 165 - 64   ~ ] # kubectl taint nodes --all node-role.kubernetes.io/master-

如果添加其它节点,则在其它两个 Node 节点上做完 Docker 和 Kubeadm 的安装后 执行添加 Node 命令,添加节点到集群中,下面的内容从上面的 kubeadm init 的结果中查找,然后拷贝运行(切记不要复制教程中的)

  [ root @ 10 - 254 - 165 - 64   ~ ] # kubeadm join 10.254.11.44:6443 --token iqq37y.cx5jpycw939zpkfn --discovery-token-ca-cert-hash

  sha256:15b997b2e6e127b453a96a96476cb0d68c89c82c42c0aa80cd1169e5bbd6af2e

查看集群中 Node 情况

到这一步,集群的安装已经完成,下面写两个脚本验证是否可用。

4. 验证 K8s 集群

下面的操作可以使用普通用户来操作 K8s 集群了,一般操作使用普通用户来操作是一个良好的习惯。

通过 ReplicaSet 配置 Tomcat Web 集群

使用 Kubectl 命令创建 ReplicaSet

  [ dc2 - user @ 10 - 254 - 11 - 44   helloworld ] $   kubectl  create   - f   web - rc . yaml

  replicationcontroller / web  created

查看我们刚部署的两个 Tomcat 的 pod, 刚开始时 pod 的状态可能为 ContainerCreating,使用命令查看,可以看见是在拉取对应的镜像

使用命令查看,可以看见是在拉取 Tomcat的镜像:

过一会儿,拉取完后,可以看见两个 pod 处于运行状态:

查看 pod 的 IP,并使用 pod IP 对 Tomcat 进行访问

目前只能在服务器上通过 podIP 对服务进行访问,但是我们的 Web 服务肯定是需要向外提供服务的。下面通过创建 Service,对外暴露服务:

创建一个 Tomcat 的 Service 对外暴露服务

Service 的配置中 nodePort: 30303 把服务端口映射到物理机, 同时设置 Service 的 type 为 NodePort, spec.selector 中 app: web 与我们之前创建的  web-rc.yaml  中的 label 一样。

创建 Service

  [ dc2 - user @ 10 - 254 - 11 - 44   helloworld ] $   kubectl  create   - f   web - svc - out . yaml

  service / web  created

查看 Service

访问服务

在集群中可以使用  集群 IP+ 端口  对服务进行访问:

在集群外可以通过  DC2 的内/外网 IP  对集群进行访问:

http://116.85.10.12:30303

http://116.85.57.121:30303

OK, 小目标完成。

5. 总结

  • 在安装填坑的过程中,网络是最大的问题,解决好网络的问题后,其它相对来说都是小问题

  • 在使用 Docker Tag 做  k8s.gcr.io  的包的过程中,不小心把 ETCD 的 image 搞错了,导致安装过程总是不成功,使用  docker save load  方式导出本机的 image 又可用。所以在安装过程中需要非常仔细

  • 多看官网文档

最后,把安装 master 的相关命令,写成了脚本,可以把 脚本 拷贝到虚机上面默默地看着自动安装:

  [ root @ 10 - 254 - 165 - 64   ~ ] # sh -x init-k8s.sh


参考文档: K8s官网


请使用浏览器的分享功能分享到微信等