2、配置storageclass
#1、创建pod时,kubelet需要使用rbd命令去检测和挂载pv对应的ceph image,所以要在所有的worker节点安装ceph客户端ceph-common。将ceph的ceph.client.admin.keyring和ceph.conf文件拷贝到master的/etc/ceph目录下
推送文件到master节点:
scp -rp ceph.client.admin.keyring ceph.conf root@192.168.0.10:/etc/ceph/
在k8s集群每个节点安装(下载ceph的源)
yum -y install ceph-common
#2、创建 osd pool 在ceph的mon或者admin节点
ceph osd pool create kube 16 16
[root@k8s-master ceph]# ceph osd lspools
1 .rgw.root
2 default.rgw.control
3 default.rgw.meta
4 default.rgw.log
5 rbd
6 kube
7 cephfs-data
8 cephfs-metadata
#3、创建k8s访问ceph的用户 在ceph的mon或者admin节点
ceph auth get-or-create client.kube mon ‘allow r’ osd ‘allow class-read object_prefix rbd_children, allow rwx pool=kube’ -o ceph.client.kube.keyring
#4、查看key 在ceph的mon或者admin节点和kube用户
ceph auth get-key client.admin
AQBQhrJeRHJmLxAATSxU4vjf79KgJpVkNb+VsQ==
ceph auth get-key client.kube
AQCQqztfSQNWFxAAdBmLqhJ/thboY0vGcZ7ixQ==
#5、创建 admin secret(使用admin的key)
kubectl create secret generic ceph-secret --type=“kubernetes.io/rbd”
–from-literal=key=AQBQhrJeRHJmLxAATSxU4vjf79KgJpVkNb+VsQ==
–namespace=kube-system
#6、在 default 命名空间创建pvc用于访问ceph的 secret(使用kube用户的key)
kubectl create secret generic ceph-user-secret --type=“kubernetes.io/rbd”
–from-literal=key=AQCQqztfSQNWFxAAdBmLqhJ/thboY0vGcZ7ixQ==
–namespace=default
[root@k8s-master ceph]# kubectl get secret
NAME TYPE DATA AGE
ceph-user-secret kubernetes.io/rbd 1 30s
3、配置StorageClass
cat >storageclass-ceph-rdb.yaml<<EOF
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: dynamic-ceph-rdb
provisioner: ceph.com/rbd
parameters:
monitors: 192.168.0.6:6789,192.168.0.7:6789,192.168.0.8:6789
adminId: admin
adminSecretName: ceph-secret
adminSecretNamespace: kube-system
pool: kube
userId: kube
userSecretName: ceph-user-secret
fsType: ext4
imageFormat: “2”
imageFeatures: “layering”
EOF
4、创建yaml
kubectl apply -f storageclass-ceph-rdb.yaml
5、查看sc
[root@k8s-master ceph]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
dynamic-ceph-rdb ceph.com/rbd Delete Immediate false 11s
#### 测试使用
1、创建pvc测试
cat >ceph-rdb-pvc-test.yaml<<EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: ceph-rdb-claim
spec:
accessModes:
- ReadWriteOnce
storageClassName: dynamic-ceph-rdb
resources:
requests:
storage: 2Gi
EOF
kubectl apply -f ceph-rdb-pvc-test.yaml
2、查看
[root@k8s-master ceph]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
ceph-rdb-claim Bound pvc-214e462d-8da7-4234-ac68-3222900dd176 2Gi RWO dynamic-ceph-rdb 40s
[root@k8s-master ceph]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-214e462d-8da7-4234-ac68-3222900dd176 2Gi RWO Delete Bound default/ceph-rdb-claim dynamic-ceph-rdb 10s
3、创建 nginx pod 挂载测试
cat >nginx-pod.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod1
labels:
name: nginx-pod1
spec:
containers:
- name: nginx-pod1
image: nginx
ports:- name: web
containerPort: 80
volumeMounts: - name: ceph-rdb
mountPath: /usr/share/nginx/html
volumes:
- name: web
- name: ceph-rdb
persistentVolumeClaim:
claimName: ceph-rdb-claim
EOF
4、查看
[root@k8s-master ceph]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-pod1 1/1 Running 0 39s
#pod的IP为10.244.58.252
5、修改文件内容
kubectl exec -it nginx-pod1 – /bin/sh -c ‘echo this is from Ceph RBD!!! > /usr/share/nginx/html/index.html’
6、访问测试
[root@k8s-master ceph]# curl http://10.244.58.252
this is from Ceph RBD!!!
#查看rbd块设备的数据
[root@k8s-master ceph]# rados -p kube ls --all
rbd_data.67b206b8b4567.0000000000000102
rbd_data.67b206b8b4567.00000000000000a0
rbd_data.67b206b8b4567.000000000000010b
rbd_data.67b206b8b4567.0000000000000100
rbd_id.image02_clone01
rbd_id.kubernetes-dynamic-pvc-5fd1042a-e13e-11ea-9abe-1edcc60c1557
…
7、清理
kubectl delete -f nginx-pod.yaml
kubectl delete -f ceph-rdb-pvc-test.yaml
#rbd块中已经清除了
[root@k8s-master ceph]# rados -p kube ls --all
rbd_id.image02_clone01
rbd_header.2828baf9d30c7
rbd_directory
rbd_children
rbd_info
rbd_object_map.2828baf9d30c7
## 四、POD使用CephFS做为持久数据卷
CephFS方式支持k8s的pv的3种访问模式ReadWriteOnce,ReadOnlyMany ,ReadWriteMany
### Ceph端创建CephFS pool
1、如下操作在ceph的mon或者admin节点
CephFS需要使用两个Pool来分别存储数据和元数据
ceph osd pool create fs_data 128
ceph osd pool create fs_metadata 128
ceph osd lspools
2、创建一个CephFS
ceph fs new cephfs fs_metadata fs_data
3、查看
ceph fs ls
### 部署 cephfs-provisioner
1、使用社区提供的cephfs-provisioner
cat >external-storage-cephfs-provisioner.yaml<<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: cephfs-provisioner
namespace: kube-system
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cephfs-provisioner
rules:
- apiGroups: [“”]
resources: [“persistentvolumes”]
verbs: [“get”, “list”, “watch”, “create”, “delete”] - apiGroups: [“”]
resources: [“persistentvolumeclaims”]
verbs: [“get”, “list”, “watch”, “update”] - apiGroups: [“storage.k8s.io”]
resources: [“storageclasses”]
verbs: [“get”, “list”, “watch”] - apiGroups: [“”]
resources: [“events”]
verbs: [“create”, “update”, “patch”] - apiGroups: [“”]
resources: [“endpoints”]
verbs: [“get”, “list”, “watch”, “create”, “update”, “patch”] - apiGroups: [“”]
resources: [“secrets”]
verbs: [“create”, “get”, “delete”]
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cephfs-provisioner
subjects:
- kind: ServiceAccount
name: cephfs-provisioner
namespace: kube-system
roleRef:
kind: ClusterRole
name: cephfs-provisioner
apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: cephfs-provisioner
namespace: kube-system
rules:
- apiGroups: [“”]
resources: [“secrets”]
verbs: [“create”, “get”, “delete”]
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: cephfs-provisioner
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: cephfs-provisioner
subjects:
- kind: ServiceAccount
name: cephfs-provisioner
namespace: kube-system
apiVersion: apps/v1
kind: Deployment
metadata:
name: cephfs-provisioner
namespace: kube-system
spec:
selector:
matchLabels:
app: cephfs-provisioner
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: cephfs-provisioner
spec:
containers:
- name: cephfs-provisioner
image: “quay.io/external_storage/cephfs-provisioner:latest”
env:
- name: PROVISIONER_NAME
value: ceph.com/cephfs
command:
- “/usr/local/bin/cephfs-provisioner”
args:
- “-id=cephfs-provisioner-1”
serviceAccount: cephfs-provisioner
EOF
kubectl apply -f external-storage-cephfs-provisioner.yaml
2、查看状态 等待running之后 再进行后续的操作
kubectl get pod -n kube-system
### 配置 storageclass
1、查看key 在ceph的mon或者admin节点
ceph auth get-key client.admin
2、创建 admin secret
#上一案例已创建了则不用再次执行
kubectl create secret generic ceph-secret --type=“kubernetes.io/rbd”
–from-literal=key=AQBQhrJeRHJmLxAATSxU4vjf79KgJpVkNb+VsQ==
–namespace=kube-system
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret-admin
namespace: kube-system
type: “kubernetes.io/rbd”
data:
ceph auth get-key client.admin | base64
key: QVFDckJ3dGVBSTdUT2hBQXpGZ1JaTzBNSy9kYTJBRm41RWRkcUE9PQ==
3、查看 secret
kubectl get secret ceph-secret -n kube-system -o yaml
4、配置 StorageClass
cat >storageclass-cephfs.yaml<<EOF
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: dynamic-cephfs
provisioner: ceph.com/cephfs
parameters:
monitors: 192.168.0.6:6789,192.168.0.7:6789,192.168.0.8:6789
adminId: admin
adminSecretName: ceph-secret
adminSecretNamespace: “kube-system”
claimRoot: /volumes/kubernetes
EOF
5、创建
kubectl apply -f storageclass-cephfs.yaml
6、查看
kubectl get sc
### 测试使用
为了做好运维面试路上的助攻手,特整理了上百道 **【运维技术栈面试题集锦】** ,让你面试不慌心不跳,高薪offer怀里抱!
这次整理的面试题,**小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。**
![](https://img-blog.csdnimg.cn/img_convert/f3e02533c1dcd50a3875253eb57b04a3.png)
本份面试集锦涵盖了
* **174 道运维工程师面试题**
* **128道k8s面试题**
* **108道shell脚本面试题**
* **200道Linux面试题**
* **51道docker面试题**
* **35道Jenkis面试题**
* **78道MongoDB面试题**
* **17道ansible面试题**
* **60道dubbo面试题**
* **53道kafka面试**
* **18道mysql面试题**
* **40道nginx面试题**
* **77道redis面试题**
* **28道zookeeper**
**总计 1000+ 道面试题, 内容 又全含金量又高**
* **174道运维工程师面试题**
> 1、什么是运维?
> 2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?
> 3、现在给你三百台服务器,你怎么对他们进行管理?
> 4、简述raid0 raid1raid5二种工作模式的工作原理及特点
> 5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
> 6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
> 7、Tomcat和Resin有什么区别,工作中你怎么选择?
> 8、什么是中间件?什么是jdk?
> 9、讲述一下Tomcat8005、8009、8080三个端口的含义?
> 10、什么叫CDN?
> 11、什么叫网站灰度发布?
> 12、简述DNS进行域名解析的过程?
> 13、RabbitMQ是什么东西?
> 14、讲一下Keepalived的工作原理?
> 15、讲述一下LVS三种模式的工作过程?
> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
0+ 道面试题, 内容 又全含金量又高**
* **174道运维工程师面试题**
> 1、什么是运维?
> 2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?
> 3、现在给你三百台服务器,你怎么对他们进行管理?
> 4、简述raid0 raid1raid5二种工作模式的工作原理及特点
> 5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
> 6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
> 7、Tomcat和Resin有什么区别,工作中你怎么选择?
> 8、什么是中间件?什么是jdk?
> 9、讲述一下Tomcat8005、8009、8080三个端口的含义?
> 10、什么叫CDN?
> 11、什么叫网站灰度发布?
> 12、简述DNS进行域名解析的过程?
> 13、RabbitMQ是什么东西?
> 14、讲一下Keepalived的工作原理?
> 15、讲述一下LVS三种模式的工作过程?
> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
> 17、如何重置mysql root密码?