不用 Docker Desktop 在 Windowns/WSL 下使用 Docker +Kubernetes : 三、问题总结

编程入门 行业动态 更新时间:2024-10-14 04:24:28

不用 Docker <a href=https://www.elefans.com/category/jswz/34/1767576.html style=Desktop 在 Windowns/WSL 下使用 Docker +Kubernetes : 三、问题总结"/>

不用 Docker Desktop 在 Windowns/WSL 下使用 Docker +Kubernetes : 三、问题总结

一、Kind方式安装K8S后续

书接上回《不用Docker Desktop在Windows下基于WSL中的Docker安装Kubernetes: 上篇》
当按上篇安装完毕后有一些问题,同时WSL安装完后也有一些问题,我统一记录到这里,方便查阅:

二、问题列表:

1.如果想使用Ingress Controller,需要独立安装1

可通过下面yaml文件直接部署ingress controller。实际上该文件是创建了个命名空间ingress-nginx,并在这个namespace下建了一堆资源。其他命名空间使用Ingress Controller时调用该命名空间下的东西。

kubectl apply -f .yaml
# 等到安装成功
kubectl wait --namespace ingress-nginx \--for=condition=ready pod \--selector=app.kubernetes.io/component=controller \--timeout=90s

安装后可以部署一个简单的实例,看看有没有报错信息:

kind: Pod
apiVersion: v1
metadata:name: foo-applabels:app: foo
spec:containers:- command:- /agnhost- netexec- --http-port- "8080"image: registry.k8s.io/e2e-test-images/agnhost:2.39name: foo-app
---
kind: Service
apiVersion: v1
metadata:name: foo-service
spec:selector:app: fooports:# Default port used by the image- port: 8080
---
kind: Pod
apiVersion: v1
metadata:name: bar-applabels:app: bar
spec:containers:- command:- /agnhost- netexec- --http-port- "8080"image: registry.k8s.io/e2e-test-images/agnhost:2.39name: bar-app
---
kind: Service
apiVersion: v1
metadata:name: bar-service
spec:selector:app: barports:# Default port used by the image- port: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: example-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:rules:- http:paths:- pathType: Prefixpath: /foo(/|$)(.*)backend:service:name: foo-serviceport:number: 8080- pathType: Prefixpath: /bar(/|$)(.*)backend:service:name: bar-serviceport:number: 8080

我这一直起不来,顺着找到了新部署的ingress controller上,用kubectl get pod -n ingress-nginx查看三个pod,一个没起来。用kubectl logs查看pod日志,都卡在镜像下载上,说明镜像下不来啊。
打开上面那个ingress controller的部署yaml文件,找到需要两个镜像:

  • registry.k8s.io/ingress-nginx/controller:v1.7.0
  • registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794

用docker pull试着拉,就报下面x509的错误了。按下面操作设置好后,docker可以下载了。但是k8s还是不能下载。

2.下载部分镜像时,会报错误“x509: certificate signed by unknown authority”

进入WSL中,查看/etc/docker/daemon.json文件,如果没有新建就可以了。添加以下内容,可以看到是个数组,就是用docker pull报x509错误的地址写到这里就可以了,docker就会认为是私有镜像,不会做验证了:

{"insecure-registries":["registry.k8s.io","registry-hangzhou.aliyuncs"]
}

3.Kind方式安装的K8S,无法直接使用WSL下Docker中的镜像

默认kind方式安装的K8S,只能使用网络上的镜像,即外网或局域网能够访问到的非本地电脑。就是说同时安装kind+k8s和docker的这台电脑,k8s和docker是没法共享镜像的,又一个大坑啊!!!我记得在Desktop版的Docker中开启Kubernates后,K8S默认就可以使用Docker中下载的镜像。
要想让K8S使用Docker中镜像,目前有两个方法:

1.local register

查看下Kind官网2,其实可以自己先手动用docker创建个local registry,然后在创建k8s集群的时候手动指定就行。估计Kind开发者也觉得这个比较麻烦,以后可能会作为内置功能,默认提供。

