在tidb-operator部署的时候遇到的问题

咨询一个问题,在离线的k8s环境中部署tidb集群遇到的(注意是离线的内网环境!!!) ,提示tidb-scheduler拉镜像没拉成功 ,出现在部署tidb-operator的时候,yaml配置文件中需要load一个kube-scheduler的镜像包。

1赞

看着像 pull 镜像慢,因为是国外的源,慢可能是预期的情况。

你好,我这里所有的镜像都是从外网pull回来,然后load到自己搭的一个离线k8s环境中的,不是通过源地址直接去外网pull image的

麻烦看下 tidb-scheduler 这个 Pod 所使用的 image,并确实是否能在你们的服务器环境上拉取:

kubectl get po -n tidb-admin tidb-scheduler-6c478bb4fd-bpd7x -oyaml | grep image

image 设置还是不对,需要修改这两个参数:https://github.com/pingcap/tidb-operator/blob/master/charts/tidb-operator/values.yaml#L61-L63

例如修改为:

  kubeSchedulerImageName: myregistry.com/kube-scheduler
  # This will default to matching your kubernetes version
  kubeSchedulerImageTag: v1.13.3

你好,我比较了下把tag加上,name保持一致,貌似没效果 状态还是imagepullbackoff

你好,我后面又遇到一个问题,三个tidb-cluster-pd的状态为pending,我看了一下原因显示

接上没写完的一段话 ,敲 kubectl get po tidb-cluster-pd-0 -n tidb-admin -o yaml 提示

但我查了下 kube-system中三个volume的状态为running。

你好 我查了一下,应该是本地pv配置没配,我目前看教程不太了解本地pv咋配置

这个 kubeSchedulerImageName 镜像还是 k8s.gcr.io/kube-scheduler,这个镜像在国内是访问不了的,这个需要换成国内的镜像:

registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler

详细的文档请参考:https://pingcap.com/docs-cn/v3.0/tidb-in-kubernetes/deploy/tidb-operator/#安装-tidb-operator

并且注意 yaml 格式缩进正确。

本地 PV 配置请参考文档:https://pingcap.com/docs-cn/v3.0/tidb-in-kubernetes/reference/configuration/storage-class/#本地-pv-配置

这个文档我看了啊,表示没看懂该如何操作配置本地pv。。

详细得看 local-static-provisioner 仓库里的文档,以及 Kubernetes 里官方文档。 后面我们把典型的部署与配置方法整理下。

这个问题回复里能麻烦直接把在离线场景(无外网环境)下pv的本地配置化教程给出来吗?目前自己没搞定

这里有一个部署例子。https://github.com/pingcap/tidb-operator/blob/master/manifests/local-dind/local-volume-provisioner.yaml

其中部署镜像,需要访问外网。这个没办法。如果 node 节点无法访问外网,需要将 “quay.io/external_storage/local-volume-provisioner:v2.3.2” 推送到你们的内网 docker 镜像仓库这类地方。

机器上配置本地存储,需要登录机器,在 /mnt/disks 下准备好存储卷。典型情况就是将磁盘格式化好后,mount 进去。比如:

mkdir /mnt/disks/vol1
mount <path/to/your/device> /mnt/disks/vol1

local volume provisioner 程序,会自动发现并将 /mnt/disks/vol1 配置成一个可用的 PV 。可以通过 kubectl get pv 查看。

1赞

挂载磁盘

  • 每台机器需要一块比较大的 SAS 盘(至少 1T),这块盘用来存 Docker 和 kubelet 的数据目录。Docker 的数据主要包括镜像和容器日志数据,kubelet 主要占盘的数据是 emptyDir 所使用的数据。
  • 如果需要部署 Kubernetes 集群的监控系统, 且监控数据需要落盘,则也需要考虑为 Prometheus 准备一块 SAS 盘,后面日志监控系统也需要大的 SAS 盘,同时考虑到机器采购最好是同构的这一因素,因此每台机器最好有两块大的 SAS 盘。 注意: 生产环境建议给这两种类型的盘做 RAID5,至于使用多少块来做 RAID5 可自己决定。
  • etcd 的分布建议是和 Kubernetes master 节点保持一致,即有多少个 master 节点就部署多少个 etcd 节点。etcd 数据建议使用 SSD 盘存放。
  • 如果要部署 harbor,由于镜像仓库可能比较大,建议单独的盘

