k8s从入门到放弃

想在 k8s 上跑起我的Go项目,环境是 wsl2 ubuntu2204。记录下过程。

1. 准备环境

本地是 ubuntu2204docker 已经装好了。缺 kubectlkind。装一下。

# 装 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. 构建镜像,部署

项目里有 MakefileDockerfile

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 版本不匹配是个坑,保持编译和运行环境的系统版本一致能解决此问题,或者可以考虑静态编译。

posted @ 2025-09-13 21:24  KBZ232  阅读(9)  评论(0)    收藏  举报