不用 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 https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.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-app
  labels:
    app: foo
spec:
  containers:
  - command:
    - /agnhost
    - netexec
    - --http-port
    - "8080"
    image: registry.k8s.io/e2e-test-images/agnhost:2.39
    name: foo-app
---
kind: Service
apiVersion: v1
metadata:
  name: foo-service
spec:
  selector:
    app: foo
  ports:
  # Default port used by the image
  - port: 8080
---
kind: Pod
apiVersion: v1
metadata:
  name: bar-app
  labels:
    app: bar
spec:
  containers:
  - command:
    - /agnhost
    - netexec
    - --http-port
    - "8080"
    image: registry.k8s.io/e2e-test-images/agnhost:2.39
    name: bar-app
---
kind: Service
apiVersion: v1
metadata:
  name: bar-service
spec:
  selector:
    app: bar
  ports:
  # Default port used by the image
  - port: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - http:
      paths:
      - pathType: Prefix
        path: /foo(/|$)(.*)
        backend:
          service:
            name: foo-service
            port:
              number: 8080
      - pathType: Prefix
        path: /bar(/|$)(.*)
        backend:
          service:
            name: bar-service
            port:
              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.cn-hangzhou.aliyuncs.com"]
}

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 host

Usage:
  kind load [flags]
  kind load [command]

Available Commands:
  docker-image  Loads docker images from host into nodes
  image-archive Loads docker image from archive into nodes

Flags:
  -h, --help   help for load

Global 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/ \
    --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 -v
  NAME      STATE           VERSION
* Debian    Stopped         2
  Ubuntu    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. https://kind.sigs.k8s.io/docs/user/ingress/#setting-up-an-ingress-controller ↩︎

  2. https://kind.sigs.k8s.io/docs/user/local-registry/ ↩︎

你可能感兴趣的:(kubernetes,docker,windows,容器)