# 1.安装local registry
ps > docker run -d --restart=always -p "127.0.0.1:50000:5000" --name "kind-registry" registry:2
# 2.修改kind的cluster config文件,添加如下部分:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-[plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:50000"]endpoint = ["http://kind-registry:5000"]
# 3.根据config文件创建k8s集群
ps > kind create cluster --config=cluster-config.yaml
# 4.连接registry到docker的network kind
ps > docker network connect "kind" "kind-registry"

然后就可以直接使用了:

# 1.将docker中的镜像打上local registry的标签
docker tag registry.k8s.io/ingress-nginx/controller:v1.7.0 localhost:50000/ingress-nginx/controller:v1.7.0
# 2.将打好标签的镜像推到local registry上
docker push localhost:50000/ingress-nginx/controller:v1.7.0
# 3.修改需要部署的yaml文件,image对应的地址改成localhost:50000,
# 例如上面的ingress controller中的镜像地址registry.k8s.io/ingress-nginx/controller:v1.7.0,
# 改为localhost:50000/ingress-nginx/controller:v1.7.0。
# 保存后部署,即可使用local registry中的镜像了

2.kind load

查看Kind帮助命令,有一个kind load,他的作用就是将host中的镜像加载进kind node。

ps > kind load --help
Loads images into node from an archive or image on hostUsage:kind load [flags]kind load [command]Available Commands:docker-image  Loads docker images from host into nodesimage-archive Loads docker image from archive into nodesFlags:-h, --help   help for loadGlobal Flags:--loglevel string   DEPRECATED: see -v instead-q, --quiet             silence all stderr output-v, --verbosity int32   info log verbosity, higher value produces more output

两个命令,分别是docker-image,通过名称直接加载docker中镜像,多个镜像可用空格隔开。然后是image-archive,加载打包后的镜像tar文件即可。

4.local registry使用

    1. 查询、删除镜像
#查询镜像
curl  <仓库地址>/v2/_catalog#查询镜像tag(版本)
curl  <仓库地址>/v2/<镜像名>/tags/list#删除镜像API
curl -I -X DELETE "<仓库地址>/v2/<镜像名>/manifests/<镜像digest_hash>"#获取镜像digest_hash
curl  <仓库地址>/v2/<镜像名>/manifests/<tag> \--header "Accept: application/vnd.docker.distribution.manifest.v2+json"
    1. 开启registry的删除功能
#查看默认配置
docker exec -it  registry sh -c 'cat /etc/docker/registry/config.yml'
#开启删除(添加  delete: enabled: true)
docker exec -it  registry sh -c "sed -i '/storage:/a\  delete:' /etc/docker/registry/config.yml"
docker exec -it  registry sh -c "sed -i '/delete:/a\    enabled: true' /etc/docker/registry/config.yml"
#重启
docker restart registry

4.重启电脑时,docker及k8s服务如何开启

每次重启了电脑后,查看wsl状态,默认都是Stopped状态。

wsl -l -vNAME      STATE           VERSION
* Debian    Stopped         2Ubuntu    Stopped         2

用docker images命令查看,也会提示无法连接docker服务。
不过这时再查看wsl -l -v,装着docker服务的那个Ubuntu已经变成了Running状态了,再用docker images命令查看,还是无法连接到docker服务。进入wsl,用命令sudo service docker status 查看docker服务,没有启动的。
使用sudo service docker start启动docker服务即可。
而kind安装的k8s不用另外启动服务,因为它都在镜像kindest/node对应的那个容器中,只要docker服务启动了,这个容器默认就会自动起来的。

三、参考文章:


  1. ↩︎

  2. / ↩︎

更多推荐

不用 Docker Desktop 在 Windowns/WSL 下使用 Docker +Kubernetes : 三、问题总结

本文发布于:2024-03-13 05:48:43,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1733320.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Desktop   Docker   Windowns   Kubernetes   WSL

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!