k8s day08

metric-server概述:

Metrics Server从kubelets收集资源指标,并通过Metrics API将它们暴露在Kubernetes apiserver中,以供HPA(Horizontal Pod Autoscaler)和VPA(Vertical Pod Autoscaler)使用。

Metrics API也可以通过kubectl top访问,从而更容易调试自动缩放管道。

参考链接:

https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/metrics-server

https://kubernetes.io/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/

https://github.com/kubernetes-sigs/metrics-server

部署metric-server:

cat > deoloyment-metric-server.yaml <<'EOF'

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRoleBinding

metadata:

name: metrics-server:system:auth-delegator

labels:

kubernetes.io/cluster-service: "true"

addonmanager.kubernetes.io/mode: Reconcile

roleRef:

apiGroup: rbac.authorization.k8s.io

kind: ClusterRole

name: system:auth-delegator

subjects:

  • kind: ServiceAccount

name: metrics-server

namespace: kube-system


apiVersion: rbac.authorization.k8s.io/v1

kind: RoleBinding

metadata:

name: metrics-server-auth-reader

namespace: kube-system

labels:

kubernetes.io/cluster-service: "true"

addonmanager.kubernetes.io/mode: Reconcile

roleRef:

apiGroup: rbac.authorization.k8s.io

kind: Role

name: extension-apiserver-authentication-reader

subjects:

  • kind: ServiceAccount

name: metrics-server

namespace: kube-system


apiVersion: apiregistration.k8s.io/v1beta1

kind: APIService

metadata:

name: v1beta1.metrics.k8s.io

labels:

kubernetes.io/cluster-service: "true"

addonmanager.kubernetes.io/mode: Reconcile

spec:

service:

name: metrics-server

namespace: kube-system

group: metrics.k8s.io

version: v1beta1

insecureSkipTLSVerify: true

groupPriorityMinimum: 100

versionPriority: 100


apiVersion: v1

kind: ServiceAccount

metadata:

name: metrics-server

namespace: kube-system

labels:

kubernetes.io/cluster-service: "true"

addonmanager.kubernetes.io/mode: Reconcile


apiVersion: v1

kind: ConfigMap

metadata:

name: metrics-server-config

namespace: kube-system

labels:

kubernetes.io/cluster-service: "true"

addonmanager.kubernetes.io/mode: EnsureExists

data:

NannyConfiguration: |-

apiVersion: nannyconfig/v1alpha1

kind: NannyConfiguration


apiVersion: apps/v1

kind: Deployment

metadata:

name: metrics-server-v0.3.3

namespace: kube-system

labels:

k8s-app: metrics-server

kubernetes.io/cluster-service: "true"

addonmanager.kubernetes.io/mode: Reconcile

version: v0.3.3

spec:

selector:

matchLabels:

k8s-app: metrics-server

version: v0.3.3

template:

metadata:

name: metrics-server

labels:

k8s-app: metrics-server

version: v0.3.3

annotations:

scheduler.alpha.kubernetes.io/critical-pod: ''

seccomp.security.alpha.kubernetes.io/pod: 'docker/default'

spec:

priorityClassName: system-cluster-critical

serviceAccountName: metrics-server

tolerations:

  • operator: Exists

containers:

  • name: metrics-server

image: registry.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.3

image: k8s151.oldboyedu.com:5000/metrics-server-amd64:v0.3.3

command:

  • /metrics-server

  • --metric-resolution=30s

These are needed for GKE, which doesn't support secure communication yet.

Remove these lines for non-GKE clusters, and when GKE supports token-based auth.

#- --kubelet-port=10255

#- --deprecated-kubelet-completely-insecure=true

  • --kubelet-insecure-tls

  • --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP

ports:

  • containerPort: 443

name: https

protocol: TCP

  • name: metrics-server-nanny

image: registry.aliyuncs.com/google_containers/addon-resizer:1.8.5

image: k8s151.oldboyedu.com:5000/addon-resizer:1.8.5

resources:

limits:

cpu: 100m

memory: 300Mi

requests:

cpu: 5m

memory: 50Mi

env:

  • name: MY_POD_NAME

valueFrom:

fieldRef:

fieldPath: metadata.name

  • name: MY_POD_NAMESPACE

valueFrom:

fieldRef:

fieldPath: metadata.namespace

volumeMounts:

  • name: metrics-server-config-volume

mountPath: /etc/config

command:

  • /pod_nanny

  • --config-dir=/etc/config

