盘点ECK支持创建的自定义资源形式

21,017 阅读1分钟

如题所示,本文旨在盘点ECK创建自定义证书和创建自定义用户的方式。关于这方面的知识,网上相关的资料比较少,恰好业务中又遇到了,便总结一下。

创建自定义用户

elasticsearch在集群创建的同时会创建一个名为“elastic”的超级用户(superuser),可通过如下方式获得密码:

PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}')

1. 通过API的方式创建自定义用户

# 获取elastic用户的密码
PASSWORD=$(kubectl get secret es-main-es-elastic-user -n kube-system -o go-template='{{.data.elastic | base64decode}}')

# 通过API的方式创建用户
curl -X POST -u "elastic:$PASSWORD" -k "https://172.17.31.8:9200/_security/user/test?pretty" -H 'Content-Type: application/json' -d'
{
  "password" : "test123",
  "roles" : [ "admin", "other_role1" ],
  "full_name" : "Jack Nicholson",
  "email" : "jacknich@example.com",
  "metadata" : {
    "intelligence" : 7
  }
}
'

# 创建成功后会返回
{
  "created" : true
}

2. 通过basic-auth的方式创建自定义用户

新建baisc-auth.yaml,存放自定义用户的用户名和密码等信息,同时可以指定用户的角色(即权限)。

apiVersion: v1
kind: Secret
metadata:
  labels:
    elasticsearch.k8s.elastic.co/cluster-name: es-main
  name: es-main-basic-auth
  namespace: kube-system
type: kubernetes.io/basic-auth
stringData:
  username: es-main-test    # required field for kubernetes.io/basic-auth
password: test123 # required field for kubernetes.io/basic-auth
roles: superuser  # optional, not part of kubernetes.io/basic-auth

注:basic-auth的方式是ECK2.3版本才支持。

在这里真的是踩了一个坑。产品使用的eck版本是1.6,然后支持basic-auth的eck版本是2.3,因为版本的问题我一直试验不成功,后来经过多方排查,才排查出来是版本不适配的问题。

只能说自己没有这方面的意识,一直以来都没有关注到版本的差异,今后的工作中要多多注意!!

3. 通过filerealm的方式来创建自定义用户

新建filerealm-secret.yaml,存放自定义用户的用户名和加密过后的密码等信息,同时指定用户的角色。

存储的密码为经过加密之后的密码。加密算法为bcrypt。

kind: Secret
apiVersion: v1
metadata:
  labels:
    elasticsearch.k8s.elastic.co/cluster-name: es-main
  name: es-main-filerealm-secret
  namespace: kube-system
stringData:
  users: |-
    es-main-test:$2a$10$uXcb7ItMYIxB8kW2CVRyp.jKNNh4jsZwr6wh.t73Ow30Z0euSX7Ji
  users_roles: |-
    superuser:es-main-test

用户名和加密之后的密码可以通过以下方式生成:

# create a folder with the 2 files
mkdir filerealm
touch filerealm/users filerealm/users_roles

# create user 'myuser' with role 'monitoring_user'
docker run \
    -v $(pwd)/filerealm:/usr/share/elasticsearch/config \
    docker.elastic.co/elasticsearch/elasticsearch:8.3.3 \
    bin/elasticsearch-users useradd es-main-test -p test123 -r superuser

# create a Kubernetes secret with the file realm content
kubectl create secret generic my-file-realm-secret --from-file filerealm

这里我看了许多遍文档,似乎密码真的只能通过这种方式获取,也没有其他的方式来生成加密之后的密码???

创建自定义角色

创建自定义角色与创建自定义用户类似

kind: Secret
apiVersion: v1
metadata:
  name: my-roles-secret
stringData:
  roles.yml: |-
    click_admins:
      run_as: [ 'clicks_watcher_1' ]
      cluster: [ 'monitor' ]
      indices:
      - names: [ 'events-*' ]
        privileges: [ 'read' ]
        field_security:
          grant: ['category', '@timestamp', 'message' ]
        query: '{"match": {"category": "click"}}'

创建自定义证书

  1. 通过OpenSSL来创建自定义证书

openssl req -x509 -sha256 -nodes -newkey rsa:4096 -days 365 -subj "/CN=es-main-es-http"  -keyout tls.key -out tls.crt
$ kubectl create secret generic es-main-es-cert --from-file=ca.crt=tls.crt --from-file=tls.crt=tls.crt --from-file=tls.key=tls.key
  1. 通过cert-manager来创建自定义证书

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: {{ .Values.esMain.name }}-selfsigned-issuer
spec:
  selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: {{ .Values.esMain.name }}-selfsigned-ca
spec:
  isCA: true
  commonName: {{ .Values.esMain.name }}-selfsigned-ca
  secretName: {{ .Values.esMain.name }}-ca-secret
  privateKey:
    algorithm: ECDSA
    size: 256
  issuerRef:
    kind: ClusterIssuer
    name: {{ .Values.esMain.name }}-selfsigned-issuer
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: {{ .Values.esMain.name }}-ca-issuer
spec:
  ca:
    secretName: {{ .Values.esMain.name }}-ca-secret
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: {{ .Values.esMain.name }}-es-cert
spec:
  isCA: false
  dnsNames:
    - {{ .Values.esMain.name }}-es-http
    - {{ .Values.esMain.name }}-es-http.default.svc
    - {{ .Values.esMain.name }}-es-http.default.svc.cluster.local
  subject:
    organizations:
      - {{ .Values.esMain.name }}
  privateKey:
    algorithm: RSA
    encoding: PKCS1
    size: 2048
  issuerRef:
    kind: Issuer
    name: {{ .Values.esMain.name }}-ca-issuer
  secretName: {{ .Values.esMain.name }}-es-cert

Reference

www.elastic.co/guide/en/cl…

www.elastic.co/guide/en/cl…