在 Kubernetes 中访问 Nextcloud 时出错

Error when access to Nextcloud in Kubernetes

我的目标是:

我尝试用 Nextcloud 部署一个 pod 和一个访问它的服务,但实际上我无法访问它。我有一个错误:

message ERR_SSL_PROTOCOL_ERROR.

一开始我只是跟着一个tutorial但是我不想像解释的那样使用nginx因为我在另一台机器上有它

当我查看 pods (nextcloud + db) 和服务时,它们看起来不错,但当我尝试访问 nextcloud 时没有任何响应。

(nc = nextcloud)

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nc
  name: nc
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nc
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nc
    spec:
      containers:
      - env:
        - name: DEBUG
          value: "false"
        - name: NEXTCLOUD_URL
          value: http://test.fr
        - name: NEXTCLOUD_ADMIN_USER
          value: admin
        - name: NEXTCLOUD_ADMIN_PASSWORD
          valueFrom:
            secretKeyRef:
              name: nextcloud
              key: NEXTCLOUD_ADMIN_PASSWORD
        - name: NEXTCLOUD_UPLOAD_MAX_FILESIZE
          value: 4G
        - name: NEXTCLOUD_MAX_FILE_UPLOADS
          value: "20"
        - name: MYSQL_DATABASE
          value: nextcloud
        - name: MYSQL_HOST
          value: mariadb
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mariadb
              key: MYSQL_ROOT_PASSWORD
        - name: MYSQL_USER
          value: nextcloud
        name: nc
        image: nextcloud
        ports:
        - containerPort: 80
          protocol: TCP
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /var/www/html
          name: vnextcloud
          subPath: html
        - mountPath: /var/www/html/custom_apps
          name: vnextcloud
          subPath: apps
        - mountPath: /var/www/html/config
          name: vnextcloud
          subPath: config
        - mountPath: /var/www/html/data
          name: vimages
          subPath: imgnc
        - mountPath: /var/www/html/themes
          name: vnextcloud
          subPath: themes
      restartPolicy: Always
      volumes:
        - name: vnextcloud
          persistentVolumeClaim:
            claimName: nfs-pvcnextcloud
        - name: vimages
          persistentVolumeClaim:
            claimName: nfs-pvcimages

为了创建服务,我使用了这个命令行:

kubectl expose deployment nc --type=NodePort --name=svc-nc --port 80

为了访问我的 nextcloud,我尝试了地址 @IP_MASTER:32500

我的问题是:

1.请考虑使用稳定版nextcloud helm chart

2.这个教程有点过时了,也可以找到here

在 kubernetes 1.16 版本中,您应该将所有部署的 apiVersion 更改为 apiVersion: apps/v1 请查看 Deprecations and Removals。 此外,您应该会收到错误 ValidationError(Deployment.spec): missing required field "selector",因此请在 Deployment.spec 下的部署中添加选择器,例如:

selector:
  matchLabels:
    app: db

3. 最后创建自签名证书。这个 repo 使用 OMGWTFSSL - Self Signed SSL Certificate Generator。一旦您提供了必要的信息,如服务器名称、本地路径 hostpath 和 SSL 证书的名称,它将在指定的 hostpath:[=31= 下的一个 pod-运行 后自动创建]

volumes:
  - name: certs
    hostPath:
      path: "/home/<someFolderLocation>/certs-pv"
  • 这些信息应该在 nginx.conf
  • 的 Nginx 反向代理部分重新使用

4. 在您的 nc-svc.yaml 中,您可以将服务类型更改为 类型:NodePort

5. 如何验证您的服务器是否正常工作:

kubectl get pods,svc,ep -o wide

Pods:
pod/nc-6d8694659d-5przx   1/1     Running     0          15m   10.244.0.6 
Svc: 
service/svc-nc       NodePort    10.102.90.88   <none>        80:32500/TCP
Endpoints: 
endpoints/svc-nc       10.244.0.6:80

您可以从集群内部测试您的服务 运行ning 单独的 pod (f.e。ubuntu)

curl your_svc_name

您可以验证服务发现是否正常工作:

cat /etc/resolv.conf
nslokup svc_your_svc_name (your_svc_name.default.svc.cluster.local)

使用 NodePort 从集群外部:

curl NODE_IP:NODE_PORT ( if not please verify your firewall rules)
Once you provided hostname for your nextcloud service you should use
curl -vH 'Host:specified_hostname' http://external_ip/ (using http or https according to your configuration)

此外,您可以直接执行到您的数据库 pod

kuebctl exec -it db_pod -- /bin/bash  and run 

mysqladmin status -uroot -p$MARIADB_ROOT_PASSWORD
mysqlshow  -uroot -p$MYSQL_ROOT_PASSWORD --status nextcloud

6. 我应该怎么做才能访问我的 nextcloud? 我没有做 tuto 部分 "Create self-signed certificates" 因为我不知道如何管理。

7. 如第 3 点所述。

8. 这部分我不清楚:from another machine with nginx route a CNAME to the service

请参考: ExternalName Service 是服务的一种特殊情况,它没有选择器,而是使用 DNS 名称。

其他资源:

希望对您有所帮助。