一、简介

和docker类似,k8s也需要存储数据,比如redis和mysql都需要外部存储对象,要不然重新拉起pod,在其他机器上数据会消失。

二、NFS共享存储

NFS这个文件系统提供了远程挂载共享数据,我们可以利用这个文件系统来做数据共享。

1、下载文件系统

需要共享的机器都下载

apt-get install nfs-kernel-server

2、配置服务端

# 对外暴露共享目录 /data是服务端的文件夹

echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports

 *是所有机器都可以访问我们的共享资源。如果写ip地址的话,就指定特定的ip.

# 在主共享机器创建/nfs/data/目录

mkdir -p /nfs/data

# 重启NFS服务

service nfs-kernel-server restart

# 查看暴露服务信息

exportfs -v

 说明服务端配置成功

3、配置客户端

# 查看服务端那些目录可被挂载

showmount -e 192.168.211.11

# 挂载 

mount -t nfs4 -o noac  192.168.211.11:/nfs/data /nfs/data

# 查看挂载是否成功,最后一行

df -h

注意:执行挂载命令的时候不要再/nfs/data里执行,否则挂载后,创建的文件不共享

4、部署一个nginx

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-pv
  name: nginx-pv
spec :
  replicas: 2
  selector:
    matchLabels:
      app: nginx-pv
  template:
    metadata :
      labels:
        app: nginx-pv
    spec:
      containers :
      - image: nginx
        name: nginx
        volumeMounts :
        - name: html
          mountPath: /usr/share/nginx/html
      volumes :
      - name: html
        nfs:
          server: 192.168.211.11
          path: /nfs/data/nginx-pv

kubectl apply -f mount.yaml

首先部署之前需要创建好/nfs/data/nginx-pv,要不然会不成功。测试ok。

三、PV&PVC

静态供应

需要提前创建好各种大小的pv,然后再声明

PV:持久卷

PVC:持久卷声明

用法:提前创建好持久卷,比如100M,5G,100G大小的持久卷,然后再使用(声明PVC),最后在创建项目的时候应用申明即可。

1、创建PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01-10m
spec:
  capacity:
    storage: 10M
  accessModes :
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/01
    server: 192.168.211.11
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv02-1gi
spec:
  capacity:
    storage: 1Gi
  accessModes :
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/02
    server: 192.168.211.11

kubectl apply -f pv.yaml

查看创建状态

kubectl get persistentvolume

kubectl get pv

 2、声明PVC

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests :
      storage: 200Mi
  storageClassName: nfs

注意:声明中的nfs要和上面创建PV中的storageClassName: nfs里的nfs对应。

kubectl apply -f pvc.yaml

 可以看到1G空间已经绑定了。

查看声明

kubectl get pvc

3、项目中应用

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: nginx-deploy-pvc
  name: nginx-deploy-pvc
spec:
  replicas: 2
  selector: 
    matchLabels : 
      app: nginx-deploy-pvc
  template:
    metadata:
      labels:
        app: nginx-deploy-pvc
    spec:
      containers: 
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          persistentVolumeClaim:
            claimName: nginx-pvc

claimName: nginx-pvc就是声明里的名字

此处部署的nginx和上面《三》部署的nginx区别就是一个直接挂载,一个直接用的声明。

动态供应

不需要提前创建pv,直接声明,会自动创建声明大小的块。

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-client-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: persistentvolumes
            - name: NFS_SERVER
              value: 192.168.211.11
            - name: NFS_PATH
              value: /nfs/data/03 # nfs服务器共享的目录 指定NFS服务器共享的目录
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.211.11
            path: /nfs/data/03  # nfs服务器共享的目录 指定NFS服务器共享的目录

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
 
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
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: ["list", "watch", "create", "update", "patch"]
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
 
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: course-nfs-storage
provisioner: persistentvolumes

只要需要把里面的ip换成自己nfs的ip即可 

下面是配置默认存储类。

kubectl patch storageclass course-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

 创建pvc

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-pvc01
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests :
      storage: 200Mi

 这里不需要写storageClassName,因为我吗上面配置了默认存储。

 这就成功了。

注意:如果有的朋友出现了pending状态,查看日志

 如果和我的报错一样,那就是缺少配置。

/etc/kubernetes/manifests/kube-apiserver.yaml增加配置

spec:
  containers:
  - command:
    - kube-apiserver
    - --feature-gates=RemoveSelfLink=false

kubeadm安装的apiserver是Static Pod,它的配置文件被修改后,立即生效。Kubelet 会监听该文件的变化,当您修改了 /etc/kubenetes/manifest/kube-apiserver.yaml 文件之后,kubelet 将自动终止原有的 kube-apiserver-{nodename} 的 Pod,并自动创建一个使用了新配置参数的 Pod 作为替代。如果您有多个 Kubernetes Master 节点,您需要在每一个 Master 节点上都修改该文件,并使各节点上的参数保持一致。

这里我的修改后没生效,手动加载下yaml即可

kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml

这个时候pending就变成Bound了。

四、ConfigMap抽取配置文件

有时候我们还需要把应用的配置文件抽象出来,统一管理,configMap就诞生了

1、创建

# 把redis的配置创建成可配置集

kubectl create cm redis-conf --from-file=redis.conf

# 获取配置配置集

kubectl get cm

# 获取配置集内容

kubectl get cm redis-conf -oyaml

redis-conf 结果集名

redis.conf 文件名

vim redis.conf

appendonly yes

 配置已经有了,所以如果你创建应用(redis)的时候只需要应用一下这个配置集就可以了

2、应用配置集

上面我们创建了配置如下截图

kubectl get cm redis-conf -oyaml

 接下来我们应用一下

apiVersion: v1
kind: Pod
metadata: 
  name: redis
spec:
  containers :
  - name: redis
    image: redis
    command:
      - redis-server
      - "/redis-master/redis.conf" #指的 是redis容器内部的位置
    ports:
    - containerPort: 6379
    volumeMounts:
    - mountPath: /data
      name: data
    - mountPath: /redis-master # 挂载路径
      name: config # 挂载的东西的名字 (1
  volumes :
  - name: data
    emptyDir: {} 
  - name: config # 和上面(1 对应
    configMap:
      name: redis-conf # 第一步创建的结果集名字
      items:
      - key: redis.conf # 对应结果集中的配置文件名,可以看出来可以有多个
        path: redis.conf # 在pod容器中生成配置文件后的名字

kubectl apply -f cm.yaml

创建成功后,查看redis确实是我们当初的配置

 3、修改配置

配置修改后,容器里的配置也会生效

 kubectl edit cm redis-conf

 修改完后,差不多等会就会通步到容器内部

redis获取配置

注意:redis修改完后,没有热更新配置,需要重新启动redis

五、Secret

 Secret对象类型用来保存敏感信息,例如密码、OAuth 令牌和SSH密钥。将这些信息放在secret中比放在Pod的定义或者容器镜像中来说更加安全和灵活。

我们接下来为仓库创建一套登录账户和密码

kubectl create secret docker-registry mysecret-docker \
--docker-username=xiaoming \
--docker-password=xm123123 \
--docker-email=123@qq.com 

 再这样应用去拉去镜像

apiVersion: v1
kind: Pod
metadata:
  name: private-nginx
spec:
  containers:
  - name: private-nginx
    image: nginx
  imagePullsecrets:
  - name: mysecret-docker

 完毕了!!!!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