当前位置: 首页 > 科技观察

实物:如何快速搭建本地K8s开发环境?

时间:2023-03-18 20:52:46 科技观察

上一篇我们讲了k8s中的扩展点。在开始Operator的开发之前,我们需要先搭建本地环境。在开始依赖检查之前,我们需要先进行检查。1.是否安装了Docker环境如果没有安装Mac/Windows的用户可以直接安装DockerDesktop。Windows用户推荐使用WSL22。是否安装了Golang环境,Go版本最好>=1.15。如果没有,可以参考官方文档进行安装。2、使用Kind搭建本地开发环境2.1安装如果本地有Golang环境,可以直接执行如下命令安装GO111MODULE="on"gogetsigs.k8s.io/kind@v0.10.0&&kindcreatecluster如果没有如果不想通过源码安装,可以查看官方文档,直接安装编译好的二进制文件。执行以下命令可以输出kind的版本,说明安装了?kindversionkindv0.10.0go1.16linux/amd642.2创建K8s集群使用以下命令创建一个简单的单节点K8s集群nodecreateclutser的创建时间集群和你的网络环境和机器Kind会去dockerhub拉取kindest/node镜像。此图像大小约为400M。当出现如下提示时,表示集群已经创建。?kindcreateclusterCreatingcluster"kind"...?Ensuringnodeimage(kindest/node:v1.20.2)🖼?准备节点📦?写配置📜?启动控制平面🕹xtto"kind-kind"您现在可以使用您的集群:kubectlcluster-info--contextkind-kind感谢您使用kind!😊我们可以使用kindgetclusters来获取我们创建的集群列表,kind支持创建多个集群,默认名称是不手动指定的对于kind,我们也可以在创建集群时使用--name指定集群名称如下.kindcreatecluster--namemohuishou可以看到我们两个集群都创建好了deleteclustersmohuishou删除刚刚创建的集群2.3使用集群先看看kubectl的常用命令能不能正常使用,部署一个简单的web服务试试看集群信息?kubectlcluster-info--contextkind-kindKubernetesmasterisrunningathttps://127.0.0.1:41801KubeDNisisrunningathttps://127.0.0.1:41801/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTofurtherdebuganddiagnoseclusterklusterkclects,使用'-信息转储'。可以看到我们的k8smaster地址和dns地址,注意一般我们只创建一个集群,不指定--context集群名,但这基本是创建多个集群时必备的命令如果不加这个参数,可能会报如下错误Theconnectiontotheserverlocalhost:8080wasrefused-didyouspecifytherighthostorport?这是因为kubectl默认连接的apiserver地址是localhost:8080,而我们的apiserver地址不是这个,所以报错。为什么我们使用--contextcluster-name?这是因为kind在创建集群的时候会修改$HOME/.kube/config的配置,自动写入集群的apiserver地址,证书等相关信息,每个命令都要加上这个参数,太麻烦了。我们可以使用kubectlconfiguse-contextcontext-name来设置它。设置好之后,我们就不用每次都加上-context参数了。同时你也可以通过kubectlconfigcurrent-context来查询我们当前默认运行的是哪个集群。查看集群节点列表发现我们部署的是单节点v1.20.2集群?kubectlgetnoNAMESTATUSROLESAGEVERSIONkind-control-planeReadycontrol-plane,master20mv1.20.2部署一个Nginx服务使用如下代码创建一个nginx.yml文件,然后使用kubectlapply-fnginx.yml完成部署apiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploymentlabels:app:nginxspec:replicas:3selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:-name:nginximage:nginx:1.14.2ports:-containerPort:80Viewthestatusofthecurrentdeployment?kubectlgetdeploymentNAMEREADYUP-TO-DATEAVAILABLEAGEnginx-deployment0/33039sViewthestatusofthepod?kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEnginx-deployment-66b6c48dd5-2s5cb1/1Running084snginx-deployment-66b6c48dd5-8wf8b1/1Running084snginx-deployment-66b6c48dd5-zc6vd1/1Running084s由于我们没有暴露服务,所以不能直接访问对应的服务。我们可以利用kubectl提供的端口转发功能将流量从本地转发到k8s集群?kubectlport-forwardnginx-deployment-66b6c48dd5-2s5cb30080:80Forwardingfrom127.0.0.1:30080->80Forwardingfrom[::1]:30080->80Handlingconnectionfor30080当我们访问http://localhost:30080时,会发现这个熟悉的nginx界面image-20210424210804343发现我们的集群已经准备好使用2.4高级使用2.4.1创建多节点集群样。默认情况下,会创建一个单节点集群。我们可以通过修改配置来创建一个高可用的集群。我们创建一个3masters节点,一个由两个worker节点组成的集群kindcreatecluster--namemohuishou-ha--configkind-ha.ymlkind:ClusterapiVersion:kind.x-k8s.io/v1alpha4nodes:-role:control-plane-role:control-plane-role:control-plane-role:worker-role:worker可以通过查看节点mohuishou-ha-control-plane3Readycontrol-plane,master13mv1.20.2mohuishou-ha-workerReady5m52sv1.20.2mohuishou-ha-worker2Ready5m52sv1.20.22.4.2LoadImage一般来说,我们在k8s部署应用的时候,需要先把容器镜像推送到镜像仓库,这样在本地开发的时候就会会比较麻烦,尤其是图片比较大的时候,会有两次往返的网络消耗。为了解决这个问题,我们可以使用kindloadimage的功能,直接加载图片kindloaddocker-imagemy-custom-image-0my-custom-image-1--namekind坑攻略:加载镜像成功,但是pod部署报错Failedtopulimage"controller:latest":rpcerror:code=Unknowndesc=failedtopullandunpackimage"docker.io/library/controller:latest":failedtoresolverreference"docker.io/library/controller:latest":pullaccessdenied,repositorydoesnotexistormayrequireauthorization:servermessage:insufficient_scope:authorizationfailed这个问题之前困扰我很久了,还是有点坑1.进入节点查看:镜像是否存在获取节点名称?kubectlgetnodesNAMESTATUSROLESAGEVERSIONkind-control-planeReadycontrol-plane,master2d1hv1.20.2进入终端dockerexec-itkind-control-planebash查看镜像是否存在,kind创建的集群使用containerd,所以我们使用crictl命令获取crictlimg|grepcontrollerdocker.io/library/controllerlatest421cbf77618ba72.1MB2。如果镜像存在,也就是我们上面看到的,那么我们需要检查我们部署的yaml文件kubectl-nnode-pool-operator-systemgetdeployment-oyaml|grepimagePullPolicy是否存在:imagePullPolicy:Always如果不存在,如果你改yaml,默认就是这个配置。这个配置会导致每次去镜像仓库拉取镜像,改成imagePullPolicy:IfNotPresent没问题。3、如果镜像不存在:此时检查是否指定了cluster-name。如果有多个集群,可能加载不到我们想要的集群。添加--namecluster-name可以总结一下那种其实在创建集群的时候用的是kubeadm,所以也可以通过修改kubeadm的配置来修改默认的镜像地址,节点标签taint等信息。另外,你还可以配置PV/PVCCNI插件等配置,需要的话可以参考kind的官方文档。但是,需要注意的是,kind不支持向正在运行的集群添加节点。如果需要多节点集群,需要提前规划好节点数量。参考种类–配置https://kind.sigs。k8s.io/docs/user/configuration/DockerDesktophttps://www.docker.com/products/docker-desktopWSL2https://docs.microsoft.com/en-us/windows/wsl/install-win10入门-go.devhttps://learn.go.dev/使用Kind构建本地Kubernetes集群https://segmentfault.com/a/1190000018720465