#- --cpu=80m

  • --extra-cpu=0.5m

#- --memory=80Mi

#- --extra-memory=8Mi

  • --threshold=5

  • --deployment=metrics-server-v0.3.3

  • --container=metrics-server

  • --poll-period=300000

  • --estimator=exponential

  • --minClusterSize=2

Specifies the smallest cluster (defined in number of nodes)

resources will be scaled to.

#- --minClusterSize={{ metrics_server_min_cluster_size }}

volumes:

  • name: metrics-server-config-volume

configMap:

name: metrics-server-config


apiVersion: v1

kind: Service

metadata:

name: metrics-server

namespace: kube-system

labels:

addonmanager.kubernetes.io/mode: Reconcile

kubernetes.io/cluster-service: "true"

kubernetes.io/name: "Metrics-server"

spec:

selector:

k8s-app: metrics-server

ports:

  • port: 443

protocol: TCP

targetPort: https


apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRole

metadata:

name: system:metrics-server

labels:

kubernetes.io/cluster-service: "true"

addonmanager.kubernetes.io/mode: Reconcile

rules:

  • apiGroups:

  • ""

resources:

  • pods

  • nodes

  • nodes/stats

  • namespaces

verbs:

  • get

  • list

  • watch

  • apiGroups:

  • "extensions"

resources:

  • deployments

verbs:

  • get

  • list

  • update

  • watch


apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRoleBinding

metadata:

name: system:metrics-server

labels:

kubernetes.io/cluster-service: "true"

addonmanager.kubernetes.io/mode: Reconcile

roleRef:

apiGroup: rbac.authorization.k8s.io

kind: ClusterRole

name: system:metrics-server

subjects:

  • kind: ServiceAccount

name: metrics-server

namespace: kube-system

EOF

面试题: 请一个Pod做了资源限制,当CPU资源使用率高达90%时如何解决?能否实现自动扩容呢?请说下思路?

---> hpa

Pod水平自动伸缩HPA案例:

1.编写资源清单

cat > deploy-tomcat.yaml <<'EOF'

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: mysql

spec:

replicas: 1

template:

metadata:

labels:

app: oldboyedu-mysql

spec:

tolerations:

  • operator: Exists

containers:

  • name: mysql

image: k8s151.oldboyedu.com:5000/oldboyedu-db/mysql:5.7

ports:

  • containerPort: 3306

env:

  • name: MYSQL_ROOT_PASSWORD

value: '123456'


apiVersion: v1

kind: Service

metadata:

name: oldboyedu-mysql

spec:

selector:

app: oldboyedu-mysql

ports:

  • port: 3306

targetPort: 3306


apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: oldboyedu-tomcat-app

spec:

replicas: 1

template:

metadata:

labels:

app: oldboyedu-tomcat-app

spec:

tolerations:

  • operator: Exists

containers:

  • name: myweb

image: jasonyin2020/tomcat-app:v1

image: k8s151.oldboyedu.com:5000/oldboyedu-tomcat/tomcat-app:v1

resources:

limits:

cpu: "100m"

requests:

cpu: "100m"

ports:

  • containerPort: 8080

env:

  • name: MYSQL_SERVICE_HOST

value: oldboyedu-mysql

  • name: MYSQL_SERVICE_PORT

value: '3306'


apiVersion: v1

kind: Service

metadata:

name: oldboyedu-tomcat-app

spec:

type: NodePort

selector:

app: oldboyedu-tomcat-app

ports:

  • port: 8080

targetPort: 8080

nodePort: 30888

EOF

2.部署tomcat应用

kubectl apply -f deploy-tomcat.yaml

3.测试

1.支持中文输出

cat >> /etc/mysql/my.cnf <<EOF

[mysql]

default-character-set = utf8

EOF

2.插入测试数据

INSERT INTO HPE_APP.T_USERS (USER_NAME,LEVEL) VALUES ('WangJianPing',888888888),('LiuDong',999999999999);

3.查看webUI

http://10.0.0.151:30888/demo

4.创建HPA规则

kubectl autoscale deployment oldboyedu-tomcat-app --max=10 --min=2 --cpu-percent=75

相关参数说明:

--max:

指定最大的Pod数量,如果指定的数量越大,则弹性伸缩的资源创建的就越多,对服务器资源会进行消耗。

--min:

指定最小的Pod数量。

--cpu-percent:

指定CPU的百分比。

温馨提示:

(1)测试时建议修改为CPU使用百分比为5%,生产环节建议设置成75%.

(2)测试时最大Pod数量建议为5个即可,生产环境根据需求而定,通常情况下,10是一个不错的建议;

5.压力测试tomcat,观察Pod的水平伸缩

(1)安装测试工具

yum -y install httpd-tools

(2)使用ab工具进行测试

ab -c 1000 -n 2000000 http://10.0.0.153:30888/

ab -c 100 -n 2000000 http://10.0.0.153:30888/

相关参数说明:

-n:

指定总共压测的次数。

-c:

每次压测发起的并发请求数。

ceph集群环境部署:

1.准备3台节点,所有节点都添加映射关系

[root@ceph201 ~]# cat >> /etc/hosts <<EOF

10.0.0.201 ceph201

10.0.0.202 ceph202

10.0.0.203 ceph203

EOF

2.ceph201节点配置免密登录(后续ceph-deploy工具依赖免密登录)

(1)配置免密登录

[root@ceph201 ~]# yum -y install expect

[root@ceph201 ~]# cat > password_free_login.sh <<'EOF'

#!/bin/bash

auther: Jason Yin

创建密钥对

ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa -q

声明你服务器密码,建议所有节点的密码均一致,否则该脚本需要再次进行优化

export mypasswd=yinzhengjie

定义主机列表

k8s_host_list=(ceph201 ceph202 ceph203)

配置免密登录,利用expect工具免交互输入

for i in ${k8s_host_list[@]};do

expect -c "

spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i

expect {

\"*yes/no*\" {send \"yes\r\"; exp_continue}

\"*password*\" {send \"$mypasswd\r\"; exp_continue}

}"

done

EOF

[root@ceph201 ~]# sh password_free_login.sh

(3)让所有节点公用同一套密钥

[root@ceph201 ~]# scp -rp ~/.ssh ceph202:~

[root@ceph201 ~]# scp -rp ~/.ssh ceph203:~

3."ceph201"节点安装"ceph-deploy"工具,用于后期部署ceph集群

(1)准备国内的软件源(含基础镜像软件源和epel源)

