为 Kubernetes 部署 Redis Enterprise 软件
如何为 Kubernetes 安装 Redis Enterprise 软件。
要为 Kubernetes 部署 Redis Enterprise 软件并启动 Redis Enterprise 集群 (REC),您需要执行以下操作:
- 在您的 Kubernetes 集群中创建一个新的命名空间。
- 下载操作员捆绑包。
- 应用操作员包并验证其是否正在运行。
- 创建 Redis Enterprise 集群 (REC)。
本指南适用于大多数受支持的 Kubernetes 发行版。如果您使用的是 OpenShift,请参阅OpenShift 上的 Redis Enterprise。有关当前支持的详细信息,请参阅受支持的发行版。
先决条件
要为 Kubernetes 部署 Redis Enterprise,您需要:
- 受支持发行版中的 Kubernetes 集群
- 至少三个工作节点
- Kubernetes 客户端 (kubectl)
- 访问 DockerHub、RedHat Container Catalog 或可以保存所需图像的私有存储库。
创建新的命名空间
重要提示:每个命名空间只能包含一个 Redis Enterprise 集群。具有不同运算符版本的多个 REC 可以共存于同一个 Kubernetes 集群上,只要它们位于不同的命名空间中即可。
在本指南中,每个命令都应用于 Redis Enterprise 集群运行的命名空间。
- 创建新的命名空间
kubectl create namespace <rec-namespace>
- 更改命名空间上下文,使新创建的命名空间成为未来命令的默认命名空间。
kubectl config set-context --current --namespace=<rec-namespace>
您可以使用现有命名空间,只要它不包含任何现有 Redis Enterprise 集群资源即可。最佳做法是创建新命名空间,以确保没有可能干扰部署的 Redis Enterprise 资源。
安装操作符
Redis Enterprise for Kubernetes 软件包以容器镜像的形式发布。每个版本的发行说明中提供了所需镜像的列表。
运算符定义和参考资料可在 GitHub 上找到。运算符定义打包为单个通用 YAML 文件。
下载运营商捆绑包
拉取最新版本的操作员包:
VERSION=`curl --silent https://api.github.com/repos/RedisLabs/redis-enterprise-k8s-docs/releases/latest | grep tag_name | awk -F'"' '{print $4}'`
如果您需要不同的版本,请替换VERSION为特定的版本标签。
检查GitHub 上与操作员发布一起列出的版本标签或使用 GitHub API来确保捆绑包的版本正确。
部署操作员包
在您的 REC 命名空间中应用操作符包:
kubectl apply -f https://raw.githubusercontent.com/RedisLabs/redis-enterprise-k8s-docs/$VERSION/bundle.yaml
您应该看到类似这样的结果:
role.rbac.authorization.k8s.io/redis-enterprise-operator created
serviceaccount/redis-enterprise-operator created
rolebinding.rbac.authorization.k8s.io/redis-enterprise-operator created
customresourcedefinition.apiextensions.k8s.io/redisenterpriseclusters.app.redislabs.com configured
customresourcedefinition.apiextensions.k8s.io/redisenterprisedatabases.app.redislabs.com configured
deployment.apps/redis-enterprise-operator created
验证操作员是否正在运行
检查操作员部署以验证它是否在您的命名空间中运行:
kubectl get deployment redis-enterprise-operator
您应该看到类似这样的结果:
NAME READY UP-TO-DATE AVAILABLE AGE
redis-enterprise-operator 1/1 1 1 0m36s
创建 Redis Enterprise 集群 (REC)
Redis Enterprise 集群 (REC) 是从RedisEnterpriseCluster包含集群规范的自定义资源创建的。
以下示例创建一个最小的 Redis Enterprise 集群。有关各种可用选项的更多信息,请参阅RedisEnterpriseCluster API 参考。
-
创建一个定义具有三个节点的 Redis Enterprise 集群的文件。
笔记:集群创建后, REC 名称(my-rec在此示例中)无法更改。cat <<EOF > my-rec.yaml apiVersion: "app.redislabs.com/v1" kind: "RedisEnterpriseCluster" metadata: name: my-rec spec: nodes: 3 EOF这将使用默认请求(即每个节点 2 个 CPU 和 4GB 内存)来请求具有三个 Redis Enterprise 节点的集群。
要使用更大的配置进行测试,请使用以下示例将节点资源添加到
spec测试集群的部分(my-rec.yaml)。redisEnterpriseNodeResources: limits: cpu: 2000m memory: 16Gi requests: cpu: 2000m memory: 16Gi笔记:Each cluster must have at least 3 nodes. Single-node RECs are not supported.有关调整 Redis Enterprise 节点资源请求大小的更多信息,请参阅Redis Enterprise 硬件要求。
-
将您的自定义资源文件应用到与 相同的命名空间中
my-rec.yaml。
kubectl apply -f my-rec.yaml
您应该看到类似这样的结果:
redisenterprisecluster.app.redislabs.com/my-rec created
- 您可以使用以下命令验证集群的创建:
kubectl get rec
您应该看到类似这样的结果:
NAME AGE
my-rec 1m
此时,操作员将经历创建各种服务和 pod 部署的过程。
您可以通过检查与集群关联的 StatefulSet 来跟踪进度:
kubectl rollout status sts/my-rec
或者查看命名空间中所有资源的状态:
kubectl get all
启用准入控制器
准入控制器会动态验证操作员配置的 REDB 资源。强烈建议您在 Redis 企业集群 (REC) 上使用准入控制器。每个操作员部署只需配置一次准入控制器。
作为 REC 创建过程的一部分,操作员将准入控制器证书存储在名为 的 Kubernetes 机密中admission-tls。创建 REC 后,您可能需要等待几分钟才能看到机密已创建。
-
验证
admission-tls秘密是否存在。kubectl get secret admission-tls输出应该类似于
NAME TYPE DATA AGE admission-tls Opaque 2 2m43s -
将证书保存到本地环境变量。
CERT=`kubectl get secret admission-tls -o jsonpath='{.data.cert}'` -
创建一个 Kubernetes 验证 webhook,并将其替换
<namespace>为安装 REC 的命名空间。该
webhook.yaml模板可以在redis-enterprise-k8s-docs/admission中找到sed 's/OPERATOR_NAMESPACE/<namespace>/g' webhook.yaml | kubectl create -f - -
为 Kubernetes 验证 webhook 创建一个补丁文件。
cat > modified-webhook.yaml <<EOF webhooks: - name: redisenterprise.admission.redislabs clientConfig: caBundle: $CERT admissionReviewVersions: ["v1beta1"] EOF -
使用证书修补 webhook。
kubectl patch ValidatingWebhookConfiguration \ redis-enterprise-admission --patch "$(cat modified-webhook.yaml)"
将 webhook 限制到相关命名空间
操作员包包含一个 webhook 文件。除非您编辑 webhook 以定位特定命名空间,否则它将拦截来自所有命名空间的请求。您可以通过将部分添加namespaceSelector到 webhook 规范以定位命名空间上的标签来实现这一点。
-
确保命名空间具有唯一的
namespace-name标签。apiVersion: v1 kind: Namespace metadata: labels: namespace-name: example-ns name: example-ns -
修补 webhook 以添加该
namespaceSelector部分。cat > modified-webhook.yaml <<EOF webhooks: - name: redisenterprise.admission.redislabs namespaceSelector: matchLabels: namespace-name: staging EOF -
应用补丁。
kubectl patch ValidatingWebhookConfiguration \ redis-enterprise-admission --patch "$(cat modified-webhook.yaml)"
验证准入控制器是否正常工作
-
通过应用无效资源来验证准入控制器是否安装正确。这应该会强制准入控制器进行更正。
kubectl apply -f - << EOF apiVersion: app.redislabs.com/v1alpha1 kind: RedisEnterpriseDatabase metadata: name: redis-enterprise-database spec: evictionPolicy: illegal EOF
您应该会看到您的请求已被拒绝admission webhook "redisenterprise.admission.redislabs"。
Error from server: error when creating "STDIN": admission webhook "redisenterprise.admission.redislabs" denied the request: eviction_policy: u'illegal' is not one of [u'volatile-lru', u'volatile-ttl', u'volatile-random', u'allkeys-lru', u'allkeys-random', u'noeviction', u'volatile-lfu', u'allkeys-lfu']
创建 Redis 企业数据库 (REDB)
您可以在与 REC 相同的命名空间内或其他命名空间中创建多个数据库。
请参阅管理 Kubernetes 的 Redis Enterprise 数据库来创建新的 REDB。