k8s从入门到放弃
想在 k8s 上跑起我的Go项目,环境是 wsl2 ubuntu2204。记录下过程。
1. 准备环境
本地是 ubuntu2204,docker 已经装好了。缺 kubectl 和 kind。装一下。
# 装 kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version --client
# 装 kind
# curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.23.0/kind-linux-amd64
# 这命令有时候网络会抽风,多试一次
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.23.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
kind version
装完,起个 k8s 集群。
kind create cluster --name webook-cluster
检查一下:
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# webook-cluster-control-plane Ready control-plane 60s v1.30.0
集群好了。
2. 构建镜像,部署
项目里有 Makefile 和 Dockerfile。
Dockerfile 最开始是这样的:
FROM ubuntu:20.04
COPY webook /app/webook
WORKDIR /app
CMD ["./webook"]
k8s-webook-deployment.yaml 长这样:
apiVersion: apps/v1
kind: Deployment
metadata:
name: webook
spec:
replicas: 3
selector:
matchLabels:
app: webook
template:
metadata:
labels:
app: webook
spec:
containers:
- name: webook
image: flycash/webook:v0.0.1
imagePullPolicy: IfNotPresent
开始部署。
# 编译go程序,打docker镜像
make docker
# 把本地镜像加载到kind集群里
kind load docker-image flycash/webook:v0.0.1 --name webook-cluster
# 部署
kubectl apply -f k8s-webook-deployment.yaml
看下 pod 状态:
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# webook-bc48d7f84-2qtrk 0/1 CrashLoopBackOff 3 (16s ago) 55s
# webook-bc48d7f84-sqwpz 0/1 CrashLoopBackOff 3 (18s ago) 55s
# webook-bc48d7f84-w7fzp 0/1 Error 3 (41s ago) 55s
CrashLoopBackOff,崩了。
3. 排查问题
看日志
kubectl logs webook-bc48d7f84-2qtrk
拿到这个错误:
/app/webook: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /app/webook)
/app/webook: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by /app/webook)
看来不是大问题。编译环境是 ubuntu 2204,glibc 版本高,docker 镜像是 ubuntu:20.04,glibc 版本低,不兼容。
4. 解决问题
把 Dockerfile 的基础镜像换成 ubuntu:22.04。
FROM ubuntu:22.04
COPY webook /app/webook
WORKDIR /app
CMD ["./webook"]
然后重来一遍。
# 先删掉旧的
kubectl delete deployment webook
# 重新编译打包
make docker
# 重新加载镜像
kind load docker-image flycash/webook:v0.0.1 --name webook-cluster
# 重新部署
kubectl apply -f k8s-webook-deployment.yaml
再看 pod 状态。
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# webook-bc48d7f84-5wn9f 1/1 Running 0 11s
# webook-bc48d7f84-bxhmd 1/1 Running 0 11s
# webook-bc48d7f84-vlxtm 1/1 Running 0 11s
Running了,成功了。
5. 访问服务
应用日志显示监听 8080 端口。
kubectl logs webook-bc48d7f84-5wn9f
# ...
# [GIN-debug] Listening and serving HTTP on :8080
用 port-forward 把 pod 里的 8080 端口映射到本地。
格式是 kubectl port-forward <pod/deployment> <本地端口>:<pod内端口>。
# 把本地的 7070 端口映射到 pod 里的 8080
kubectl port-forward deployment/webook 7070:8080
开个新终端测一下。
curl http://localhost:7070/hello
能通就行。我这里路由没配,404 正常。
总结
CrashLoopBackOff 先看日志。
glibc 版本不匹配是个坑,保持编译和运行环境的系统版本一致能解决此问题,或者可以考虑静态编译。

浙公网安备 33010602011771号