SQL Server 在本地 kubernetes 上运行,在本地机器上有一个卷

问题描述 投票:0回答:1

上下文

  • 我的操作系统是 ubuntu 22.04.
  • 我用的是minikube。但我想要一些看起来像我必须在产品上部署的东西。

我想要的

  • SQL服务器
  • “绑定”到我主机上硬盘驱动器本地目录的卷上的 SQL Server 数据

我做了什么

sudo mkdir /mnt/mssql
sudo chmod +777 /mnt/mssql
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mon-volume-persistant
spec:
  storageClassName: local-storage
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/mssql
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mon-volume-persistant-claim
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mssql-deployment
spec:
  replicas: 1
  selector:
     matchLabels:
       app: mssql
  template:
    metadata:
      labels:
        app: mssql
    spec:
      terminationGracePeriodSeconds: 30
      hostname: mssqlinst
      securityContext:
        runAsUser: 10001
      containers:
      - name: mssql
        image: mcr.microsoft.com/mssql/server:2019-latest
        resources:
          requests:
            memory: "2G"
            cpu: "2000m"
          limits:
            memory: "2G"
            cpu: "2000m"
        ports:
        - containerPort: 1433
        env:
        - name: MSSQL_PID
          value: "Developer"
        - name: ACCEPT_EULA
          value: "Y"
        - name: MSSQL_SA_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mssql
              key: MSSQL_SA_PASSWORD
        volumeMounts:
        - name: mssqldb
          mountPath: /var/opt/mssql
      volumes:
      - name: mssqldb
        persistentVolumeClaim:
          claimName: mon-volume-persistant-claim
apiVersion: v1
kind: Secret
metadata:
  name: mssql
type: Opaque
data:
  MSSQL_SA_PASSWORD: {{ .Values.sql_sa_password | b64enc }}
apiVersion: v1
kind: Service
metadata:
  name: mssql-deployment
spec:
  selector:
    app: mssql
  ports:
    - protocol: TCP
      port: 1433
      targetPort: 1433
  type: LoadBalancer

我得到的

pod无法启动成功

kubectl describe pvc mon-volume-persistant-claim

Name:          mon-volume-persistant-claim
Namespace:     default
StorageClass:  local-storage
Status:        Bound
Volume:        mon-volume-persistant
Labels:        app.kubernetes.io/managed-by=Helm
Annotations:   meta.helm.sh/release-name: mssql
               meta.helm.sh/release-namespace: default
               pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      10Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Used By:       mssql-deployment-6477c9d6fb-jpbx4
Events:
  Type    Reason                Age   From                         Message
  ----    ------                ----  ----                         -------
  Normal  WaitForFirstConsumer  31m   persistentvolume-controller  waiting for first consumer to be created before binding
kubectl describe pv mon-volume-persistant

Name:            mon-volume-persistant
Labels:          app.kubernetes.io/managed-by=Helm
Annotations:     meta.helm.sh/release-name: mssql
                 meta.helm.sh/release-namespace: default
                 pv.kubernetes.io/bound-by-controller: yes
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    local-storage
Status:          Bound
Claim:           default/mon-volume-persistant-claim
Reclaim Policy:  Retain
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        10Gi
Node Affinity:   <none>
Message:         
Source:
    Type:          HostPath (bare host directory volume)
    Path:          /mnt/mssql
    HostPathType:  
Events:            <none>
kubectl logs mssql-deployment-6477c9d6fb-jpbx4 --all-containers

SQL Server 2019 will run as non-root by default.
This container is running as user mssql.
To learn more visit https://go.microsoft.com/fwlink/?linkid=2099216.
/opt/mssql/bin/sqlservr: Error: The system directory [/.system] could not be created. File: LinuxDirectory.cpp:420 [Status: 0xC0000022 Access Denied errno = 0xD(13) Permission denied]

我确定我正在尝试解决一个非常普遍和简单的问题,但我在 K8S 官方文档中找不到任何清晰和完整的方法。

kubernetes persistent-volumes
1个回答
0
投票

实际上,我必须删除存储类并使用

standard
代替。

然后我必须进入minikube容器的终端,并使

chown -R 10001:0 <my host folder>
实际上,从kubernetes的角度来看,minikube容器是kubernetes的宿主。 (参见此处:https://mycsharpdeveloper.wordpress.com/2022/10/30/minikube-opt-mssql-bin-sqlservr-error-the-system-directory-system-could-not-be-created/ )

然后,要将此文件夹按原样映射到我的裸机本地文件夹中,我必须从我的机器上使用

minikube mount 
命令。 (参见此处:https://minikube.sigs.k8s.io/docs/handbook/mount/

如果你想让所有东西都持久存在你的裸机上

  • 在您的裸机主机上,运行此命令:
minikube mount /mnt/mssql:/data/mssql --uid=10001

10001 是部署中提到的用户。这个命令实际上对 minikube 说,托管 kubernetes 的容器镜像会将其文件夹

/data/mssql
映射到非常本地的文件夹
/mnt/mssql
,并且它的本地文件夹将属于用户 10001。然后在卷上,该文件夹是提到
hostPath
是直接主机的路径...即 minikube 容器。在这个 minikube 容器上,我们刚刚定义这个文件夹将是
/data/mssql

  • 部署你的 helm chart 或你的 K8S manifests

如果你想让所有东西只持久化在你的 minikube 容器上

  • 获取minikube的container_id:
docker ps
  • 在 minikube 容器上打开一个终端:
run docker exec -it -u root <the previously discovered container_id> 
  • 将所有权授予将运行部署的 pod 的用户
chown -R 10001:0 /data/mssql
  • 部署你的 helm chart 或你的 K8S manifests
  • 将服务从 minikube 暴露到本地机器:
minikube tunnel
  • 列表服务:
kubectl get svc
  • 您的 SQL Server 的 IP 地址是 External-IP 中提到的那个
© www.soinside.com 2019 - 2024. All rights reserved.