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集群集成案例   *****
  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高压放大器在扫描显微镜中的应用及优势是什么

随着科技的不断进步&#xff0c;扫描显微镜成为了现代显微镜技术的重要组成部分。它能够提供更高的分辨率、更广的视场和更强的功能&#xff0c;用于研究各种微观结构和材料的特性。而高压放大器在扫描显微镜系统中发挥着至关重要的作用。下面安泰电子Aigtek将详细介绍高压放大…

hive针对带有特殊字符非法json数据解析

一、背景 有的时候前端或者后端进行埋点日志&#xff0c;会把json里面的数据再加上双引号&#xff0c;或者特殊字符&#xff0c;在落日志的时候&#xff0c;组装的格式就不是正常的json数据了&#xff0c;我们就需要将带有特殊字符的json数据解析成正常的json数据。 二、正则…

算法题:最大出牌数量

最近遇到的一个算法题&#xff0c;在这里记录一下找到的答案。 完整题目&#xff1a; 手里给一副手牌&#xff0c;数字从0-9&#xff0c;有r(红色)&#xff0c;g(绿色&#xff09;&#xff0c;b(蓝色)&#xff0c;y(黄色)四种颜色&#xff0c;出牌规则为每次打出的牌必须跟上…

一百九十二、Flume——Flume数据流监控工具Ganglia单机版安装

一、目的 在安装好Flume之后&#xff0c;需要用一个工具可以对Flume数据传输进行实时监控&#xff0c;这就是Ganglia 二、Ganglia介绍 Ganglia 由 gmond、gmetad 和 gweb 三部分组成。 &#xff08;一&#xff09;第一部分——gmond gmond&#xff08;Ganglia Monitoring Da…

阶乘(Python)

一、定义 整数的阶乘&#xff08;英语&#xff1a;factorial&#xff09;是所有小于及等于该数的正整数的积&#xff0c;0的阶乘为1。即&#xff1a;n!123...n 二、方法说明 python求整数n阶乘的方法&#xff1a; 1、使用math模块factorial(n)来计算n的阶乘 2、for循环语句…

JAVA毕业设计102—基于Java+Springboot+vue的个人理财管理系统(源码+数据库)

基于JavaSpringbootvue的个人理财管理系统(源码数据库) 一、系统介绍 本系统前后端分离 管理员功能&#xff1a; 登录、注册、添加账单、导出账单、统计分析、个人信息修改、消费对比 二、所用技术 后端技术栈&#xff1a; SpringbootSpringMvcmybatismysql 前端技术栈…

[MoeCTF 2023]——Web方向详细Write up、Re、Misc、Crypto部分Writeup

签到 hello CTFer 将url地址复制然后打开即可 得到flag Web http 听说这个http里还有个什么东西叫饼干&#xff0c;也不知道是不是吃的 踩坑了&#xff0c;这里用连接器。。。 开启题目环境 GET方式请求&#xff0c;然后把各种请求头往里加 GET ?UwUuHeader&#xff1a; …

ConcurrentHashMap底层具体实现知道吗?实现原理是什么

从这三个方面来回答&#xff1a; ConcurrentHashMap 的整体架构 ConcurrentHashMap 的基本功能 ConcurrentHashMap 在性能方面的优化 ConcurrentHashMap 的整体架构 这个是 ConcurrentHashMap 在 JDK1.8 中的存储结构&#xff0c;它是由数组、单向链表、红黑树组成. 当我们初始…

mysql的锁介绍

从共享性上来说&#xff0c;mysql的数据库锁分为&#xff1a; 共享锁(读锁)&#xff1a;lock in share mode&#xff1b;一个事务获取了读锁之后&#xff0c;不排斥其他事务读数据&#xff0c;但排斥其他事务增删改。 排它锁(写锁)&#xff1a;for update&#xff1b;一个事务获…

【ROS 2 基础-常用工具】-7 Rviz仿真机器人

所有内容请查看&#xff1a;博客学习目录_Howe_xixi的博客-CSDN博客

读书笔记——富兰克林自传

