本文介绍如何基于SidecarSet向虚拟节点中的Pod注入Sidecar容器,实现PolarDB Agent LakeBase的挂载。
适用范围
ACS官方支持基于SidecarSet向虚拟节点中的Pod注入Sidecar容器方式挂载。更多信息,请参见向虚拟节点中的Pod注入Sidecar容器。
SidecarSet:请根据上文SidecarSet文档在您的集群中安装SidecarSet相关依赖。您ACK/ACS集群开启了允许特权容器。
镜像:将镜像拉取到自己的 ACR 仓库。请将PolarDB Agent LakeBase镜像拉取到您自己的ACR仓库,生成您自己的镜像地址,并将下文中的
<YOUR_LAKEBASE_IMAGE>替换为您的地址。docker pull lakebase-registry.cn-beijing.cr.aliyuncs.com/lakebase/lakebase-client:latest
参数占位符说明
以下为本文YAML配置中使用的占位符,请根据实际情况替换。
占位符 | 说明 | 示例 |
| 您的PolarDB Agent LakeBase实例 ID 。 |
|
| 您的应用Pod所在的命名空间。 |
|
| 您的镜像链接。 |
|
| 您可以在PolarDB Agent LakeBase实例的基本信息页面中获取MetaUrl信息。 |
|
| 挂载点目录。 |
|
| 可选。填写LakeBase根目录下的子目录相对路径,例如 说明
|
|
(可选)开启SSL模式
如果您在沙箱类环境使用PolarDB Agent LakeBase,建议开启SSL增强安全性,防止网络注入等问题。
SSL切换会重启后台服务,请在业务低峰期执行。
在PolarDB控制台目标集群详情页,单击AI缓存页签,单击目标PolarDB Agent LakeBase实例进入实例详情页,单击SSL配置页签。
分别在主地址和集群地址卡片中打开SSL状态开关,将SSL状态由未开通调整为已开通。两个地址的证书是一致的。
等待SSL状态变为已开通。
单击下载证书。
解压下载的证书压缩包。
将pem文件重命名为
ca.pem。
使用如下Dockerfile封装镜像,生成您自己的
<YOUR_LAKEBASE_IMAGE>并推送到您的ACR仓库中。FROM lakebase-registry.cn-beijing.cr.aliyuncs.com/lakebase/lakebase-client:latest COPY ca.pem /usr/local/bin/ca.pemdocker build -t <YOUR_LAKEBASE_IMAGE> .说明当PolarDB Agent LakeBase挂载时使用了
ca.pem时,请确保已在控制台开启SSL模式。
生成Secret
创建如下YAML文件(例如secret.yaml),并将占位符替换为实际值。
如果您有多个业务namespace ,请参考OpenKruise社区ResourceDistribution功能,将Secret分发到所需的命名空间下,或namespace不多时可手动维护。
apiVersion: v1
kind: Secret
metadata:
name: <LAKEBASE_ID>
namespace: <YOUR_NAMESPACE>
type: Opaque
stringData:
name: "<LAKEBASE_ID>"
metaurl: "<META_URL>"执行以下命令创建 Secret。
kubectl apply -f secret.yaml配置SidecarSet
请根据集群的Kubernetes版本选择对应的配置(YAML文件)方式。
Kubernetes 版本 >= 1.29(社区原生Sidecar)
当Kubernetes 版本 >= 1.29时,使用initContainers并设置restartPolicy: Always来声明原生Sidecar容器。
请将下述<YOUR_LAKEBASE_IMAGE>和<LAKEBASE_ID>占位符替换为实际值。
# ============================================================
# 方式一:K8s >= 1.29 社区原生 Sidecar 声明
# SidecarSet 通过 initContainers 注入,配合 restartPolicy: Always
# K8s 原生保证 Sidecar 在应用容器之前启动完成
# ============================================================
apiVersion: apps.kruise.io/v1alpha1
kind: SidecarSet
metadata:
name: lakebase-sidecarset
spec:
selector:
matchLabels:
inject-lakebase: "true"
serverless.alibabacloud.com/virtual-node: "true"
updateStrategy:
type: NotUpdate
initContainers:
- name: lakebase-mount
image: <YOUR_LAKEBASE_IMAGE>
imagePullPolicy: Always
restartPolicy: Always
command:
- sh
- -c
- |-
/usr/local/bin/lakebase-client mount ${metaurl} /lakebase-data
env:
- name: JFS_FOREGROUND
value: "1"
envFrom:
- secretRef:
name: <LAKEBASE_ID>
ports:
- containerPort: 9567
name: metrics
protocol: TCP
resources:
limits:
cpu: "2"
memory: 4Gi
requests:
cpu: "2"
memory: 4Gi
securityContext:
privileged: true
runAsUser: 0
lifecycle:
preStop:
exec:
command:
- sh
- -c
- 'fusermount -u /lakebase-data 2>/dev/null || umount /lakebase-data 2>/dev/null || umount -l /lakebase-data || true'
startupProbe:
exec:
command:
- sh
- -c
- "mount | grep /lakebase-data | grep PolarFS"
initialDelaySeconds: 5
periodSeconds: 3
failureThreshold: 50
successThreshold: 1
volumeMounts:
- name: lakebase-dir
mountPath: /lakebase-data
mountPropagation: Bidirectional
volumes:
- name: lakebase-dir
emptyDir: {}Kubernetes 版本 < 1.29(ACS定制方式)
当Kubernetes 版本 < 1.29时,使用containers并通过__IS_SIDECAR__环境变量和podInjectPolicy: BeforeAppContainer来声明Sidecar容器。更多信息,请参见配置Sidecar容器启停顺序。
请将下述<YOUR_LAKEBASE_IMAGE>和<LAKEBASE_ID>占位符替换为实际值。
# ============================================================
# 方式二:K8s < 1.29 ACS 定制 Sidecar 声明
# SidecarSet 通过 containers 注入,配合 __IS_SIDECAR__ 环境变量
# ACS 识别该标记后确保 Sidecar 先于其他普通容器启动
# ============================================================
apiVersion: apps.kruise.io/v1alpha1
kind: SidecarSet
metadata:
name: lakebase-sidecarset
spec:
selector:
matchLabels:
inject-lakebase: "true"
serverless.alibabacloud.com/virtual-node: "true"
updateStrategy:
type: NotUpdate
containers:
- name: lakebase-mount
image: <YOUR_LAKEBASE_IMAGE>
imagePullPolicy: Always
podInjectPolicy: BeforeAppContainer
upgradeStrategy:
upgradeType: ColdUpgrade
shareVolumePolicy:
type: disabled
command:
- sh
- -c
- |-
/usr/local/bin/lakebase-client mount ${metaurl} /lakebase-data
env:
- name: JFS_FOREGROUND
value: "1"
- name: __IS_SIDECAR__
value: "true"
envFrom:
- secretRef:
name: <LAKEBASE_ID>
ports:
- containerPort: 9567
name: metrics
protocol: TCP
resources:
limits:
cpu: "2"
memory: 4Gi
requests:
cpu: "2"
memory: 4Gi
securityContext:
privileged: true
runAsUser: 0
lifecycle:
preStop:
exec:
command:
- sh
- -c
- 'fusermount -u /lakebase-data 2>/dev/null || umount /lakebase-data 2>/dev/null || umount -l /lakebase-data || true'
startupProbe:
exec:
command:
- sh
- -c
- "mount | grep /lakebase-data | grep PolarFS"
initialDelaySeconds: 5
periodSeconds: 3
failureThreshold: 50
successThreshold: 1
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- name: lakebase-dir
mountPath: /lakebase-data
mountPropagation: Bidirectional
volumes:
- name: lakebase-dir
emptyDir: {}执行以下命令创建SidecarSet。
kubectl apply -f lakebase-sidecarset.yaml(可选)配置忽略Sidecar容器资源
为了避免在使用Sidecar模式时增加Pod的资源消耗, 同时保证Sidecar容器和业务容器合理共享资源,您可以通过配置调度策略来忽略Sidecar容器的资源占用。忽略容器资源的环境变量名为__IGNORE_RESOURCE__,设置取值为true时则表示忽略该容器的资源声明。如需设置,可在lakebase-sidecarset.yaml的容器env中添加如下配置。更多信息,请参见配置调度忽略特定容器资源。
- name: __IGNORE_RESOURCE__
value: "true"创建应用Pod
完成SidecarSet配置后,创建应用Pod。以下为使用Nginx作为应用容器的示例。
请将下述<YOUR_NAMESPACE>、<MOUNT_POINT>和<SUB_DIR>占位符替换为实际值。
apiVersion: v1
kind: Pod
metadata:
name: lakebase-sidecarset-app
namespace: <YOUR_NAMESPACE>
labels:
inject-lakebase: "true" # 必填,声明允许注入lakebase sidecar容器
serverless.alibabacloud.com/virtual-node: "true" # 如使用eci或vnode必填
spec:
containers:
- name: nginx
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
imagePullPolicy: IfNotPresent
command:
- sh
- -c
- exec nginx -g 'daemon off;'
ports:
- containerPort: 80
protocol: TCP
resources:
limits:
cpu: "1"
memory: 1Gi
requests:
cpu: "1"
memory: 1Gi
volumeMounts:
- name: lakebase-dir
mountPath: <MOUNT_POINT>
subPath: <SUB_DIR>
mountPropagation: HostToContainer
volumes:
- name: lakebase-dir
emptyDir: {}
nodeSelector:
type: virtual-kubelet
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule执行以下命令创建应用Pod,待业务Pod拉起后,进入容器访问您指定的<MOUNT_POINT>目录即可使用PolarDB Agent LakeBase。
kubectl apply -f app.yaml附录:手动注入Sidecar(不推荐)
如您无意使用SidecarSet能力或是想自行控制Sidecar容器的生命周期和行为,您可参照如下示例编写您的Pod来手动将PolarDB Agent LakeBase挂载容器注入到Pod中。建议您生产环境优先使用上文的SidecarSet来进行挂载,手动注入可能带来冗余的维护成本。
请将下述<YOUR_NAMESPACE>、<MOUNT_POINT>、<SUB_DIR>、<YOUR_LAKEBASE_IMAGE>和<LAKEBASE_ID>占位符替换为实际值。
apiVersion: v1
kind: Pod
metadata:
annotations: {}
name: lakebase-sidecar-manual-app
namespace: <YOUR_NAMESPACE>
spec:
initContainers:
- name: lakebase-mount
image: <YOUR_LAKEBASE_IMAGE>
imagePullPolicy: Always
restartPolicy: Always
command:
- sh
- -c
- |-
/usr/local/bin/lakebase-client mount ${metaurl} /lakebase-data
env:
- name: JFS_FOREGROUND
value: "1"
envFrom:
- secretRef:
name: <LAKEBASE_ID>
ports:
- containerPort: 9567
name: metrics
protocol: TCP
resources:
limits:
cpu: "2"
memory: 4Gi
requests:
cpu: "2"
memory: 4Gi
securityContext:
privileged: true
runAsUser: 0
lifecycle:
preStop:
exec:
command:
- sh
- -c
- 'fusermount -u /lakebase-data 2>/dev/null || umount /lakebase-data 2>/dev/null || umount -l /lakebase-data || true'
startupProbe:
exec:
command:
- sh
- -c
- "mount | grep /lakebase-data | grep PolarFS"
initialDelaySeconds: 5
periodSeconds: 3
failureThreshold: 50
successThreshold: 1
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts: # volumeMounts申明, 在业务pod中也需要声明
- name: lakebase-dir
mountPath: /lakebase-data
mountPropagation: Bidirectional
# 这是您的业务容器示例
containers:
- name: nginx
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
resources:
limits:
cpu: "1"
memory: 1Gi
requests:
cpu: "1"
memory: 1Gi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts: # 业务pod的volumeMounts声明方式
- name: lakebase-dir
mountPath: <MOUNT_POINT>
subPath: <SUB_DIR>
mountPropagation: HostToContainer
dnsPolicy: ClusterFirst
enableServiceLinks: true
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoSchedule
key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: lakebase-dir
emptyDir: {}