为Kubernetes部署Redis企业版软件
如何为Kubernetes安装Redis企业版软件。
要部署用于Kubernetes的Redis Enterprise软件并启动您的Redis Enterprise集群(REC),您需要执行以下操作:
- 在您的Kubernetes集群中创建一个新的命名空间。
- 下载操作符包。
- 应用操作符包并验证其是否正在运行。
- 创建一个Redis企业集群(REC)。
本指南适用于大多数受支持的Kubernetes发行版。如果您使用的是OpenShift,请参阅Redis Enterprise on OpenShift。有关当前支持的内容的详细信息,请参阅supported distributions。
先决条件
要部署适用于Kubernetes的Redis Enterprise,您需要:
- Kubernetes集群在支持的发行版中
- 至少三个工作节点
- Kubernetes 客户端 (kubectl)
- 访问DockerHub、RedHat容器目录或可以存储所需镜像的私有仓库。
创建一个新的命名空间
重要提示: 每个命名空间只能包含一个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企业集群(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
这将请求一个包含三个Redis Enterprise节点的集群,使用默认的请求(即每个节点2个CPU和4GB内存)。
要使用更大的配置进行测试,请使用下面的示例将节点资源添加到测试集群的
spec
部分(my-rec.yaml
)。redisEnterpriseNodeResources: limits: cpu: 2000m memory: 16Gi requests: cpu: 2000m memory: 16Gi
注意:每个集群必须至少有3个节点。不支持单节点的RECs。有关调整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创建过程的一部分,操作员将准入控制器证书存储在名为admission-tls
的Kubernetes秘密中。创建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 EOF
-
使用证书修补webhook。
kubectl patch ValidatingWebhookConfiguration \ redis-enterprise-admission --patch "$(cat modified-webhook.yaml)"
将webhook限制在相关的命名空间
操作符包包含一个webhook文件。除非您编辑它以针对特定的命名空间,否则webhook将拦截来自所有命名空间的请求。您可以通过在webhook规范中添加namespaceSelector
部分来针对命名空间上的标签来实现这一点。
-
确保命名空间具有唯一的
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。