在kind运行简单的容器

采用 Alpine Docker镜像 来从0开始一步步完成完整的应用服务器运行集群: 将我的 云图 – 云计算图志 WEB网站( Sphinx文档 )部署到 Kubernetes Atlas 模拟 kind(本地docker模拟k8s集群) 集群中,作为 workload resources(工作负载资源) 运行…

准备工作

执行kind-with-registry-arm.sh创建具备本地Registry的kind多节点集群
cd /home/huatai/docs/github.com/cloud-atlas/source/kubernetes/kind/kind_local_registry
./kind-with-registry-arm.sh
创建具备nginx的alpine linux镜像并推送到本地Registry
cd /home/huatai/docs/github.com/cloud-atlas/source/docker/images/alpine_docker_image/alpine-nginx
docker build -t alpine-nginx .
# 推送镜像到kind的local registry
docker tag alpine-nginx localhost:5001/alpine-nginx:20221126-01
docker push localhost:5001/alpine-nginx:20221126-01

运行容器

简单运行2个pod的deployment-simple.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: alpine-nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: localhost:5001/alpine-nginx:20221126-01
        ports:
        - containerPort: 80
  • 部署采用 kubectl create :

kubectl执行部署
kubectl create -f deployment-simple.yaml

pod创建问题排查

  • 检查:

    kubectl get pods -o wide
    

可以看到:

NAME                               READY   STATUS             RESTARTS      AGE    IP           NODE          NOMINATED NODE   READINESS GATES
nginx-deployment-c64787574-j5hsl   0/1     CrashLoopBackOff   4 (31s ago)   2m4s   10.244.3.3   dev-worker2   <none>           <none>
nginx-deployment-c64787574-n6wvw   0/1     CrashLoopBackOff   4 (27s ago)   2m4s   10.244.5.2   dev-worker4   <none>           <none>

启动失败 CrashLoopBackOff ,参考 Kubernetes pod CrashLoopBackOff错误排查

  • 检查pod详情采用 kubectl describe pods 命令:

    kubectl describe pods nginx-deployment-c64787574-j5hsl
    

可以看到事件如下:

Events:
  Type     Reason     Age                    From               Message
  ----     ------     ----                   ----               -------
  Normal   Scheduled  3m45s                  default-scheduler  Successfully assigned default/nginx-deployment-c64787574-j5hsl to dev-worker2
  Normal   Pulling    3m45s                  kubelet            Pulling image "localhost:5001/alpine-nginx:20221126-01"
  Normal   Pulled     3m45s                  kubelet            Successfully pulled image "localhost:5001/alpine-nginx:20221126-01" in 138.657406ms
  Normal   Created    2m13s (x5 over 3m45s)  kubelet            Created container nginx
  Normal   Started    2m13s (x5 over 3m45s)  kubelet            Started container nginx
  Normal   Pulled     2m13s (x4 over 3m44s)  kubelet            Container image "localhost:5001/alpine-nginx:20221126-01" already present on machine
  Warning  BackOff    2m12s (x9 over 3m43s)  kubelet            Back-off restarting failed container

为何启动容器失败?

需要注意到Kubernetes需要能够正确诊断容器启动状态 Kubernetes健康检测 ,这里检测 liveness 就是通过端口服务完成检测。

但是,很不巧 NGINX服务 alpine-nginx 所使用的 Alpine Linux 发行版提供的 Nginx 软件包,默认采用了一个禁止访问的 default.conf 配置。这个 404 返回页面会使得 Kubernetes健康检测 失败。

检查

NGINX服务 alpine-nginx 配置正确,能够在 kind(本地docker模拟k8s集群) 集群中运行简单的nginx服务之后,此时检查:

kubectl get pods

就能看到:

NAME                                       READY   STATUS    RESTARTS   AGE
alpine-nginx-deployment-7cb557b55b-6jdj8   1/1     Running   0          32m
alpine-nginx-deployment-7cb557b55b-9zt6q   1/1     Running   0          32m

下一步

下面我们来构建:

  • 使用 Btrfs NFS 提供共享存储

  • 配置 在Kubernetes中部署NFS 将共享卷中我的 cloud-atlas build好的html作为NGINX的目录(配置和上文Docker运行方式类似)