磁盘有以下两种挂载方式,其中第二种 bind mount 方式多个 PV 会共用一块盘,并且 PV 上看到的容量是整块盘的,无法做到容量隔离和读写 IO 隔离,生产上不推荐,除非对容量隔离没有要求,并且确定是 NVMe 盘性能足够好部署多个 TiKV 相互之间不会影响。

SAS 盘以普通挂载方式挂载完后,通过 bind mount 方式挂载到 /mnt/disks(默认一共创建 10 个挂载目录即可),用于后续为 ES 等创建 PV,NVME/SSD 盘分成两部分,一部分以普通挂载方式挂载完后,通过 bind mount 方式挂载到 /mnt/sharednvme(根据 PD 规划的个数在每个节点上创建挂载目录),用于后续为 PD 创建 PV,多个 PD 可以共享同一块磁盘,一部分通过普通挂载方式直接挂载到 /mnt/nvme,用于后续为 TiKV 创建 PV,每个 TiKV 独占一块磁盘。

普通挂载

假设机器上有三种类型的磁盘:

  • 普通 SAS:/dev/sdb
  • 普通 SSD /dev/sdc
  • NVMe:/dev/nvme0n1
格式化磁盘

注意:格式化前请检查确保这些盘上面没有数据

首先需要保证磁盘是已经格式化的,推荐格式化成 ext4,如果已经格式化成 ext4 或者 xfs 则可以跳过该步骤,如果没有格式化请使用下面命令进行格式化

sudo mkfs -t ext4 /dev/sdb

sudo mkfs -t ext4 /dev/sdc

sudo mkfs -t ext4 /dev/nvme0n1

挂载磁盘

$ sudo blkid # 找到所有磁盘的 UUID

/dev/sda: UUID=“db02043e-7a86-4b8f-ab61-f5362be39d94” TYPE=“ext4”

/dev/sdb: UUID=“cfd4c4d1-9ce7-41b2-ad20-53640d72d3df” TYPE=“ext4”

/dev/sdc: UUID=“ef2a2886-dfd4-468d-9aa7-6ef50bf5c946” TYPE=“ext4”

/dev/nvme0n1 UUID=“47c62fa3-cb45-4356-b556-4d2cb81ec153” TYPE=“ext4”

$ sudo vim /etc/fstab # 将磁盘挂载信息写入 /etc/fstab

$ cat /etc/fstab

… 此处省略机器上已经挂载的磁盘信息,下面只列出用到的数据盘挂载信息

UUID=cfd4c4d1-9ce7-41b2-ad20-53640d72d3df /mnt/sas/cfd4c4d1-9ce7-41b2-ad20-53640d72d3df ext4 defaults,nodelalloc,noatime 0 2

UUID=ef2a2886-dfd4-468d-9aa7-6ef50bf5c946 /mnt/ssd/ef2a2886-dfd4-468d-9aa7-6ef50bf5c946 ext4 defaults,nodelalloc,noatime 0 2

UUID=47c62fa3-cb45-4356-b556-4d2cb81ec153 /mnt/nvme/47c62fa3-cb45-4356-b556-4d2cb81ec153 ext4 defaults,nodelalloc,noatime 0 2

$ sudo mkdir -p /mnt/sas/cfd4c4d1-9ce7-41b2-ad20-53640d72d3df /mnt/ssd/ef2a2886-dfd4-468d-9aa7-6ef50bf5c946 /mnt/nvme/47c62fa3-cb45-4356-b556-4d2cb81ec153

$ sudo mount -a # 执行前请确保 /etc/fstab 里面没有重复项

Bind mount

bind mount 示例

首先确保盘已经按上面普通挂载方式挂载到对应目录。

mkdir -p /mnt/sas/cfd4c4d1-9ce7-41b2-ad20-53640d72d3df/vol{0…9} /mnt/disks/vol{0…9}

cat <> /etc/fstab

/mnt/sas/cfd4c4d1-9ce7-41b2-ad20-53640d72d3df/vol0 /mnt/disks/vol0 none bind 0 0

