书接上回《不用Docker Desktop在Windows下基于WSL中的Docker安装Kubernetes: 上篇》
当按上篇安装完毕后有一些问题,同时WSL安装完后也有一些问题,我统一记录到这里,方便查阅:
可通过下面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文件,找到需要两个镜像:
用docker pull试着拉,就报下面x509的错误了。按下面操作设置好后,docker可以下载了。但是k8s还是不能下载。
进入WSL中,查看/etc/docker/daemon.json文件,如果没有新建就可以了。添加以下内容,可以看到是个数组,就是用docker pull报x509错误的地址写到这里就可以了,docker就会认为是私有镜像,不会做验证了:
{
"insecure-registries":["registry.k8s.io","registry.cn-hangzhou.aliyuncs.com"]
}
默认kind方式安装的K8S,只能使用网络上的镜像,即外网或局域网能够访问到的非本地电脑。就是说同时安装kind+k8s和docker的这台电脑,k8s和docker是没法共享镜像的,又一个大坑啊!!!我记得在Desktop版的Docker中开启Kubernates后,K8S默认就可以使用Docker中下载的镜像。
要想让K8S使用Docker中镜像,目前有两个方法:
查看下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中的镜像了
查看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文件即可。
#查询镜像
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"
#查看默认配置
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
每次重启了电脑后,查看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服务启动了,这个容器默认就会自动起来的。
https://kind.sigs.k8s.io/docs/user/ingress/#setting-up-an-ingress-controller ↩︎
https://kind.sigs.k8s.io/docs/user/local-registry/ ↩︎