目标: 单节点 etcd 服务, k8s中启动etcd集群,创建 root 用户, 启用鉴权; 通过命令行客户端访问数据。

K8s 集群内部有内置的 etcd 集群,但这个集群由于是 k8s 内部使用的,出于安全的原因不对外开放,也不建议应用来访问这个集群。

通常使用 etcd 的话,自己创建集群。 开发环境可以使用单进程的服务。

如下第1,2 步是启动单进程的服务(单节点)并创建用户。 第4步是启动 etcd 集群。

# 1.启动服务

etcd

# 2.连接 etcd 服务,创建 root 用户,启用 auth

export ETCDCTL_API=3

ENDPOINTS=localhost:2379

etcdctl --endpoints=${ENDPOINTS} role add root

etcdctl --endpoints=${ENDPOINTS} role get root

etcdctl --endpoints=${ENDPOINTS} user add root

etcdctl --endpoints=${ENDPOINTS} user grant-role root root

etcdctl --endpoints=${ENDPOINTS} user get root

etcdctl --endpoints=${ENDPOINTS} auth enable

# now all client requests go through auth

# 3.Working with users

The user subcommand for etcdctl handles all things having to do with user accounts.

A listing of users can be found with:

$ etcdctl user list

Creating a user is as easy as

$ etcdctl user add myusername

Creating a new user will prompt for a new password. The password can be supplied from standard input when an option --interactive=false is given. --new-user-password can also be used for supplying the password.

Roles can be granted and revoked for a user with:

$ etcdctl user grant-role myusername foo

$ etcdctl user revoke-role myusername bar

The user’s settings can be inspected with:

$ etcdctl user get myusername

And the password for a user can be changed with

$ etcdctl user passwd myusername

$etcdctl --endpoints=${ENDPOINTS} --user=root --password=12345 put current-year 2022

$etcdctl --endpoints=${ENDPOINTS} --user=root --password=12345 get current-year

# 4. 如何创建多实例 etcd 集群

先创建 etcd 集群root账号的密码, create secret for etcd:

kubectl --namespace=my-cluster create secret generic etcd-server --from-literal=etcd-root-password=12345

创建的 Secret name: etcd-server, key: etcd-root-password

helm repo add bitnami https://charts.bitnami.com/bitnami

helm pull bitnami/etcd

mv etcd etch-server

helm install -n my-cluster -f ./etcd-server/values.yaml --set replicaCount=3 etcd-server  etcd-server

每一个实例启动的时候,都会指定  --initial-cluster 参数来配置静态的初始集群:

Clustering Guide | etcd

默认 values.yaml 里面的 auth.rbac.enabled 配置是true, 会设置 root 账号的密码。 前面创建的secret 和 key 是给到 etcd auth 用的。

通过 bitnami 的 etcd helm 启动etcd集群之后,会有提示在集群内可以访问的域名。

** Please be patient while the chart is being deployed **

etcd can be accessed via port 2379 on the following DNS name from within your cluster:

    etcd-server.my-cluster.svc.cluster.local

To create a pod that you can use as a etcd client run the following command:

    kubectl run etcd-server-client --restart='Never' --image docker.io/bitnami/etcd:3.5.1-debian-10-r56 --env ROOT_PASSWORD=$(kubectl get secret --namespace my-cluster etcd-server -o jsonpath="{.data.etcd-root-password}" | base64 --decode) --env ETCDCTL_ENDPOINTS="etcd-server.my-cluster.svc.cluster.local:2379" --namespace my-cluster --command -- sleep infinity

Then, you can set/get a key using the commands below:

    kubectl exec --namespace  my-cluster -it etcd-server-client -- bash

    etcdctl --user root:$ROOT_PASSWORD put /message Hello

    etcdctl --user root:$ROOT_PASSWORD get /message

To connect to your etcd server from outside the cluster execute the following commands:

    kubectl port-forward --namespace my-ecluster svc/etcd-server 2379:2379 &

    echo "etcd URL: http://127.0.0.1:2379"

可以查看 pod 的环境变量:

kubectl --namespace my-cluster describe pods etcd-server-0

ETCD_INITIAL_CLUSTER:              etcd-server-0=http://etcd-server-0.etcd-server-headless.my-cluster.svc.cluster.local:2380,etcd-server-1=http://etcd-server-1.etcd-server-headless.my-cluster.svc.cluster.local:2380,etcd-server-2=http://etcd-server-2.etcd-server-headless.my-cluster.svc.cluster.local:2380

# 5. request cluster ID mismatch 的问题解决

如果遇到 etcd: request cluster ID mismatch 的错误。 说明集群里面有初始的状态信息(脏数据)。

此时etcd节点都已经启动,但是无法连接,有request cluster ID mismatch报错。

找到每个节点的etcd数据存储目录,

# cat /etc/etcd/etcd.conf

删除各节点/var/lib/etcd/default.etcd,重启etcd即可解决。

由于删除的是数据存储目录,不是新建etcd集群,或者有重要数据的不可直接删除。

也可以uninstall etcd deployment, 然后清理 PVC, PV。 再重新指定 replicaCount 数量部署集群.

# 6.如何干净地清理 kubernetes 集群上的 etcd ?

如果要彻底 delete/uninstall etcd 集群,uninstall 之后还要清理pvc, pv。 否则账户角色信息还会有留存。

kubectl --namespace my-cluster get pvc

kubectl --namespace my-cluster get pv

kubectl --namespace my-cluster delete pvc xxxx zzzz

kubectl --namespace my-cluster delete pv xxxx zzzz

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