从无到有基于腾讯云TKE部署Kubernetes全流程(三)

问题来了:对于一些业务需要一些持久化的存储,我们一般采用什么方案呢?

硬盘、文件存储、对象存储 ?

硬盘

只能实现一对一挂载,因为硬盘只支持一次挂载,通过硬盘创建的PVC为RWO,单机读写。

文件存储

支持 ReadWriteMany ,PVC类型为多机读写。

对象存储

支持 ReadWriteMany ,PVC类型为多机读写。

这里贴一个各个存储的比较图

这里我们就通过腾讯云COS演示,多个服务需要共享一个内容文件如何实现。

1、首先创建COS存储桶,并拿到访问相关;

2、向TKE集群添加COS访问的Secret;

注意写错了,不能在控制台删,可以修改yaml文件,但是变量值是base64转码后的值,可以命令行删除sercret,重建即可。

3、TKE集群中添加PV;

注意如果提示不能使用CFS、COS联系客服,开启即可。

4、TKE集群通过该PV添加PVC;

5、创建Deployment,关联该PVC;

到这一步难道就结束了吗? 最关键的才刚刚开始,nginx访问报错 403!

问题描述: Pod 正常启动毫无问题,但是访问出现403,日志中也报出403。

代码语言:javascript
复制
2020/06/28 03:11:05 [error] 28#28: *1 "/usr/share/nginx/html/index.html" is forbidden (13: Permission denied), client: 10.0.0.7, server: localhost, request: "GET / HTTP/1.1", host: "172.16.0.34"

发现 nginx,conf 中 user 为nginx,而经过COS挂载的权限为root,经过测试修改文件所属关系没有作用,我们换一个思路,让nginx以root启动,并重启nginx服务。

这里我们直接通过命令行修改该deployment文件即可,由于在控制台修改个人也得修改yaml文件,不方便,所以这里我贴一份成功的deployment文件给大家参考。

代码语言:javascript
复制
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    k8s-app: nginx-deploy
    qcloud-app: nginx-deploy
  name: nginx-deploy
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: nginx-deploy
      qcloud-app: nginx-deploy
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        k8s-app: nginx-deploy
        qcloud-app: nginx-deploy
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        lifecycle:
          postStart:
            exec:
              command:
              - /bin/sh
              - -c
              - sed -i 's#nginx;#root;#g'  /etc/nginx/nginx.conf;
              - nginx
              - -s
              - reload
        name: nginx-deploy-pod
        resources:
          limits:
            cpu: 500m
            memory: 1Gi
          requests:
            cpu: 250m
            memory: 256Mi
        securityContext:
          privileged: false
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: cos
      dnsPolicy: ClusterFirst
      imagePullSecrets:
      - name: qcloudregistrykey
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - name: cos
        persistentVolumeClaim:
          claimName: cq-cos-pvc

核心部分就在与 podStart,执行了一串命令,更改了nginx.conf的配置文件,并使得nginx重启。

成功画面