Kubernetes实战(一)-Kubernetes集群的快速搭建

从两年前开始就一直在关注着Kubernetes的技术发展,说来惭愧,直到两年后的今天才来写这个专栏,容器化发展到今天已经是非常成熟的技术,各大公司争相使用Kubernetes做容器化管理,今后也会将更多的重心转移到容器相关技术的学习上,比如Kubernetes、Istio、Prometheus、Knative等等,慢慢朝着运维方向去培养自己。

我始终相信合久必分,分久必合的道理,天下如此,微服务亦是如此,微服务从来都不会仅限于某一个框架,我相信在不远的未来SpringCloud、Dubbo等微服务框架都会被淘汰,取而代之的是成熟的分布式容器化解决方案,也就是我心中所坚信的未来:容器即服务。

一、Kubernetes简介

Kubernetes是什么?

首先,它是一个全新的基于容器技术的分布式架构领先方案。是谷歌的Borg(大规模集群管理系统)的一个开源版本。

其次,如果系统设计遵循了Kubernetes的设计思想,那么传统系统架构中的和业务没有多大关系的底层代码或功能模块(比如负载均衡,服务自理框架,服务监控,故障处理等),都可以消失。使用Kubernetes,不仅可以节省至少30%的开发成本,更专注于业务,而且由于Kubernetes提供了强大的自动化机制,所以系统后期的运维难度和运维成本大幅度降低。

然而,Kubernetes是一个开放的平台。与J2EE不同,它不局限于任何一种语言,没有限定任何编程接口,所以不论用JAVA、Go、C++还是用Python编写的服务,都可以毫不困难的映射为Kubernetes的service,并通过标准的TCP进行交互。

此外,由于Kubernetes平台对现有的编程语言、编程框架、中间件没有任何入侵性,因此现有的系统很容易改造升级并迁移到Kubernetes平台上。

最后,Kubernetes是一个完备的分布式系统支撑平台。有完备的集群管理能力,包括多层次的安全保护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、内建的智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及 多粒度的资源配额管理能力。同时,Kubernetes提供了完善的管理工具,这些工具涵盖了包括开发、部署测试、运维监控在内的各个环节。

因此,Kubernetes是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。

二、准备工作

本专栏是基于Centos7环境的基础上搭建的,同时需要安装docker环境并配置阿里云镜像源,相关文章我已经写好了,传送门:

Docker运维与实战(一)-Docker的前世今生

然后我们需要关闭 Swap

1# 临时关闭swap分区 2$ swapoff -a 3 4# 要永久禁掉swap分区,打开如下文件注释掉swap那一行 5$ vim /etc/fstab 6 7

关闭 SELinux

1# 临时关闭 2$ getenforce 3$ setenforce 0 4 5# 永久关闭 6$ vim /etc/selinux/config   7# 改:7SELINUX=enforcing     #前面的7,表示文档中第7行。方便你查找 8# 为:7SELINUX=disabled 9$ reboot 10

配置转发参数

1# 配置转发相关参数,否则可能会出错 2$ cat <<EOF > /etc/sysctl.d/k8s.conf 3net.bridge.bridge-nf-call-ip6tables = 1 4net.bridge.bridge-nf-call-iptables = 1 5vm.swappiness=0 6EOF 7$ sysctl --system 8

三、Kubernetes集群搭建

3.1、安装kubeadm和相关工具

首先配置yum源,官方yum源的地址为 https://packages.cloud.google.com/yumrepos/kubernetes-el7-x86_64。如果无法访问官网yum源的地址,则可以使用国内的一个yum源,地址为 http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/,yum源的配置文件/etc/yum.repos.d/kubernetes.repo的内容如下:

1[kubernetes] 2name=Kubernetes Repository 3baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 4enabled=1 5gpgcheck=0 6

然后运行yum install命令安装kubeadm和相关工具:

1 $ yum install -y kubeadm-1.14.0 kubectl-1.14.0 kubelet-1.14.0 --disableexcludes=kubernetes 2

运行下面的命令,启动Docker服务(如果已安装Docker,则无须再次启动)和kubelet服务,并设置为开机自动启动:

1$ systemctl enable docker && systemctl start docker 2$ systemctl enable kubelet && systemctl start kubelet 3

3.2、kubeadm config

kubeadm已经进入GA阶段,其控制面初始化和加入节点步骤都支持大量的可定制内容,因此 kubeadm 还提供了配置文件功能用于复杂定制。同时,kubeadm 将配置文件以ConfigMap 的形式保存到集群之中,便于后续的查询和升级工作。 kubeadm config 子命令提供了对这一组功能的支持(详情见《Kubernetes权威指南 第四版》58页),例如,执行 kubeadm config print init-defaults,可以取得初始化参数文件:

1 $ kubeadm config print init-defaults > init.default.yaml 2

对生成的文件进行编辑,可以按需生成合适的配置。例如,若需要定制镜像仓库的地址,以及Pod的地址范围,则可以使用如下配置:

1apiVersion: kubeadm.k8s.io/v1beta1 2kind: ClusterConfiguration 3imageRepository: docker.io/dustise 4kubernetesVersion: v1.14.0 5networking: 6 podSubnet: "192.168.0.0/16" 7

将上面的内容保存为 init-config.yaml 备用。

3.3、下载Kubernetes的相关镜像

为了从国内的镜像托管站点获得镜像加速支持,建议修改Docker的配置文件,增加Registry Mirror参数,将镜像配置写入配置参数中,例如echo '{"registry-mirrors":["https://almtd3fa.mirror.aliyuncs.com"]}' > /etc/docker/daemon.json,然后重启Docker服务。

使用config images pull子命令下载所需镜像,例如:

1 $ kubeadm config images pull --config=init-config.yaml 2

如果上述命令不能下载镜像,可以尝试以下方法进行下载:

首先我们通过执行以下命令知道该节点的 kubeadm 所依赖的所有镜像名称(tag),命令如下:

1 $ kubeadm config images list 2

该节点 kubeadm 所依赖的所有镜像名称(tag),图示如下:

  

然后再通过执行以下命令获得依赖镜像的下载脚本(从 docker.io/mirrorgooglecontainers 镜像仓库下载),命令如下:

1 $ kubeadm config images list |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#docker.io/mirrorgooglecontainers#g' 2

依赖镜像资源下载的命令列表,图示如下:

  

我们依次执行以上命令下载对应镜像即可,不过上述命令中的最后一条的 coredns:1.3.1 在 mirrorgooglecontainers 仓库中不存在,需要从 coredns 仓库进行另行下载(注意 coredns:1.3.1 是从另外一个仓库下载的),命令如下:

1docker pull docker.io/mirrorgooglecontainers/kube-apiserver:v1.14.0 2docker pull docker.io/mirrorgooglecontainers/kube-controller-manager:v1.14.0 3docker pull docker.io/mirrorgooglecontainers/kube-scheduler:v1.14.0 4docker pull docker.io/mirrorgooglecontainers/kube-proxy:v1.14.0 5docker pull docker.io/mirrorgooglecontainers/pause:3.1 6docker pull docker.io/mirrorgooglecontainers/etcd:3.3.10 7docker pull coredns/coredns:1.3.1 8

将上述命令下载下来的所有镜像统一修改标签为我们所依赖的正确的镜像名称(tag),命令如下:

1docker tag mirrorgooglecontainers/kube-proxy:v1.14.0 k8s.gcr.io/kube-proxy:v1.14.0 2docker tag mirrorgooglecontainers/kube-controller-manager:v1.14.0 k8s.gcr.io/kube-controller-manager:v1.14.0 3docker tag mirrorgooglecontainers/kube-apiserver:v1.14.0 k8s.gcr.io/kube-apiserver:v1.14.0 4docker tag mirrorgooglecontainers/kube-scheduler:v1.14.0 k8s.gcr.io/kube-scheduler:v1.14.0 5docker tag mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10 6docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1 7docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1 8

最后执行以下命令删除原镜像,命令如下:

1 $ docker images|grep mirrorgooglecontainers|awk '{print "docker rmi",$1":"$2}'|sh -x 2

如果想将上述镜像列表导出到本地,命令如下:

1 $ docker images|grep k8s.gcr.io|awk -F '/' '{print $2}'|awk '{print "docker save k8s.gcr.io/"$1":"$2" >/usr/local/oas/k8s/images/"$1".tar.gz"}'|sh -x 2

上述步骤完成之后,就可以进行k8s集群的初始化了。

3.4、运行 kubeadm init 命令安装 Master

至此,准备工作已就绪,执行kubeadm init命令即可一键安装Kubernetes的Master。

在开始之前需要注意:kubeadm的安装过程不涉及网络插件(CNI)的初始化,因此kubeadm初步安装完成的集群不具备网络功能,任何Pod包括自带的CoreDNS都无法正常工作。而网络插件的安装往往对 kubeadm init 命令的参数有一定的要求。例如,安装Calico插件时需要指定 --pod-network-cidr=192.168.0.0/16,详情可参考 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/\#pod-network。

首先我们需要给每一个节点起一个主机名(主节点可以叫master,从节点可以叫slave),传送门如下:

Centos7 永久更改主机名

然后使用 kubeadm init 命令,使用前面创建的配置文件进行集群控制面的初始化:

1 $ kubeadm init --config=init-config.yaml 2

等待一段时间后,Kubernetes 的 Master 安装成功,显示如下信息:

1Your Kubernetes control-plane has initialized successfully! 2 3To start using your cluster, you need to run the following as a regular user: 4 5 mkdir -p $HOME/.kube 6 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 7 sudo chown $(id -u):$(id -g) $HOME/.kube/config 8 9You should now deploy a pod network to the cluster. 10Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: 11 https://kubernetes.io/docs/concepts/cluster-administration/addons/ 12 13Then you can join any number of worker nodes by running the following on each as root: 14 15kubeadm join 192.168.3.206:6443 --token lh8hfg.0alfi6stfzkx2ogw \ 16 --discovery-token-ca-cert-hash sha256:7a6a6c4a444eb14ad2d93befe8c06ffc87f419f53e5c741c5e9addeff34020d8 17 18

按照提示执行下面的命令,复制配置文件到普通用户的home目录下:

1$ mkdir -p $HOME/.kube 2$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 3$ sudo chown $(id -u):$(id -g) $HOME/.kube/config 4

这样就在 Master 上安装了 Kubernetes,但在集群内还没事有可用的 Node,并缺乏容器网络的配置。这里需要注意 kubeadm init 命令执行完成后的最后几行提示信息,其中包含加入节点的指令(kubeadm join)和所需的Token。

3.5、安装 Node,加入集群

对于新节点的添加,系统准备和 Kubernetes yum 源的配置过程是一致的,这里就不做赘述了,加入集群的命令就是上文中所打出来的命令,只需要在 Node 节点上执行一下就可以了

1kubeadm join 192.168.3.206:6443 --token lh8hfg.0alfi6stfzkx2ogw \ 2 --discovery-token-ca-cert-hash sha256:7a6a6c4a444eb14ad2d93befe8c06ffc87f419f53e5c741c5e9addeff34020d8 3 4

3.6、安装网络插件

执行 kubectl get nodes 命令,会发现Kubernetes提示 Master 为 NotReady 状态,这是因为还没有安装 CNI网络插件,下面根据 kubeadm 的提示安装 CNI 网络插件。对于 CNI 网络插件,可以有许多选择,请参考 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/\#pod-network 的说明。

例如,选择 weave 插件,执行下面的命令即可一键完成安装:

1 $ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" 2

3.7、验证Kubernetes集群是否安装完成

执行下面的命令,验证 Kubernetes 集群的相关 Pod 是否都正常创建并运行:

1 $ kubectl get pods --all-namespaces 2

如果发现有状态错误的 Pod,则可以执行 kubectl --namespace=kube-system describe pod <pod_name> 来查看错误原因,常见的错误原因是镜像没有下载完成。

通过 kubeadm 工具就实现了 Kubernetes 集群的快速搭建。如果安装失败,则可以执行 kubeadm reset 命令将主机恢复原状,重新执行 kubeadm init 命令,再次进行安装。

到此Kubernetes集群搭建完成。

代码交流 2021