你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn 。
为 Azure Kubernetes 服务预配 Azure NetApp 文件双重协议卷
本文内容
为 Azure Kubernetes 服务配置 Azure NetApp 文件 后,可为 Azure Kubernetes 服务预配 Azure NetApp 文件卷。
Azure NetApp 文件支持使用 NFS (NFSv3 或 NFSv4.1)、SMB 和双重协议(NFSv3 和 SMB,或 NFSv4.1 和 SMB)的卷。
本文介绍如何使用 NFS 或 SMB 为双协议访问静态预配卷。
开始之前
在 Azure Kubernetes 服务中预配双重协议卷
本部分介绍如何向 Kubernetes 静态公开 Azure NetApp 文件双重协议卷。 提供了有关 SMB 和 NFS 协议的说明。 你可通过 SMB 向 Windows 工作器节点公开同一卷,通过 NFS 向 Linux 工作器节点公开同一卷。
创建 NFS 永久性卷
定义变量供以后使用。 将 myresourcegroup、myaccountname、mypool1 和 myvolname 替换为双重协议卷中的相应值。
RESOURCE_GROUP="myresourcegroup"
ANF_ACCOUNT_NAME="myaccountname"
POOL_NAME="mypool1"
VOLUME_NAME="myvolname"
使用 az netappfiles volume show
命令列出卷的详细信息。
az netappfiles volume show \
--resource-group $RESOURCE_GROUP \
--account-name $ANF_ACCOUNT_NAME \
--pool-name $POOL_NAME \
--volume-name $VOLUME_NAME -o JSON
以下输出是以实际值执行上述命令的示例。
{
...
"creationToken": "myfilepath2",
...
"mountTargets": [
{
...
"ipAddress": "10.0.0.4",
...
}
],
...
}
创建名为 pv-nfs.yaml
的文件,并将其复制到以下 YAML 中。 确保服务器与上一步的输出 IP 地址匹配,并且路径与上面 creationToken
的输出匹配。 容量还必须与步骤 2 中的卷大小匹配。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
mountOptions:
- vers=3
nfs:
server: 10.0.0.4
path: /myfilepath2
使用 kubectl apply
命令创建永久性卷:
kubectl apply -f pv-nfs.yaml
使用 kubectl describe
命令验证永久性卷的状态是否为“Available”:
kubectl describe pv pv-nfs
创建 NFS 永久性卷声明
创建名为 pvc-nfs.yaml
的文件,并将其复制到以下 YAML 中。 此清单为 100Gi 存储和 ReadWriteMany
访问模式创建一个名为 pvc-nfs
的 PVC,与你创建的 PV 匹配。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
resources:
requests:
storage: 100Gi
使用 kubectl apply
命令创建永久性卷声明:
kubectl apply -f pvc-nfs.yaml
使用 kubectl describe
命令验证永久性卷声明的状态是否为“Bound”:
kubectl describe pvc pvc-nfs
使用 NFS 装载到 Pod
创建名为 nginx-nfs.yaml
的文件,并将其复制到以下 YAML 中。 这个清单定义了一个使用持久卷声明的 nginx
pod。
kind: Pod
apiVersion: v1
metadata:
name: nginx-nfs
spec:
containers:
- image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
name: nginx-nfs
command:
- "/bin/sh"
- "-c"
- while true; do echo $(date) >> /mnt/azure/outfile; sleep 1; done
volumeMounts:
- name: disk01
mountPath: /mnt/azure
volumes:
- name: disk01
persistentVolumeClaim:
claimName: pvc-nfs
使用 kubectl apply
kubectl apply 命令创建 Pod:
kubectl apply -f nginx-nfs.yaml
使用 kubectl apply
命令验证 Pod 是否正在运行:
kubectl describe pod nginx-nfs
验证卷是否已装载到 Pod 上:使用 kubectl exec
连接到 Pod,然后使用 df -h
检查该卷是否已装载。
kubectl exec -it nginx-nfs -- sh
/ # df -h
Filesystem Size Used Avail Use% Mounted on
...
10.0.0.4:/myfilepath2 100T 384K 100T 1% /mnt/azure
...
使用域凭据创建机密
使用 kubectl create secret
命令在 AKS 群集上创建用于访问 AD 服务器的机密。 Kubernetes 永久性卷将使用此机密来访问 Azure NetApp 文件 SMB 卷。 使用以下命令创建机密,将 USERNAME
替换为你的用户名,将 PASSWORD
替换为你的密码,并将 DOMAIN_NAME
替换为你的 Active Directory 域名。
kubectl create secret generic smbcreds --from-literal=username=USERNAME --from-literal=password="PASSWORD" --from-literal=domain='DOMAIN_NAME'
若要验证是否已创建机密,请运行 kubectl get
命令。
kubectl get secret
NAME TYPE DATA AGE
smbcreds Opaque 2 20h
安装 SMB CSI 驱动程序
必须安装容器存储接口 (CSI) 驱动程序才能创建 Kubernetes SMB PersistentVolume
。
使用 Helm 在群集上安装 SMB CSI 驱动程序。 请务必将 windows.enabled
选项设置为 true
:
helm repo add csi-driver-smb https://raw.githubusercontent.com/kubernetes-csi/csi-driver-smb/master/charts
helm install csi-driver-smb csi-driver-smb/csi-driver-smb --namespace kube-system --version v1.10.0 –-set windows.enabled=true
有关安装 SMB CSI 驱动程序的其他方法,请参阅在 Kubernetes 群集上安装 SMB CSI 驱动程序主版本 。
使用 kubectl get pods
命令验证 csi-smb
控制器 Pod 是否正在运行,并且每个工作器节点是否都有一个 Pod 正在运行:
kubectl get pods -n kube-system | grep csi-smb
csi-smb-controller-68df7b4758-xf2m9 3/3 Running 0 3m46s
csi-smb-node-s6clj 3/3 Running 0 3m47s
csi-smb-node-win-tfxvk 3/3 Running 0 3m47s
创建 SMB 永久性卷
定义变量供以后使用。 将 myresourcegroup、myaccountname、mypool1 和 myvolname 替换为双重协议卷中的相应值。
RESOURCE_GROUP="myresourcegroup"
ANF_ACCOUNT_NAME="myaccountname"
POOL_NAME="mypool1"
VOLUME_NAME="myvolname"
使用 az netappfiles volume show
命令列出卷的详细信息。
az netappfiles volume show \
--resource-group $RESOURCE_GROUP \
--account-name $ANF_ACCOUNT_NAME \
--pool-name $POOL_NAME \
--volume-name "$VOLUME_NAME -o JSON
以下输出是以实际值执行上述命令的示例。
{
...
"creationToken": "myvolname",
...
"mountTargets": [
{
...
"
"smbServerFqdn": "ANF-1be3.contoso.com",
...
}
],
...
}
创建名为 pv-smb.yaml
的文件,并将其复制到以下 YAML 中。 如有必要,请将 myvolname
替换为 creationToken
,并将 ANF-1be3.contoso.com\myvolname
替换为上一步中 smbServerFqdn
的值。 请务必包含你在上一步中创建的 AD 凭据机密及其所在命名空间。
apiVersion: v1
kind: PersistentVolume
metadata:
name: anf-pv-smb
spec:
storageClassName: ""
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
mountOptions:
- dir_mode=0777
- file_mode=0777
- vers=3.0
csi:
driver: smb.csi.k8s.io
readOnly: false
volumeHandle: myvolname # make sure it's a unique name in the cluster
volumeAttributes:
source: \\ANF-1be3.contoso.com\myvolname
nodeStageSecretRef:
name: smbcreds
namespace: default
使用 kubectl apply
命令创建永久性卷:
kubectl apply -f pv-smb.yaml
使用 kubectl describe
命令验证永久性卷的状态是否为“Available”:
kubectl describe pv anf-pv-smb
创建 SMB 永久性卷声明
创建名为 pvc-smb.yaml
的文件,并将其复制到以下 YAML 中。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: anf-pvc-smb
spec:
accessModes:
- ReadWriteMany
volumeName: anf-pv-smb
storageClassName: ""
resources:
requests:
storage: 100Gi
使用 kubectl apply
命令创建永久性卷声明:
kubectl apply -f pvc-smb.yaml
使用 kubectl describe
命令验证永久性卷声明的状态是否为“Bound”:
kubectl describe pvc anf-pvc-smb
使用 SMB 装载到 Pod
创建名为 iis-smb.yaml
的文件,并将其复制到以下 YAML 中。 此文件将用于创建 Internet Information Services Pod,以将卷装载到路径 /inetpub/wwwroot
。
apiVersion: v1
kind: Pod
metadata:
name: iis-pod
labels:
app: web
spec:
nodeSelector:
"kubernetes.io/os": windows
volumes:
- name: smb
persistentVolumeClaim:
claimName: anf-pvc-smb
containers:
- name: web
image: mcr.microsoft.com/windows/servercore/iis:windowsservercore
resources:
limits:
cpu: 1
memory: 800M
ports:
- containerPort: 80
volumeMounts:
- name: smb
mountPath: "/inetpub/wwwroot"
readOnly: false
使用 kubectl apply 命令创建 Pod:
kubectl apply -f iis-smb.yaml
使用 kubectl describe
命令验证 Pod 是否正在运行,并且 /inetpub/wwwroot
是否是从 SMB 装载的:
kubectl describe pod iis-pod
该命令的输出类似于以下示例:
Name: iis-pod
Namespace: default
Priority: 0
Node: akswin000001/10.225.5.246
Start Time: Fri, 05 May 2023 09:34:41 -0400
Labels: app=web
Annotations: <none>
Status: Running
IP: 10.225.5.248
IPs:
IP: 10.225.5.248
Containers:
web:
Container ID: containerd://39a1659b6a2b6db298df630237b2b7d959d1b1722edc81ce9b1bc7f06237850c
Image: mcr.microsoft.com/windows/servercore/iis:windowsservercore
Image ID: mcr.microsoft.com/windows/servercore/iis@sha256:0f0114d0f6c6ee569e1494953efdecb76465998df5eba951dc760ac5812c7409
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Fri, 05 May 2023 09:34:55 -0400
Ready: True
Restart Count: 0
Limits:
cpu: 1
memory: 800M
Requests:
cpu: 1
memory: 800M
Environment: <none>
Mounts:
/inetpub/wwwroot from smb (rw)
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-mbnv8 (ro)
...
验证卷是否已装载到 Pod 上:使用 kubectl exec 命令连接到 Pod。 然后使用正确目录中的 dir
命令检查是否已装载卷,并且大小是否与预配卷的大小匹配。
kubectl exec -it iis-pod –- cmd.exe
该命令的输出类似于以下示例:
Microsoft Windows [Version 10.0.20348.1668]
(c) Microsoft Corporation. All rights reserved.
C:\>cd /inetpub/wwwroot
C:\inetpub\wwwroot>dir
Volume in drive C has no label.
Volume Serial Number is 86BB-AA55
Directory of C:\inetpub\wwwroot
05/04/2023 08:15 PM <DIR> .
05/04/2023 08:15 PM <DIR> ..
0 File(s) 0 bytes
2 Dir(s) 107,373,838,336 bytes free
后续步骤
Astra Trident 支持 Azure NetApp 文件的许多功能。 有关详细信息,请参阅: