🎈「k8s 探索」系列:
前面经过那么多工作,终于把 k8s 稳定的运行起来了,一切准备就绪,现在我们把一个简单的应用部署到 k8s 集群中去。
1 准备工作 先来介绍一下这个应用,它非常简单,只有一个静态的前端页面,里面写着 hi k8s
,我们最终可以通过浏览器访问到它。
首先得把这个页面用 html 写出来,其实很简单,只有一行代码。
1 2 3 4 5 6 7 8 9 # 创建项目文件 mkdir -p $HOME/workspace/web-demo # 创建静态文件 cd $HOME/workspace/web-demo vim index.html # 文件内容 <h1>hi k8s</h1> # 保存并退出 :wq
这样我们就创建好了应用,接下来编写 Docker 的配置文件,将应用打包成镜像。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 编写 dockerfile vim Dockerfile # 文件内容 FROM python:3.8.12-slim WORKDIR /app COPY ./index.html /app/index.html CMD python -m http.server # 保存并退出 :wq # 构建镜像 docker build -t web-demo:v1 . # 查看镜像 docker images | grep web-demo # web-demo v1 f26586b7**** 1 hours ago 114MB
到这里准备工作基本完成了,接下来就是把这个镜像部署到 k8s 集群中去。
2 运行应用 k8s 通过一个 yaml 格式的配置来管理应用,下面是这次要使用的配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 apiVersion: v1 kind: Service metadata: name: web-demo spec: type: NodePort ports: - port: 8000 nodePort: 30005 selector: app: web-demo --- apiVersion: apps/v1 kind: Deployment metadata: name: web-demo spec: selector: matchLabels: app: web-demo replicas: 2 template: metadata: labels: app: web-demo spec: containers: - name: web-demo image: web-demo:v1 ports: - containerPort: 8000
使用 kubectl
命令来创建这个配置,这个命令会创建一个 Service
和一个 Deployment
。
1 2 3 4 5 6 7 8 9 kubectl apply -f deployment.yaml kubectl get pod -l app=web-demo
如果按照上述操作,就会出现 ImagePullBackOff
这个错误,是因为 k8s 没能正确拉取到这个镜像。
有两种解决方法,一种是把镜像传到 docker hub 中,一种就是上传到自己的镜像仓库。我这种爱折腾的人肯定选择自建镜像仓库啦!
1 2 3 4 5 6 7 8 9 10 11 12 # 在主服务器上创建镜像仓库 docker run -d -p 5000:5000 --restart=always --name local-registry registry:2 # 设置 docker 允许 http 访问 # 在三台服务器都要修改 docker 的配置文件,这里假设主服务器的 host 为 192.168.0.1 sudo vim /etc/docker/daemon.json # 添加文件内容 { "insecure-registries": ["192.168.0.1:5000"] } sudo systemctl daemon-reload sudo service docker restart
上述操作搞定后,我们把镜像上传到镜像仓库中。
1 2 docker tag web-demo:v1 192.168.0.1:5000/web-demo:v1 docker push 192.168.0.1:5000/web-demo:v1
然后修改 deployment.yaml 文件中的 image: web-demo:v1
为 image: 192.168.0.1:5000/web-demo:v1
,重新应用一下配置。
1 2 3 4 5 6 7 8 kubectl apply -f deployment.yaml # service/web-demo unchanged # deployment.apps/web-demo configured kubectl get pod -l app=web-demo # NAME READY STATUS RESTARTS AGE # web-demo-865b4b9b5f-xsx4j 1/1 Running 0 63s # web-demo-865b4b9b5f-zv6jj 1/1 Running 0 48s
恭喜你!应用已经成功运行起来了。
此时你通过访问 http://192.168.0.1:30005/ 可以看到下面这样的页面。
3 删除 Registry 中镜像 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 查看仓库里有哪些镜像 curl 192.168.0.1:5000/v2/_catalog # 找到镜像的存储位置 docker inspect local-registry # 在 Mount 中找到 # "Source" : "/var/lib/docker/volumes/07ebxxxx/_data" ,# "Destination" : "/var/lib/registry" ,# 类似数据 cd /var/lib/docker/volumes/07ebxxxx/_data/ cd ./docker/registry/v2/repositories/ # 删除无用镜像仓库 rm -rf web-demo # 此时只是删掉了这个库的基本信息,而镜像的二进制文件还在 # 我们通过命令 garbage-collect 自动清理 docker exec -it local-registry /bin/registry garbage-collect /etc/docker/registry/config.yml
4 参考
🎈「k8s 探索」系列: