码农行者 码农行者
首页
  • Python

    • 语言特性
    • Django相关
    • Tornado
    • Celery
  • Golang

    • golang学习笔记
    • 对比python学习go
    • 模块学习
  • JavaScript

    • Javascript
  • 数据结构预算法笔记
  • ATS
  • Mongodb
  • Git
云原生
运维
垃圾佬的快乐
  • 数据库
  • 机器学习
  • 杂谈
  • 面试
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

DeanWu

软件工程师
首页
  • Python

    • 语言特性
    • Django相关
    • Tornado
    • Celery
  • Golang

    • golang学习笔记
    • 对比python学习go
    • 模块学习
  • JavaScript

    • Javascript
  • 数据结构预算法笔记
  • ATS
  • Mongodb
  • Git
云原生
运维
垃圾佬的快乐
  • 数据库
  • 机器学习
  • 杂谈
  • 面试
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • k3s 中 selflink 问题排查解决

    • 问题描述
      • 原因分析
        • 解决方案
        • 云原生
        • k3s
        DeanWu
        2022-02-14
        目录

        k3s 中 selflink 问题排查解决

        # 问题描述

        在部署 statefulset 类型的工作负载时,动态创建 PV/PVC 是一种比较常用的配置方式,动态创建 PV/PVC 的方法基本如下:

        • 1、创建自己的 StorageClass 备用。
        • 2、创建 statefulset ,在 yaml 文件的 volumeClaimTemplates 块,添加 StorageClass 的名字。

        说回今天遇到的问题,在部署 VictoriaMetric 时,想使用阿里云的 nfs 做为外部存储,以进一步提高可用性。先使用 mysql 的 demo 案例(yaml 示例见这里 k8s-yaml-hub (opens new window)),来测试下 statefulset 的在使用 nfs 时的分部情况。

        一直启动不动来,查看 pvc 和 pods 信息如下:

        • 1、PVC 一直处于 pending 状态;
        • 2、mysql pods 显示:0/3 nodes are available: 3 pod has unbound immediate PersistentVolumeClaims. QQ20220215-092444@2x

        # 原因分析

        从上边的现象来看,是 PVC 没有创建成功,动态 PVC 中,是 provisioner 中来负责创建,查看其日志,看到如下错误信息:

        I0214 10:22:35.436913 1 controller.go:1068] scheduleOperation[provision-mysql-sts/mysql-pvc-mysql-0[ac333031-e705-48d9-8180-4d2d583bb559]]
        E0214 10:22:35.444757 1 controller.go:766] Unexpected error getting claim reference to claim "mysql-sts/mysql-pvc-mysql-0": selfLink was empty, can't make reference
        
        1
        2

        Google 之后,很多人遇到了同样的问题,主要原因是,官方在 k8s 1.20 中基于对性能和统一apiserver调用方式的初衷,移除了对 SelfLink 的支持,而 nfs-provisioner 需要 SelfLink 该项功能。具体计划和原因可查看这个issue (opens new window) 和 KEP (opens new window)。

        K3S 为兼容 K8S 应该也继承了该项修改,按 K8S 的方式修改测试了下,完美解决。

        # 解决方案

        解决问题主要有下边两种方式:

        1、修改 apiserver 的配置文件,重新启用 SelfLink 功能。针对 K8S,可添加如下配置:

        # /etc/kubernetes/manifests/kube-apiserver.yaml
        
        spec:
          containers:
          - command:
            - kube-apiserver
            ...
            - --feature-gates=RemoveSelfLink=false # 增加
        
        1
        2
        3
        4
        5
        6
        7
        8

        K3S 中没有 apiserver 的配置文件,可通过 systemd 的启动文件添加该参数,如下:

        # /etc/systemd/system/k3s.service
        
        ExecStart=/usr/local/bin/k3s \
            server \
                ...
                '--kube-apiserver-arg' \   # 新增
                'feature-gates=RemoveSelfLink=false' \  # 新增
        
        1
        2
        3
        4
        5
        6
        7

        若为新安装,可如下启用:

        $ curl -sfL https://get.k3s.io | sh -s - --kube-apiserver-arg "feature-gates=RemoveSelfLink=false"
        
        1

        2、使用新的不基于 SelfLink 功能的 provisioner 镜像,重新创建 provisioner 容器。

        若你能科学上网,可使用这个镜像:

        gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0
        
        1

        国内可使用这个镜像:

        registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0
        
        1

        记录备查,希望对你有帮助。

        #Kubernetes#k3s
        上次更新: 2023/03/19, 15:09:33
        最近更新
        01
        chromebox/chromebook 刷bios步骤
        03-01
        02
        redis 集群介绍
        11-28
        03
        go语法题二
        10-09
        更多文章>
        Theme by Vdoing | Copyright © 2015-2024 DeanWu | 遵循CC 4.0 BY-SA版权协议
        • 跟随系统
        • 浅色模式
        • 深色模式
        • 阅读模式