富兰克林自传 1.我从这件事得到一个启发&#xff0c;只要人们专心工作&#xff0c;就会活得非常快乐。在工作的日子里&#xff0c;他们往往温顺和气&#xff0c;心情愉快。白天痛痛快快地干活&#xff0c;晚上开开心心地吃喝。但是&#xff0c;一旦空闲无事&#xff0c;他们就…

Java的反射(reflection)机制的简单使用

目录 一、定义 二、用途 三、反射基本信息 四、反射相关的类 五、反射示例 六、反射的优点和缺点 一、定义 Java的反射机制是运行时的状态&#xff0c;可以通过反射来调用类里面的属性和方法&#xff0c;私有的属性和方法也可以调用&#xff0c;也可以对它们进行修改。 二…

常见面试题-Netty专栏(一)

typora-copy-images-to: imgs Netty 是什么呢&#xff1f;Netty 用于做什么呢&#xff1f; 答&#xff1a; Netty 是一个 NIO 客户服务端框架&#xff0c;可以快速开发网络应用程序&#xff0c;如协议服务端和客户端&#xff0c;极大简化了网络编程&#xff0c;如 TCP 和 UDP …

LVS+keepalived高可用集群

1、定义 keepalived为lvs应运而生的高可用服务。lvs的调度器无法做高可用&#xff0c;keepalived实现的是调度器的高可用&#xff0c;但keepalived不只为lvs集群服务的&#xff0c;也可以做其他代理服务器的高可用&#xff0c;比如nginxkeepalived也可实现高可用&#xff08;重…

多模态笔记

Transformer 对文本输入进行tokenizer时&#xff0c;调用的接口batch_encode_plus&#xff0c;过程大致是这样的(参考&#xff1a;tokenizer用法) #这里以bert模型为例&#xff0c;使用上述提到的函数 from transformers import BertTokenizer tokenizer BertTokenizer.from…

spring tx:advice事务配置—— tx:advice中不允许出现属性 ‘transaction-manager‘

今天在配置java事务管理时出现了一些问题。 提示&#xff1a;只有这几个属性 经过查询资料发现是bean的配置少了一些。 可以在xml文件顶部添加&#xff1a; xmlns:tx"http://www.springframework.org/schema/tx" 下面也提供一份bean文件配置的模板&#xff1a; &a…

下列软件包有未满足的依赖关系: libqt5svg5-dev : 依赖: libqt5svg5 (= 5.12.8-0ubuntu1) 但是它将不会被安装

有一些软件包无法被安装。如果您用的是 unstable 发行版&#xff0c;这也许是 因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件 包尚未被创建或是它们已被从新到(Incoming)目录移出。 下列信息可能会对解决问题有所帮助&#xff1a; 下列软件包有未满足…

Java入门讲解(1)---让你瞬间明白如何安装jdk

博主有话说&#xff1a;学习这个东西一定要持之以恒&#xff01;&#xff01;&#xff01;博主之前因为点事情半个月没学习&#xff0c;重新来过时&#xff0c;发现自己错过好多知识&#xff0c;正在一点一点往回补&#xff0c;博客也会陆续开始更新&#xff0c;希望大家多多支…

HarmonyOS SDK,赋能开发者实现更具象、个性化开发诉求

#鸿蒙生态千帆起#随着移动互联网的逐步成熟&#xff0c;用户的需求越来越细化。鸿蒙生态为开发者提供的HarmonyOS SDK开放能力&#xff0c;高效赋能美团外卖等合作伙伴实现更具象、个性化的开发诉求&#xff0c;给用户提供更丰富便捷的体验。 HarmonyOS SDK&#xff0c;赋能开发…

pb:数据处理窗口CloseQuery事件编程、如何在窗口之间传递结构

1、数据处理窗口CloseQuery事件编程 该事件下的脚本流程是首先判断数据是否修改过,如果修改过,则让用户选择是否保存,用户确认保存则保存,不保存则退回事务然后关闭窗口。保存数据时,保存成功则直接关闭窗口,保存失败则让用户确认是否关闭窗口,用户确认要关闭则关闭窗口…