/mnt/sas/cfd4c4d1-9ce7-41b2-ad20-53640d72d3df/vol1 /mnt/disks/vol1 none bind 0 0

/mnt/sas/cfd4c4d1-9ce7-41b2-ad20-53640d72d3df/vol2 /mnt/disks/vol2 none bind 0 0

/mnt/sas/cfd4c4d1-9ce7-41b2-ad20-53640d72d3df/vol3 /mnt/disks/vol3 none bind 0 0

/mnt/sas/cfd4c4d1-9ce7-41b2-ad20-53640d72d3df/vol4 /mnt/disks/vol4 none bind 0 0

/mnt/sas/cfd4c4d1-9ce7-41b2-ad20-53640d72d3df/vol5 /mnt/disks/vol5 none bind 0 0

/mnt/sas/cfd4c4d1-9ce7-41b2-ad20-53640d72d3df/vol6 /mnt/disks/vol6 none bind 0 0

/mnt/sas/cfd4c4d1-9ce7-41b2-ad20-53640d72d3df/vol7 /mnt/disks/vol7 none bind 0 0

/mnt/sas/cfd4c4d1-9ce7-41b2-ad20-53640d72d3df/vol8 /mnt/disks/vol8 none bind 0 0

/mnt/sas/cfd4c4d1-9ce7-41b2-ad20-53640d72d3df/vol9 /mnt/disks/vol9 none bind 0 0

EOF

mount -a

部署 Local Volume Provisioner

修改 官方 local-volume-provisioner.yaml,增加 shared-nvme-storage、nvme-storage storage class,nvme-storage storage class 对应通过[普通挂载]方式挂载,用于创建 TiKV 使用的 PV,shared-nvme-storage 通过 [bind mount]方式挂载,用于创建 PD 使用的 PV,local-storage storage class 通过 [bind mount] 方式挂载 SAS 目录即可,用于创建 ES 等使用的 PV,然后 kubectl apply -f local-volume-provisioner.yaml

apiVersion: storage.k8s.io/v1

kind: StorageClass

metadata:

name: "local-storage"

provisioner: "kubernetes.io/no-provisioner"

volumeBindingMode: "WaitForFirstConsumer"

---

apiVersion: storage.k8s.io/v1

kind: StorageClass

metadata:

name: "nvme-storage"

provisioner: "kubernetes.io/no-provisioner"

volumeBindingMode: "WaitForFirstConsumer"

---

apiVersion: storage.k8s.io/v1

kind: StorageClass

metadata:

name: "shared-nvme-storage"

provisioner: "kubernetes.io/no-provisioner"

volumeBindingMode: "WaitForFirstConsumer"

---

apiVersion: v1

kind: ConfigMap

metadata:

name: local-provisioner-config

namespace: kube-system

data:

nodeLabelsForPV:

- kubernetes.io/hostname

storageClassMap:

shared-nvme-storage:

hostDir: /mnt/sharednvme

mountDir: /mnt/sharednvme

nvme-storage:

hostDir: /mnt/nvme

mountDir: /mnt/nvme

local-storage:

hostDir: /mnt/disks

mountDir: /mnt/disks

......

          volumeMounts:
            - mountPath: /etc/provisioner/config
              name: provisioner-config
              readOnly: true
            # mounting /dev in DinD environment would fail
            # - mountPath: /dev
            #   name: provisioner-dev
            - mountPath: /mnt/nvme
              name: local-nvme
              mountPropagation: "HostToContainer"
            - mountPath: /mnt/sharednvme
              name: local-sharednvme
              mountPropagation: "HostToContainer"
            - mountPath: /mnt/disks
              name: local-disks
              mountPropagation: "HostToContainer"
      volumes:
        - name: provisioner-config
          configMap:
            name: local-provisioner-config
        # - name: provisioner-dev
        #   hostPath:
        #     path: /dev
        - name: local-nvme
          hostPath:
            path: /mnt/nvme
        - name: local-sharednvme
          hostPath:
            path: /mnt/sharednvme
        - name: local-disks
          hostPath:
            path: /mnt/disks
1赞

这个问题解决了,谢谢各位帮助

1赞

:+1: 这部分是有点繁琐,一是选择很多,二是各自环境需求不大一样,很难做到开箱即用。 文档我们后续会完善更好一点。