k8s 探索6:运行一个「无状态」的应用

k8s 探索6:运行一个「无状态」的应用

🎈「k8s 探索」系列:

前面经过那么多工作,终于把 k8s 稳定的运行起来了,一切准备就绪,现在我们把一个简单的应用部署到 k8s 集群中去。

1 准备工作

先来介绍一下这个应用,它非常简单,只有一个静态的前端页面,里面写着 hi k8s,我们最终可以通过浏览器访问到它。

web demo

首先得把这个页面用 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
# service/web-demo created
# deployment.apps/web-demo created

# 查看 pod 状态
kubectl get pod -l app=web-demo
# NAME READY STATUS RESTARTS AGE
# web-demo-8799f89cd-mnc6c 0/1 ImagePullBackOff 0 29s
# web-demo-8799f89cd-sxwc6 0/1 ImagePullBackOff 0 29s

如果按照上述操作,就会出现 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:v1image: 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/ 可以看到下面这样的页面。

web demo

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 探索」系列:

k8s 探索6:运行一个「无状态」的应用

https://blog.ailln.com/v2ai/2021/09/05/cloud-native/6-k8s-exploration-6/

作者

Ailln

发布于

2021-09-05

更新于

2024-03-02

许可协议

评论