咨询一个问题,在离线的k8s环境中部署tidb集群遇到的(注意是离线的内网环境!!!) ,提示tidb-scheduler拉镜像没拉成功 ,出现在部署tidb-operator的时候,yaml配置文件中需要load一个kube-scheduler的镜像包。
看着像 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
你好,我后面又遇到一个问题,三个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的本地配置化教程给出来吗?目前自己没搞定
其中部署镜像,需要访问外网。这个没办法。如果 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 查看。
挂载磁盘
- 每台机器需要一块比较大的 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
这个问题解决了,谢谢各位帮助
这部分是有点繁琐,一是选择很多,二是各自环境需求不大一样,很难做到开箱即用。
文档我们后续会完善更好一点。