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

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

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

本文作为Kubernetes专栏的第一篇文章,我们将快速搭建Kubernetes集群,日后的文章都是基于这个集群环境来进行的演示,下面我们来进入正文。

一、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

# 临时关闭swap分区
$ swapoff -a

# 要永久禁掉swap分区,打开如下文件注释掉swap那一行
$ vim /etc/fstab

关闭 SELinux

# 临时关闭
$ getenforce
$ setenforce 0

# 永久关闭
$ vim /etc/selinux/config  
# 改:7SELINUX=enforcing     #前面的7,表示文档中第7行。方便你查找
# 为:7SELINUX=disabled
$ reboot

配置转发参数

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

三、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的内容如下:

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

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

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

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

$ systemctl enable docker && systemctl start docker
$ systemctl enable kubelet && systemctl start kubelet

3.2、kubeadm config

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

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

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

apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
imageRepository: docker.io/dustise
kubernetesVersion: v1.14.0
networking:
  podSubnet: "192.168.0.0/16"

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

3.3、下载Kubernetes的相关镜像

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

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

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

在镜像下载完成之后,就可以进行安装了。

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。

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

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

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

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

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

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

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

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

3.5、安装 Node,加入集群

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

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

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 插件,执行下面的命令即可一键完成安装:

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

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

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

    $ kubectl get pods --all-namespaces

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

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

到此Kubernetes集群搭建完成。

你可能感兴趣的:(Kubernetes,Kubernetes入门与实战)