5分钟安装Kubernetes+带你轻松安装istio服务网格指南

发布时间 2023-12-14 09:28:07作者: 努力的小雨

上次我跟大家简单介绍了一下Kubernetes的各个组件及其含义,本期本来计划带领大家一起学习一些常用命令,但我认为这种方式可能无法达到学习的效果。有可能你们会直接忘记,甚至可能没有兴趣去学。我也理解,心想这跟我有什么关系,我本地又搭建不起来K8s。

我一直坚持让大家亲自动手敲命令解决问题,因为只有这样才能真正理解命令的作用。所以我一直秉持着让大家能够直接学习命令,我也不想去写什么安装教程,直接给你们封装好环境了,但是这个环境是我自己站在巨人的肩膀上一步一步搭建起来的。我本地进行测试是没有问题的。这个环境仅供大家本地学习使用,如果因此造成任何损失,我概不负责哦。

如果你想获取Kubernetes的学习环境,请关注我的主页,然后在微信中搜索我的公众号即可后台回复: k8s。由于不能进行广告宣传,我就不在这里提及公众号的名字了。现在,我们继续正式话题,开始快速安装istio。

K8s直接安装

前提是你需要先获取一个适用于Kubernetes学习环境的安装包。我的分享链接将提供五个文件,它们分别是:

image

oracle VM visualbox 类似于你的vmware一样是一个运行虚拟机的软件,你总不能去买一台高配置的云服务器去搞吧。也没有资金。

k1215-centos81-docker-1.20.6-56.5.ova是只集成了k8s和docker的镜像,可以直接学习各种k8s的命令

k8s-istio-centos81-docker-1.20.6-56.ova是在k1215-centos81-docker-1.20.6-56.5.ova版本基础上集成好了istio的镜像,你可以直接导入到visualbox 中启动运行即可。剩下的就可以学习服务网格了。

istio-1.11.1-linux-amd64.tar.gz是istio的离线安装包,因为需要代理,所以我也提前下载下来了。

kube-flannel.yaml是网络组件,因为需要代理,所以我也提前下载下来了。

一旦你下载完成。助你快速学习k8s的命令用法以及其他知识,省去安装这种费劲的无用耗时。

导入基础K8s镜像

我们将根据一个仅集成了Kubernetes和Docker的镜像,逐步进行istio的安装。这样做有两个好处:一方面,你可以直接练习Kubernetes的命令;另一方面,你能够更深入地理解Kubernetes的各种概念和问题。好的,我们开始吧。

首先,你需要确保已经成功安装了Oracle VM VirtualBox(关于这个安装过程我就不详细解释了)。安装完成后,我们需要进行第一步,即处理你的NAT网络设置,因为这个镜像需要通过NAT模式进行联网。请按照以下图示进行设置:

image

在创建时,你无需填写任何内容,因为系统会自动为你生成IP地址。你只需要记住这个NAT网络的名称即可。

image

好的,现在你可以开始直接导入基于k8s的基础镜像。如下图所示:

image

在导入选择K8s的基础镜像后,需要注意的是MAC地址设定这个方面。除此之外,没有其他需要特别注意的地方。接下来就是等待过程。

image

当你完成操作之后,请务必进行虚拟机网络的设置。

image

image

好的,现在让我们来启动你的虚拟机吧!k8s的大门已经为你打开了。然而,在建立istio服务网格的过程中,你可能会遇到各种报错。不用担心,我撰写本文的目的就是为了帮助你解决这些报错,并成功建立起istio服务网格。此外,你还能学到一些常用命令。

istio手动安装

当你准备登录虚拟机时,请使用以下账户信息:用户名为root,密码为123456。如果你安装了xshell,你可以通过使用IP地址192.168.56.5直接进行连接。无需担心IP地址与你本地设备的地址不同,因为它已被设定为固定值。

由于我已经完成了所有的环境配置工作,因此可以直接利用k8s的命令进行操作。

kubectl get cs

好的,让我们开始执行第一个命令,用于查看各个组件的状态。这个命令的缩写是"cs",代表"component status"。我已经在之前的文章中讲解了有哪些组件了。所以我不会再重复告诉你。然而,令人意外的是,执行命令后出现了错误。

image

至于为什么会报出这个错误,关于这个问题在网上有很多不同的说法。幸运的是,我找到了一个解决方案。首先,我需要先卸载一下相关的内容。

卸载:
kubeadm reset
ifconfig cni0 down && ip link delete cni0
ifconfig flannel.1 down && ip link delete flannel.1
rm -rf /var/lib/cni/
rm -rf /etc/kubernetes
rm -rf /root/.kube/config
rm -rf /var/lib/etcd

重新安装:
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.21.5 --pod-network-cidr=10.10.0.0/16 --service-cidr=10.20.0.0/16 --apiserver-advertise-address=192.168.56.5


安装完之后,在执行一下,kubeadm让我们执行的语句:
mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

再次执行查看组件状态后,仍然无法正常工作。然而,其中一个组件成功运行了:

image

这时候,为了完成任务,我们需要对一些文件进行修改。我已经准备好了命令,我们需要做的是注释掉两个文件中的port这一行。

vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml

image