[root@ceph201 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

[root@ceph201 ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

(2)配置ceph软件源(注意哈,此步骤先试用清华源,之后在第9步骤会报错,切换为阿里源即可。)

[root@ceph201 ~]# cat > /etc/yum.repos.d/oldboyedu-ceph.repo <<'EOF'

[oldboyedu-ceph]

name=oldboyedu linux82 ceph 2022

baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-octopus/el7/x86_64/

gpgcheck=0

enable=1

[oldboyedu-ceph-tools]

name=oldboyedu linux82 ceph tools

baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-octopus/el7/noarch/

gpgcheck=0

enable=1

[ceph]

name=ceph

baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/

gpgcheck=0

priority=1

[ceph-noarch]

name=cephnoarch

baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/

gpgcheck=0

priority=1

[ceph-source]

name=Ceph source packages

baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS

gpgcheck=0

EOF

(3)"ceph201"节点安装"ceph-deploy"工具,用于后期部署ceph集群

[root@ceph201 ~]# sed -ri 's#(keepcache=)0#\11#' /etc/yum.conf

[root@ceph201 ~]# yum -y install ceph-deploy

(4)将rpm软件源推送到其它节点

[root@ceph201 ~]# scp /etc/yum.repos.d/*.repo ceph202:/etc/yum.repos.d/

[root@ceph201 ~]# scp /etc/yum.repos.d/*.repo ceph203:/etc/yum.repos.d/

4."ceph201"节点ceph环境准备

(1)"ceph201"节点安装ceph环境

[root@ceph201 ~]# yum -y install ceph ceph-mon ceph-mgr ceph-radosgw ceph-mds ceph-osd

相关软件包功能说明如下:

ceph:

ceph通用模块软件包。

ceph-mon:

ceph数据的监控和分配数据存储,其中mon是monitor的简写。

ceph-mgr:

管理集群状态的组件。其中mgr是manager的简写。基于该组件我们可以让zabbix来监控ceph集群哟。

ceph-radosgw:

对象存储网关,多用于ceph对象存储相关模块软件包。

ceph-mds:

ceph的文件存储相关模块软件包,即"metadata server"

ceph-osd

ceph的块存储相关模块软件包。

(2)将软件打包到本地并推送到其它节点

[root@ceph201 ~]# mkdir ceph-rpm

[root@ceph201 ~]# find /var/cache/yum/ -type f -name "*.rpm" | xargs mv -t ceph-rpm/

[root@ceph201 ~]# tar zcf oldboyedu-ceph.tar.gz ceph-rpm

[root@ceph201 ~]# scp oldboyedu-ceph.tar.gz ceph202:~

[root@ceph201 ~]# scp oldboyedu-ceph.tar.gz ceph203:~

(3)其它节点安装ceph环境

[root@ceph202 ~]# tar xf oldboyedu-ceph.tar.gz && cd ~/ceph-rpm && yum -y localinstall *.rpm

[root@ceph203 ~]# tar xf oldboyedu-ceph.tar.gz && cd ~/ceph-rpm && yum -y localinstall *.rpm

5."ceph201"节点初始化ceph的配置文件

(1)自定义创建ceph的配置文件目录~

[root@ceph201 ~]# mkdir -pv /oldboyedu/ceph/cluster && cd /oldboyedu/ceph/cluster/

(2)所有节点安装"distribute"软件包,提供"pkg_resources"模块,

yum -y install gcc python-setuptools python-devel wget

wget https://pypi.python.org/packages/source/d/distribute/distribute-0.7.3.zip --no-check-certificate

unzip distribute-0.7.3.zip

cd distribute-0.7.3

python setup.py install

(3)初始化ceph的配置文件,注意观察执行命令的所在目录文件变化哟~

[root@ceph201 ~]# cd /oldboyedu/ceph/cluster/ && ceph-deploy new --public-network 10.0.0.0/24 ceph201 ceph202 ceph203

6."ceph201"节点安装ceph-monitor并启动ceph-mon

[root@ceph201 ~]# cd /oldboyedu/ceph/cluster/ && ceph-deploy mon create-initial

7."ceph201"节点将配置和client.admin密钥推送到指定的远程主机以便于管理集群。

[root@ceph201 ~]# cd /oldboyedu/ceph/cluster/ && ceph-deploy admin ceph201 ceph202 ceph203

8."ceph201"节点安装并启动ceph-mgr组件

[root@ceph201 ~]# cd /oldboyedu/ceph/cluster/ && ceph-deploy mgr create ceph201 ceph202 ceph203

9.卸载版本,然后更换指定版本,否则可能在做第十步会出现"Could not locate executable 'ceph-disk' ..."(注意哈,这个步骤需要求将yum源切换为阿里源,之前是清华源)

ceph-deploy --version

yum -y remove ceph-deploy

yum -y install python-pip

pip install ceph-deploy==2.0.1 -i https://mirrors.aliyun.com/pypi/simple

ceph-deploy --version

10."ceph201"节点安装OSD设备

[root@ceph201 ~]# cd /oldboyedu/ceph/cluster

[root@ceph201 ~]# ceph-deploy osd create ceph201 --data /dev/sdb

[root@ceph201 ~]# ceph-deploy osd create ceph201 --data /dev/sdc

[root@ceph201 ~]# ceph-deploy osd create ceph202 --data /dev/sdb

[root@ceph201 ~]# ceph-deploy osd create ceph202 --data /dev/sdc

[root@ceph201 ~]# ceph-deploy osd create ceph203 --data /dev/sdb

[root@ceph201 ~]# ceph-deploy osd create ceph203 --data /dev/sdc

创建OSD是要注意的相关参数说明:

--data DATA:

指定逻辑卷或者设备的绝对路径。

--journal JOURNAL:

指定逻辑卷或者GPT分区的分区路径。生产环境强烈指定该参数,并推荐使用SSD设备。

因为ceph需要先预写日志而后才会真实写入数据,从而达到防止数据丢失的目的。

若不指定该参数,则日志会写入"--data"指定的路径哟。从而降低性能。

对于一个4T的数据盘,其日志并不会占据特别多的空间,通常情况下分配50G足以,当然,LVM是支持动态扩容的。

温馨提示:

(1)如上图所示,指定的设备各个服务器必须存在哟;

(2)如下图所示,当我们创建OSD成功后,就可以通过"ceph -s"查看集群状态了哟;

(3)如下图所示,我们可以通过"ceph osd tree"查看集群各个osd的情况;

(4)如果一个ceph集群的某个主机上有多块磁盘都需要加入osd,只需重复执行上述步骤即可;

(5)如果添加硬盘未识别可执行以下语句:

for i in `seq 0 2`; do echo "- - -" > /sys/class/scsi_host/host${i}/scan;done

选做部分,否则集群处于HEALTH_WARN状态,但并不影响正常使用:

11.禁用安全机制,否则会报错:"mons are allowing insecure global_id reclaim"

ceph config set mon auth_allow_insecure_global_id_reclaim false

12.集群时间同步,否则会报错"clock skew detected on mon.ceph202, mon.ceph203"

(1)所有节点安装chrony服务

[root@ceph201 ~]# yum -y install chrony

(2)备份默认配置文件

[root@ceph201 ~]# cp /etc/chrony.conf{,`date +%F`}

(3)创建配置文件

[root@ceph201 ~]# cat > /etc/chrony.conf <<'EOF'

server ceph201 iburst

driftfile /var/lib/chrony/drift

makestep 1.0 3

rtcsync

allow 10.0.0.0/8

local stratum 10

logdir /var/log/chrony

EOF

(4)其他2个客户端配置

cat > /etc/chrony.conf <<'EOF'

server ceph201 iburst

driftfile /var/lib/chrony/drift

makestep 1.0 3

rtcsync

logdir /var/log/chrony

EOF

(5)将chrony服务设置为开启自启动

systemctl enable --now chronyd

13.所有节点安装"pecan"模块,否则会报错"Module 'restful' has failed dependency: No module named 'pecan'"

pip3 install pecan werkzeug

reboot

14.开启池删除功能

ceph config set mon mon_allow_pool_delete true

ceph的存储池基本管理:

(1)查看现有的所有资源池

ceph osd pool ls

(2)创建资源池

ceph osd pool create oldboyedu-linux 128 128

(3)查看存储池的参数信息(这个值可能会不断的变化哟~尤其是在重命名后!)

ceph osd pool get oldboyedu-linux pg_num

(4)资源池的重命名

ceph osd pool rename oldboyedu-linux oldboyedu-linux-2021

(5)查看资源池的状态

ceph osd pool stats

(6)删除资源池(需要开启删除的功能,否则会报错哟~而且池的名字得写2次!)

ceph osd pool rm oldboyedu-linux oldboyedu-linux --yes-i-really-really-mean-it

其他使用方法:

"ceph osd pool --help"

rbd的块设备(镜像,image)管理:

(1)查看rbd的块(镜像,image)设备:

rbd list -p oldboyedu-linux

rbd ls -p oldboyedu-linux --long --format json --pretty-format # 可以指定输出的样式

(2)创建rbd的块设备:(下面两种写法等效哟)

rbd create --size 1024 --pool oldboyedu-linux linux82 # 不指定单位默认为M

rbd create --size 1024 oldboyedu-linux/linux83

rbd create -s 2G -p oldboyedu-linux linux84 # 也可以指定单位,比如G

(3)修改镜像设备的名称

rbd rename|mv -p oldboyedu-linux oldboyedu-zhibo oldboyedu-linux

rbd rename oldboyedu-linux/linux82 oldboyedu-linux/linux82-2022

rbd mv --pool oldboyedu-linux linux82-2022 linux82

(4)查看镜像的状态

rbd status -p oldboyedu-linux oldboyedu-zhibo2021

rbd status oldboyedu-linux/linux82

(5)移除镜像文件

rbd remove|rm -p oldboyedu-linux oldboyedu-zhibo2021

rbd remove oldboyedu-linux/linux83

rbd rm --pool oldboyedu-linux linux84

(6)查看rbd的详细信息:

rbd info -p oldboyedu-linux linux82 # 等效于"rbd info oldboyedu-linux/linux82"

rbd info oldboyedu-linux/linux82 --format json --pretty-format

温馨提示:

(1)如果是ceph的客户端,想要操作rbd必须安装该工具,其安装包可参考"rpm -qf /usr/bin/rbd"哟;

(2)以上参数有任何不懂的,可以直接使用'rbd help <command>'来查看此命令的帮助信息哟;

挂载rbd块设备文件并使用:

1.禁用Linux不支持的核心特性

rbd feature disable oldboyedu-linux/linux82 object-map fast-diff deep-flatten

2.挂载rbd的块设备

2.1 添加映射关系:(添加设备)

[root@ceph201 ~]# rbd map oldboyedu-linux/linux82

2.2 格式化磁盘:

[root@ceph201 ~]# mkfs.xfs /dev/rbd0

2.3 挂载磁盘:

[root@ceph201 ~]# mount /dev/rbd0 /mnt/

2.4 测试数据

[root@ceph201 ~]# cp /etc/os-release /mnt/

2.5 删除映射关系:(删除设备)

[root@ceph201 ~]# umount /mnt/

[root@ceph201 ~]# rbd unmap /dev/rbd0

[root@ceph201 ~]# rbd unmap oldboyedu-linux/linux82

2.6 再次挂载测试数据是否丢失

重复上述步骤即可。

[root@ceph201 ~]# rbd map oldboyedu-linux/linux82

[root@ceph201 ~]# mount /dev/rbd0 /mnt/

[root@ceph202 ~]# rbd map oldboyedu-linux/linux82

[root@ceph202 ~]# mount /dev/rbd0 /mnt/

扩容rbd块设备:

自动扩缩容磁盘大小:(扩容正常,缩容可能会导致设备不可用!需要进一步调研,生产环境要充分测试方能使用!)

rbd resize --size 4096 oldboyedu-linux/linux82

rbd resize -s 1G oldboyedu-linux/linux82 --allow-shrink # 慎用,可能会导致设备不可用! 不推荐使用缩容!

自动扩展XFS文件系统到最大的可用大小:

xfs_growfs /mnt

温馨提示:

(1)我们可以对一个镜像设备进行扩容,是符合正常逻辑的;

(2)我们可以对一个镜像进行缩容,但可能会造成数据丢失,甚至挂载镜像失败的情况哟;

ceph集群缩容osd节点(此处模拟移除"ceph203"节点):

(1)查看集群的OSD信息

[root@ceph201 ~]# ceph osd tree

(2)将ceph203节点的OSD设备权重取消

[root@ceph201 ~]# ceph osd out osd.4

[root@ceph201 ~]# ceph osd out osd.5

(3)将ceph203节点停止osd服务

[root@ceph203 ~]# systemctl disable --now ceph-osd@4

[root@ceph203 ~]# systemctl disable --now ceph-osd@5

(4)在管理节点删除osd

[root@ceph201 ~]# ceph auth del osd.4 # 删除osd认证密钥

[root@ceph201 ~]# ceph auth del osd.5

[root@ceph201 ~]# ceph osd rm 4 # 删除 osd

[root@ceph201 ~]# ceph osd rm 5

(5)解除ceph对磁盘的占用

[root@ceph203 ~]# fuser -k /var/lib/ceph/osd/ceph-4

[root@ceph203 ~]# fuser -k /var/lib/ceph/osd/ceph-5

[root@ceph203 ~]# dmsetup status # 查看设备的唯一编号,便于进行移除!

[root@ceph203 ~]# dmsetup remove ceph--cebb2818--220e--4880--a20e--e12f98a0b3b1-osd--block--ad11e7fe--93bb--48b9--80a6--28e9b2de9d12

[root@ceph203 ~]# dmsetup remove ceph--990406bd--d993--4029--b36d--2f323e10ea04-osd--block--b9e272f1--e034--48eb--b799--9e7fca66869b

(6)清除osd的DNE状态

[root@ceph201 ~]# ceph osd crush remove osd.4

[root@ceph201 ~]# ceph osd crush remove osd.5

(7)清除主机

[root@ceph201 ~]# ceph osd crush remove ceph203

ceph集群扩容osd节点(此处模拟添加"ceph203"节点):

(1)新增节点部署ceph软件包

[root@ceph201 ~]# scp /etc/yum.repos.d/epel.repo /etc/yum.repos.d/oldboyedu-ceph.repo ceph203:/etc/yum.repos.d/

(2)ceph203节点只需安装osd相关的组件即可,因为它并不作为管理节点,而是作为存储节点哟。

yum -y install ceph-osd

systemctl stop firewalld && systemctl disable firewalld # 禁用防火墙功能。

温馨提示:

如下图所示,请及时在ceph节点安装以下的软件包哟,否则你会发现始终无法添加节点呢。

python36-PyYAML-3.13-1.el7.x86_64.rpm

python36-six-1.14.0-3.el7.noarch.rpm

libyaml-0.1.4-11.el7_0.x86_64.rpm # 该模块可以不选择安装哈!

python-six-1.9.0-2.el7.noarch.rpm # 该模块可以不选择安装哈!

想要偷懒的同学可以使用局域网:

[root@ceph203 ~]# wget http://192.168.17.253/Kubernetes/day08-/softwares/oldboyedu-ceph.tar.gz

[root@ceph203 ~]# tar xf oldboyedu-ceph.tar.gz && cd ~/ceph-rpm && yum -y localinstall *.rpm

(3)在ceph201管理节点添加新增节点的OSD

[root@ceph201 ~]# cd /oldboyedu/ceph/cluster && ceph-deploy osd create ceph203 --data /dev/sdb

[root@ceph201 ~]# cd /oldboyedu/ceph/cluster && ceph-deploy osd create ceph203 --data /dev/sdc

(4)验证

ceph osd tree

ceph -s

(5)添加OSD注意事项

当我们添加OSD时会自动进行数据的负载均衡哟,因此建议大家如果真需要扩容时可以考虑在业务的低谷期进行哟。

使用ceph对接kubernetes:

1.在K8S集群中安装ceph的基础包环境

(1)创建软件源

curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

cat > /etc/yum.repos.d/oldboyedu-ceph.repo <<EOF

[oldboyedu-ceph]

name=oldboyedu linux82 ceph 2022

baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-octopus/el7/x86_64/

gpgcheck=0

enable=1

[oldboyedu-ceph-tools]

name=oldboyedu linux82 ceph tools

baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-octopus/el7/noarch/

gpgcheck=0

enable=1

EOF

(2)master节点开启rpm软件包缓存

[root@k8s151.oldboyedu.com ~]# grep keepcache /etc/yum.conf

keepcache=1

[root@k8s151.oldboyedu.com ~]#

(3)安装ceph的基础包

[root@k8s151.oldboyedu.com ~]# yum -y install ceph-common

(4)将ceph软件包打包并下发到其它k8s node节点

[root@k8s151.oldboyedu.com ~]# mkdir k8s-ceph-common

[root@k8s151.oldboyedu.com ~]# find /var/cache/yum/ -type f -name "*.rpm" | xargs mv -t k8s-ceph-common

[root@k8s151.oldboyedu.com ~]# tar zcf oldboyedu-k8s-ceph-common.tar.gz k8s-ceph-common

[root@k8s151.oldboyedu.com ~]# scp oldboyedu-k8s-ceph-common.tar.gz k8s152.oldboyedu.com:~

[root@k8s151.oldboyedu.com ~]# scp oldboyedu-k8s-ceph-common.tar.gz k8s153.oldboyedu.com:~

(5)其它所有node节点安装ceph软件包

[root@k8s152.oldboyedu.com ~]# tar xf oldboyedu-k8s-ceph-common.tar.gz && yum -y localinstall k8s-ceph-common/*.rpm

[root@k8s153.oldboyedu.com ~]# tar xf oldboyedu-k8s-ceph-common.tar.gz && yum -y localinstall k8s-ceph-common/*.rpm

(6)将ceph集群的配置文件推送到k8s所有节点

[root@ceph201 ~]# scp /etc/ceph/ceph.conf 10.0.0.151:/etc/ceph/

[root@ceph201 ~]# scp /etc/ceph/ceph.conf 10.0.0.152:/etc/ceph/

[root@ceph201 ~]# scp /etc/ceph/ceph.conf 10.0.0.153:/etc/ceph/

参考连接:

https://kubernetes.io/docs/concepts/storage/volumes/#rbd

https://github.com/kubernetes/examples/tree/master/volumes/rbd

2.使用Ceph身份验证密钥

(1)如果提供了Ceph身份验证密钥,则该密钥应首先进行base64编码,然后将编码后的字符串放入密钥yaml中。

[root@ceph201 ~]# grep key /etc/ceph/ceph.client.admin.keyring |awk '{printf "%s", $NF}'|base64

QVFBTzlpTmplSXJZSmhBQS9EUGJYSURjYmYwSHR2Z1BxQUc3MUE9PQ==

[root@ceph201 ~]#

(2)创建Secret资源,注意替换key的值,要和ceph集群的key保持一致哟,上一步我已经取出来了。

[root@k8s151.oldboyedu.com ~]# cat > 01-oldboyedu-ceph-secret.yaml <<'EOF'

apiVersion: v1

kind: Secret

metadata:

name: ceph-secret

type: "kubernetes.io/rbd"

data:

key: QVFBTzlpTmplSXJZSmhBQS9EUGJYSURjYmYwSHR2Z1BxQUc3MUE9PQ==

EOF

(3)在K8S集群中创建Secret资源,以便于后期Pod使用该资源。

[root@k8s151.oldboyedu.com ~]# kubectl apply -f 01-oldboyedu-ceph-secret.yaml

[root@k8s151.oldboyedu.com ~]# kubectl get secret

参考连接:

https://github.com/kubernetes/examples/blob/master/volumes/rbd/secret/ceph-secret.yaml

3.ceph集群创建k8s专用的存储池及镜像

[root@ceph201 ~]# ceph osd pool create k8s 128 128

[root@ceph201 ~]# rbd create -p k8s --size 2G --image-feature layering oldboyedu-linux

4.K8S使用ceph的rbd镜像案例

(1)创建kubernetes集群常用的资源池

[root@ceph201 ~]# ceph osd pool create k8s 128 128

pool 'k8s' created

[root@ceph201 ~]#

(2)在k8s资源池创建块设备,值得注意的是,我们可以指定该镜像的特性,否则由于内核版本过低而无法挂载哟

[root@ceph201 ~]# rbd create -p k8s --size 1024 --image-feature layering oldboyedu-linux

(3)创建K8S的资源,将MySQL的Pod持久化到ceph集群

[root@k8s151.oldboyedu.com ~]# cat > 02-oldboyedu-mysql-deploy.yml <<EOF

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: oldboyedu-web

spec:

replicas: 1

template:

metadata:

labels:

app: oldboyedu-web

spec:

volumes:

  • name: linux82-web

rbd:

指定ceph集群的mon节点

monitors:

  • '10.0.0.201:6789'

  • '10.0.0.202:6789'

  • '10.0.0.203:6789'

指定存储池

pool: k8s

指定rbd镜像名称

image: oldboyedu-linux

指定文件系统类型,其会自动帮咱们进行格式化哟~

fsType: xfs

是否可读,如果设置为true表示只读权限哟~

readOnly: false

指定访问ceph集群的用户

user: admin

指定访问集群的密钥资源,这个就是我们自己创建的secret局部资源,请一定要确保Pod和secret在同一个namespace,否则无法访问哟。

secretRef:

name: ceph-secret

指定镜像格式,老版本不支持该字段,因此我这里也就先注释了

imageformat: "2"

指定镜像特性,老版本不支持该字段,因此我这里就先注释了

imagefeatures: "layering"

tolerations:

  • operator: Exists

containers:

  • name: web

image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1

volumeMounts:

  • name: linux82-web

mountPath: /usr/share/nginx/html

EOF

[root@k8s151.oldboyedu.com ~]# kubectl apply -f 02-oldboyedu-mysql-deploy.yml

参考连接:

https://github.com/kubernetes/examples/blob/master/volumes/rbd/rbd-with-secret.yaml

温馨提示:

(1)使用"ceph auth ls"指令可以查看身份验证状态的列表。

(2)创建的资源如下图所示,到时候可以直接参考"/oldboyedu/k8s-ceph"目录的yaml。

(3)这个软件包会出现一大堆错误,需要我们手动逐个去排查,对学员说是一次不错的历练。上课要演示完整的排查流程。

今日内容回顾:

  • metrics-server *****

为"kubectl top"和"hpa".

  • ceph集群搭建

  • ceph集群的基础使用

  • 存储池

  • 镜像

  • ceph集群的扩缩容

  • ceph的rbd和K8S集群集成案例 *****

相关推荐
qq_382391332 小时前
WPF框架学习
学习·wpf·1024程序员节
✿ ༺ ོIT技术༻7 天前
Linux:TCP和守护进程
linux·运维·服务器·网络·tcp/ip·1024程序员节
辅助东皇燕双鹰10 天前
行测知识()
1024程序员节
深蓝易网13 天前
探寻制造型企业MES管理系统:功能、架构与应用全解析
大数据·运维·人工智能·架构·制造·1024程序员节
Lenyiin18 天前
2848、与车相交的点
c++·算法·leetcode·1024程序员节
earthzhang202124 天前
《深入浅出HTTPS》读书笔记(31):HTTPS和TLS/SSL
开发语言·网络·python·https·1024程序员节
不讲废话的小白1 个月前
怎么样把pdf转成图片模式(不能复制文字)
pdf·1024程序员节
明明真系叻1 个月前
2025.1.26机器学习笔记:C-RNN-GAN文献阅读
人工智能·笔记·深度学习·机器学习·生成对抗网络·1024程序员节
Joeysoda1 个月前
Java数据结构 (从0构建链表(LinkedList))
java·linux·开发语言·数据结构·windows·链表·1024程序员节
清风-云烟1 个月前
使用redis-cli命令实现redis crud操作
java·linux·数据库·redis·spring·缓存·1024程序员节