在Kubernetes上尝试GemFire认证功能

之前在这篇文章中确认了GemFire的认证方式。
现在要在GemFire for Kubernetes中确认一下。

GemFire for Kubernetes的jar文件导入方法很特殊,可以在GemFireCluster的Manifest中的Locator和Server部分指定包含jar文件的容器映像和jar文件的路径,如下所示:
kind: GemFireCluster
Locators:
– name: locator-1
image: <容器映像名称>
jarPath: <jar文件路径>
Servers:
– name: server-1
image: <容器映像名称>
jarPath: <jar文件路径>

  locators:
    libraries:
      - name: my-custom-security-manager
        container:
          image: my.company.com/myImage:1.0.0
          path: "/build/libs/*.jar"
          imagePullSecretRef:
            name: pull-secret-name

因此,首先需要将jar文件容器化。
尽管这次想要直接重用上一次创建的jar文件,但在Kubernetes版中,gemfire.properties的security-peer-auth-init的使用是必需的,并且需要指定AuthInitialize类,因此需要按照以下步骤添加AuthInitialize类并重新构建。

cat << EOF > ./src/main/java/com/vmware/gemfire/UserPasswordAuthInit.java
package com.vmware.gemfire;

import org.apache.geode.distributed.DistributedMember;
import org.apache.geode.security.AuthInitialize;
import org.apache.geode.security.AuthenticationFailedException;

import java.util.Properties;

public class UserPasswordAuthInit implements AuthInitialize {

  @Override
  public Properties getCredentials(Properties properties, DistributedMember distributedMember, boolean isPeer) throws AuthenticationFailedException {
    properties.setProperty("security-username", "gemfire");
    properties.setProperty("security-password", "changeme");
    return properties;
  }
}
EOF
mvn clean package

在重建之后,我们需要创建一个用于将jar打包到容器中的Dockerfile。

cat << EOF > ./Dockerfile
FROM alpine:latest
COPY BasicSecurityManager-1.0-SNAPSHOT.jar .
CMD ["sleep", "365d"]
EOF

用这个方式,将 BasicSecurityManager-1.0-SNAPSHOT.jar 文件直接放置在容器的根目录下。
构建并推送。

DOCKER_REPO=myrepo
docker build -t ${DOCKER_REPO}/basic-security-manager-jar --platform linux/x86_64 . 
docker push ${DOCKER_REPO}/basic-security-manager-jar

根据此文档,GemFire Operator需要事先创建用于身份验证的凭据,并将其指定到kind: GemFireCluster的spec.security.mgmtSvcCredentialsSecretName中,因此需要提前创建。

USERNAME=operator
PASSWORD=secret
kubectl create secret generic basic-auth-security-manager --from-literal=username=$USERNAME --from-literal=password=$PASSWORD

此外,在指定security-manager时,有以下限制。

    • LocatorとServerで同じSecurityManagerを指定が必須

security-peer-auth-initの指定必須

根据上述内容,创建并应用以下的Manifest。

cat << EOF > ./gemfire-cluster-auth.yaml
apiVersion: gemfire.vmware.com/v1
kind: GemFireCluster
metadata:
  name: gemfire1
spec:
  image: registry.tanzu.vmware.com/pivotal-gemfire/vmware-gemfire:10.0.0
  security:
    mgmtSvcCredentialsSecretName: basic-auth-security-manager
    tls: {}
  locators:
    libraries:
      - name: basic-security-manager-jar
        container:
          image: ${DOCKER_REPO}/basic-security-manager-jar:latest
          path: "/*.jar"
          imagePullSecretRef:
            name: dockerhub
    overrides:
      gemFireProperties:
        - name: "security-manager"
          value: "com.vmware.gemfire.BasicSecurityManager"        
        - name: "security-peer-auth-init"
          value: "com.vmware.gemfire.UserPasswordAuthInit"
  servers:
    overrides:
      gemFireProperties:
        - name: "security-manager"
          value: "com.vmware.gemfire.BasicSecurityManager"
        - name: "security-peer-auth-init"
          value: "com.vmware.gemfire.UserPasswordAuthInit"
EOF
kubectl apply -f ./gemfire-cluster-auth.yaml

当Pod启动时,可以在日志中找到关于指定的jar文件的描述。

$ kubectl logs gemfire1-locator-0
[info 2023/10/30 10:36:30.011 GMT  <main> tid=0x1] Creating automatic module for resource roots: [/gemfire/extensions/BasicSecurityManager-1.0-SNAPSHOT.jar, /gemfire/tools/Modules/gemfire-prometheus-metrics/simpleclient-0.9.0.jar, /gemfire/tools/Modules/gemfire-prometheus-metrics/simpleclient_common-0.9.0.jar, /gemfire/tools/Modules/gemfire-prometheus-metrics/gemfire-prometheus-metrics-10.0.0-build.1630.jar, /gemfire/tools/Modules/gemfire-prometheus-metrics/micrometer-registry-prometheus-1.6.3.jar, /gemfire/tools/Modules/gemfire-prometheus-metrics/gson-2.8.9.jar]
--- BasicSecurityManager-1.0-SNAPSHOT.jar

使用GemFire镜像启动一个能够通过gfsh访问的Pod,实际进行访问。

kubectl run --image registry.tanzu.vmware.com/pivotal-gemfire/vmware-gemfire:10.0.0 debug

进入Pod,并启动gfsh。

kubectl exec -it debug -- bash
gfsh

试着连接一下。在上一次创建的jar文件中,可以使用用户名为operator、密码为secret进行登录。

gfsh>connect --locator gemfire1-locator-0[10334]
Connecting to Locator at [host=gemfire1-locator-0, port=10334] ..
Connecting to Manager at [host=gemfire1-locator-0.gemfire1-locator.default.svc.cluster.local, port=1099] ..
user: operator
password: ******
Successfully connected to: [host=gemfire1-locator-0.gemfire1-locator.default.svc.cluster.local, port=1099]

似乎無事認證已經啟動。

bannerAds