一旦你完成了操作,你就能够观察到我们的k8s正常运行了。

image

好的,现在我们开始安装istio吧。由于istio需要使用代理,所以我已经提前准备好了相应版本的istio安装包。接下来,只需将安装包直接复制到虚拟机中即可开始安装。

使用tar -zxvf istio-1.11.1-linux-amd64.tar.gz命令解压成功后,需要你修改到etc/profile中。

export ISTIO_HOME=/root/istio-1.11.1/bin
export PATH=$ISTIO_HOME:$PATH

在执行完相应的操作后,记得使用命令 "source /etc/profile" 来使其生效。接下来,你就可以开始安装了。

安装命令:istioctl install --set profile=demo -y

image

在等待了大约几分钟后,不出所料,还是遇到了错误。我们的第一反应肯定是上网搜索解决方案。然而,尽管我尝试了所有的解决方案,例如网络代理等,但都没有成功解决我的问题。答案众多,但都不是我所需要的正确答案。

然而,我知道当安装istio时,它会在k8s中启动一个pod。于是,我决定直接查看后台启动日志,这样或许能找到问题的所在。因此,现在我们可以开始学习一些关于k8s命令的知识了。

首先,我们需要检查一下istio是否安装在特定的命名空间中。命名空间可以被理解为一种隔离机制,类似于进行分组操作,将同一命名空间下的pod视为一组。

kubectl get ns

为了查看所有的命名空间,你可以使用以下命令:kubectl get namespaces 或者 kubectl get ns。通过执行这个命令,你可以轻松地确定istio是否安装在名为istio-system的命名空间中。通常情况下,我们会在默认的命名空间default下进行操作。

image

kubectl get pods -n

为了查看istio-system命名空间下的pod状态,你可以使用以下命令:kubectl get pods -n istio-system。通过添加"-n"参数并指定命名空间,你可以在不切换命名空间的情况下,轻松地查看指定命名空间下的pod状态。当然,如果你希望切换到其他命名空间,你可以使用以下命令::kubectl config set-context $(kubectl config current-context) --namespace=istio-system

image

kubectl describe pod

好的,我们注意到pod的状态异常,因此我们首先查看pod的描述以确定是否有异常情况。执行命令kubectl describe pod <pod的名称> -n istio-system后,我们发现确实有提示信息如下:

image

kubectl taint nodes

错误信息可以轻松查看真正的错误原因。通常情况下,Kubernetes的Master节点是不可调度的,以防止在Master节点上运行用户Pod。然而,考虑到我们的虚拟环境只是用于学习,我们可以直接运行Pod而不管它们是否可以调度。因此,我们需要对配置进行调整。

命令是:kubectl taint nodes <node-name> node-role.kubernetes.io/master-请将替换为你的Master节点的名称。这将允许Pod在Master节点上调度。

kubectl get nodes

如果你不知道你的node-name的话,可以使用kubectl get nodes获取。

image

当你执行完后,我们再来重新安装一次istio,经过优化。然而,我们发现问题仍然存在,因此我们再次执行describe命令时仍然遇到了错误。具体错误信息如下:

image

我看完日志后的第一反应是感到困惑,因为我对日志中出现的内容不太理解。于是我决定找AI帮忙,让它来分析一下。AI给出的接口看起来很可信,它指出缺少了POD network Flannel网络插件,我看了一下报错信息果然如此。既然找到了问题,那就着手解决吧。

kubectl apply -f

经过一番搜索看来是需要:wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yaml执行命令下载一个文件。但是一看就是需要代理的,所以我也提前准备好了kube-flannel.yaml。当你往你的虚拟机中传输完之后,可以直接使用命令启动kubectl apply -f kube-flannel.yaml

image

然而,我执行完毕后,令人惊讶的是,Istio仍然无法正常工作。从启动日志中可以看出,它被安装在了kube-flannel命名空间中。现在,我们来查看一下它的Pod情况。

k get pod -n kube-flannel执行完后查看到pod没启动成功,我们再看下他的描述信息。

image

image

kubectl logs -n

这次的描述信息似乎很正常,没有明显的错误提示,只有一个提示信息。为了更进一步了解情况,我们可以再次查看它的启动日志,以下是相应的命令:kubectl logs -n kube-flannel kube-flannel-ds-h47f6

image

在查看日志后,我们发现问题居然是由于网络段的设置引起的,这真是个坑啊。不过好消息是,这似乎是最后一个问题了。我就不在此处详述了,我希望你能够自行解决。解决完毕后,你将进入istio的训练天地,如果你真的遇到困难,可以在我的公众号中回复k8s,我将会给你回复并提供答案。

当你安装成功后,所有的服务都将启动

image

总结

以上所有的问题,我都是自己解决的。如果你觉得我提供的帮助不错,可以给我一个赞。对于初学者来说,我建议从基础版镜像开始慢慢构建istio,这样可以更好地学习k8s的命令。当然,如果你已经是k8s的老手,除了别跳过visualBox的过程外,你可以直接下载已经搭建好的istio虚拟机镜像。好的,这一章就到此结束了。记得关注我的公众号,我的宗旨是让你用最小的成本学习到最多的技术内容。