在学习kubernetes/k8s的时候,需要搭建一个学习环境。可以用官方提供的模拟器,不过由于是模拟器,有些东西和实际还是有区别的。下面通过虚拟机来进行搭建。
multipass是ubuntu的一个轻量级虚拟机,占用资源比较小,本次就选择multipass。
通过multipass来创建和管理虚拟机节点,官方地址https://multipass.run/,安装后分别创建三个虚拟机
#注意maste的至少需要2V2G,不然启动不起来
$ multipass launch -n master -c 2 -m 2G -d 40G
$ multipass launch -n node1 -c 2 -m 1G -d 40G
$ multipass launch -n node2 -c 2 -m 1G -d 40G
#查看虚拟机列表
$ multipass list
Name State IPv4 Image
master Running 172.26.69.30 Ubuntu 20.04 LTS
node1 Running 172.26.70.162 Ubuntu 20.04 LTS
node2 Running 172.26.71.167 Ubuntu 20.04 LTS
multipass的其他一些管理虚拟机的命令
# 启动实例
multipass start master
#进入节点
multipass shell master
# 停止实例
multipass stop master
# 删除实例(删除后,还会存在)
multipass delete master
# 释放实例(彻底删除),释放占用的空间
multipass purge
然后分别进入每个节点执行如下操作
安装containerd,由于kubernetes已经改用containerd而不是docker,这里安装containerd
#进入节点
$ multipass shell master
#更新源
$ sudo apt-get update
$ sudo apt-get install -y ca-certificates curl gnupg lsb-release
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
#安装containerd
$ sudo apt-get update
$ sudo apt-get install -y containerd.io
# 锁定 containerd.io 版本,可选
$ sudo apt-mark hold containerd.io
$ containerd config default | sudo tee /etc/containerd/config.toml
找到下面的配置项并修改。
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
重启 containerd 并设置 containerd 自启动。
$ sudo systemctl restart containerd.service
$ sudo systemctl enable containerd.service
#首先,为系统添加K8s GPG key:
$ sudo curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add
# 然后添加下面的安装源:
$sudo apt-add-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"
#安装k8s的重要组件
$ sudo apt-get install kubeadm kubelet kubectl -y
其他配置,有些不执行可能也没啥影响,不过尽量都执行下,避免遇到奇怪的问题
# 禁用swap
$ sudo swapoff -a
$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo modprobe br_netfilter
$ sudo echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
初始化master,下面的操作只在master上做
$ sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.25.0 --pod-network-cidr=172.26.0.1/16
# 如果上面的命令执行失败,可以通过kubeadm reset命令重置,解决问题后重试
执行成功后,最后会出现如下内容,记住复制一下,其他节点加入的时候执行该命令即可,执行时如果没有权限,加上sudo即可
kubeadm join 172.26.69.30:6443 --token 9cqm3d.0udl95kfp9kkb41p \
--discovery-token-ca-cert-hash sha256:20cbd3d899af003c3b73ef736ea720f9cffd23e3292fe354e33dd12619af2492
初始化master初始化完成后,会提示如下内容,对于maste节点,直接执行就行
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
对于work节点,如果需要执行kubectl命令,也需要执行上面的操作,由于没有/etc/kubernetes/admin.conf 文件,需要从master上拷贝该文件,可以新建一个,直接拷贝内容就行,然后执行上面的命令
执行成功后,在对应节点执行如下命令都是正常的,否则会报下面的错误
ubuntu@master:~$ kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
kube-flannel是kubenertes的网络管理组件,需要安装后master才能和各个节点正常通讯,如果不安装该组件,则通过 kubectl get nodes看到的节点都是NotReady状态
kube-flannel可以通过如下命令安装,不过由于需要,而且需要修改网络设置等问题,不推荐这种安装方式
#不推荐,需要,而且网络部分需要修改,建议将文件下载下来修改后再安装
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
可以上github下载该文件,其他地方下载的可能不是最新的,安装后容易出各种问题,下载地址
https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml
文件下载后,需要修改网络设置部分,如下,Network网段的值修改成初始化master时的 --pod-network-cidr一样即可
net-conf.json: |
{
"Network": "172.26.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
修改后,执行如下命令安装 kube-flannel组件即可
$ kubectl apply -f kube-flannel.yml
安装完成后,需要检查kube-flannel是否正常运行,可以通过如下命令查看pod的状态
#查看所有的pod,看其中kube-flannel相关的pod是否状态异常
$ kubectl get pod -A
异常情况
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-h2zjz 1/1 Running 2 (14s ago) 81s
kube-flannel kube-flannel-ds-pbhgw 0/1 CrashLoopBackOff 6 (111s ago) 8m53s
kube-system coredns-c676cc86f-bctmt 0/1 ContainerCreating 0 37m
其中kube-flannel-ds-pbhgw 的状态是CrashLoopBackOff,表示异常,可以查看日志
#查看日志
$ kubectl logs kube-flannel-ds-pbhgw -n kube-flannel
如果出现如下问题
Error registering network: failed to acquire lease: subnet "10.244.0.0/16" specified in the flannel net config doesn't contain "172.26.0.0/24" PodCIDR of the "master" node.
说明是网络配置出现问题,需要修改kube-flannel.yml 文件中的Network的值,参见上面的修改网络设置部分,然后执行kubectl apply -f kube-flannel.yml ,应用后需要等一段时间,再查看pod是否变成Running状态
在各个数据节点上执行节点命令,将节点加入集群中,该命令在主节点初始化完成后会有提示
$ sudo kubeadm join 172.26.69.30:6443 --token 9cqm3d.0udl95kfp9kkb41p \
--discovery-token-ca-cert-hash sha256:20cbd3d899af003c3b73ef736ea720f9cffd23e3292fe354e33dd12619af2492
在主节点执行如下命令
$ kubectl get nodes
#结果如下,可以看到节点都连上了
NAME STATUS ROLES AGE VERSION
master Ready control-plane 58m v1.25.0
node1 Ready 17m v1.25.0
node2 Ready 88s v1.25.0
#创建集群
$ kubectl create deployment nginx --image=nginx:1.14-alpine
#暴露端口
$ kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort
#查看服务
$ kubectl get svc
#输出如下
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 90m
nginx NodePort 10.101.33.142 80:31812/TCP 6m33s
#可以看到服务端口是31812
可以通过浏览器分别访问如下地址测试是否都正常
http://172.26.69.30:31812
http://172.26.70.162:31812
http://172.26.71.167:31812
以下全是废话,如果您比较忙的或者不想看的话,可以直接跳过。
不得不说,kubernets环境的搭建还是挺麻烦的,坑有点多,如果学习用,刚开始的时候还是通过Minikube来搭建比较方便。
不过由于Minikube是模拟环境,可能有些东西不一样,所以我想搭建一个类似生产的环境。而由于资源有限,所以选择在本机进行搭建。一开始的想法是通过docker来进行搭建。在docker里面安装docker来进行部署,但是问题比较多,比如在docker里运行ubuntu等系统,然后在里面在安装docker时出现安装完无法启动的问题。而docker:dind虽然能在docker里面运行docker,但由于外层的系统太过精简,什么都干不了,自己重新配置安装系统也很老火。于是就只能走虚拟机这条路了。
虚拟机方案虽然占用的资源比较多,但胜在稳定,网上相应的资料也多。而之所以选择multipass,是因为他足够轻量,在我的这个渣渣机器上能够跑起来三个节点(由于kubernetes的节点资源有要求)。multipass只能运行ubuntu系统,不过对于我们这个场景来说,已经够了。
kubernets以前的版本是兼容docker的,按网上的文章做了一遍,发现kubeadm init 的时候,一直有个地方卡住,具体记不清了,通过详细日志查看,卡在一个请求api server接口的地方,40秒超时。后来经过排查,发现是我安装的1.25不兼容docker了,导致kubernets的 相关组件运行不起来。
于是又将docker卸载掉,换成了containerd,据说可以通过安装一个中间层cri-docker来使kubernets能使用docke,不过没试过。感觉不如直接安装containerd省事。
kube-flannel的安装也是几经波折,由于官方地址https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml需要无法访问,于是就在网上搜索该文件,有的博主比较好心,把该文件贴在网上,我直接复制下来使用,于是坑就来了,安装后kube-flannel的几个pod死活启动不起来,查看日志发现问题如下
Failed to create SubnetManager: error retrieving pod spec for 'kube-system/kube-flannel-ds-amd64-6qrrv': pods "kube-flannel-ds-amd64-6qrrv" is forbidden: User "system:serviceaccount:kube-system:flannel" cannot get resource "pods" in API group "" in the namespace "kube-system"
看起来是权限的问题,由于不熟悉kubernets的权限管理问题,网上找了下,也没找到靠谱的方案。后来想想可能是版本的问题,又找到github,找到最新的文件,重试之后就可以了。
还有kube-flannel.yml是需要修改里面的网络部分的网段的,网上一般没说这个。如果不修改的花,一样会报错,你部署的服务也会启动不起来。
经过一番折腾后,kubernets在本地虚拟机上的集群总算是搭建起来了。不过由于每个人实际的情况和环境不一样。再加上各种组件的版本都在更新。网上的文档只能做参考,比如我写这篇文章时,这个搭建流程在我本地是可用的。但当你看到时,可能时过境迁,早已物逝人非,你一路搭建下来,可能会遇到很多我不曾遇到过的问题。就如我现在看别人的文章,别人没踩到的坑,我就踩到了,这时需要多搜多看,综合各种方案,最后才能形成一套可行的搭建流程。另外,官网也是一个重要的参考,遇事多看官网资料总没错。
-----------------------------------------------------------------------------------------------------------------------------------2022-09-10 中秋