1. 部署RBAC 下载create_role.sh 、cluster-role-binding-template.yaml 、cluster-role-template.yaml 
例如:
1 2 3 4 5 6 7 |-- cluster-role-binding-template.yaml |-- cluster-role-template.yaml |-- create_role.sh kubectl create ns operator bash create_role.sh --namespace=operator   
 
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 bash create_role.sh --namespace=operator + ROLE_NAME=etcd-operator + ROLE_BINDING_NAME=etcd-operator + NAMESPACE=default + for  i in  '"$@"'  + case  $i  in  + NAMESPACE=operator + echo  'Creating role with ROLE_NAME=etcd-operator, NAMESPACE=operator'  Creating role with ROLE_NAME=etcd-operator, NAMESPACE=operator + sed -e 's/<ROLE_NAME>/etcd-operator/g'  -e 's/<NAMESPACE>/operator/g'  cluster-role-template.yaml + kubectl create -f - clusterrole.rbac.authorization.k8s.io/etcd-operator created + echo  'Creating role binding with ROLE_NAME=etcd-operator, ROLE_BINDING_NAME=etcd-operator, NAMESPACE=operator'  Creating role binding with ROLE_NAME=etcd-operator, ROLE_BINDING_NAME=etcd-operator, NAMESPACE=operator + sed -e 's/<ROLE_NAME>/etcd-operator/g'  -e 's/<ROLE_BINDING_NAME>/etcd-operator/g'  -e 's/<NAMESPACE>/operator/g'  cluster-role-binding-template.yaml + kubectl create -f - clusterrolebinding.rbac.authorization.k8s.io/etcd-operator created 
 
 
1.1. create_role.sh 脚本 create_role.sh有三个入参,可以指定–namespace参数,该参数与etcd-operator部署的namespace应一致。默认为default。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 #!/usr/bin/env bash set  -o errexitset  -o nounsetset  -o pipefailETCD_OPERATOR_ROOT=$(dirname  "${BASH_SOURCE} " )/../.. print_usage  () {  echo  "$(basename "$0 " )  - Create Kubernetes RBAC role and role bindings for etcd-operator  Usage: $(basename "$0 " )  [options...] Options:   --role-name=STRING         Name of ClusterRole to create                                (default=\"etcd-operator\", environment variable: ROLE_NAME)   --role-binding-name=STRING Name of ClusterRoleBinding to create                                (default=\"etcd-operator\", environment variable: ROLE_BINDING_NAME)   --namespace=STRING         namespace to create role and role binding in. Must already exist.                                (default=\"default\", environment variable: NAMESPACE) "  >&2} ROLE_NAME="${ROLE_NAME:-etcd-operator} "  ROLE_BINDING_NAME="${ROLE_BINDING_NAME:-etcd-operator} "  NAMESPACE="${NAMESPACE:-default} "  for  i in  "$@ " do case  $i  in     --role-name=*)     ROLE_NAME="${i#*=} "      ;;     --role-binding-name=*)     ROLE_BINDING_NAME="${i#*=} "      ;;     --namespace=*)     NAMESPACE="${i#*=} "      ;;     -h|--help )       print_usage       exit  0     ;;     *)       print_usage       exit  1     ;; esac done echo  "Creating role with ROLE_NAME=${ROLE_NAME} , NAMESPACE=${NAMESPACE} " sed -e "s/<ROLE_NAME>/${ROLE_NAME} /g"  \   -e "s/<NAMESPACE>/${NAMESPACE} /g"  \   "cluster-role-template.yaml"  | \   kubectl create -f - echo  "Creating role binding with ROLE_NAME=${ROLE_NAME} , ROLE_BINDING_NAME=${ROLE_BINDING_NAME} , NAMESPACE=${NAMESPACE} " sed -e "s/<ROLE_NAME>/${ROLE_NAME} /g"  \   -e "s/<ROLE_BINDING_NAME>/${ROLE_BINDING_NAME} /g"  \   -e "s/<NAMESPACE>/${NAMESPACE} /g"  \   "cluster-role-binding-template.yaml"  | \   kubectl create -f - 
 
 
1.2. cluster-role-binding-template.yaml 1 2 3 4 5 6 7 8 9 10 11 12 apiVersion:  rbac.authorization.k8s.io/v1beta1 kind:  ClusterRoleBinding metadata:   name:  <ROLE_BINDING_NAME>  roleRef:   apiGroup:  rbac.authorization.k8s.io    kind:  ClusterRole    name:  <ROLE_NAME>  subjects: -  kind:  ServiceAccount   name:  default    namespace:  <NAMESPACE>  
 
 
1.3. cluster-role-template.yaml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 apiVersion:  rbac.authorization.k8s.io/v1beta1 kind:  ClusterRole metadata:   name:  <ROLE_NAME>  rules: -  apiGroups:   -  etcd.database.coreos.com    resources:    -  etcdclusters    -  etcdbackups    -  etcdrestores    verbs:    -  "*"  -  apiGroups:   -  apiextensions.k8s.io    resources:    -  customresourcedefinitions    verbs:    -  "*"  -  apiGroups:   -  ""    resources:    -  pods    -  services    -  endpoints    -  persistentvolumeclaims    -  events    verbs:    -  "*"  -  apiGroups:   -  apps    resources:    -  deployments    verbs:    -  "*"  -  apiGroups:   -  ""    resources:    -  secrets    verbs:    -  get  
 
 
2. 部署etcd-operator 1 kubectl create -f etcd-operator.yaml 
 
etcd-operator.yaml如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 apiVersion:  apps/v1 kind:  Deployment metadata:   name:  etcd-operator    namespace:  operator       labels:      app:  etcd-operator  spec:   replicas:  1    selector:      matchLabels:        app:  etcd-operator    template:      metadata:        labels:          app:  etcd-operator      spec:        containers:        -  name:  etcd-operator          image:  registry.cn-shenzhen.aliyuncs.com/huweihuang/etcd-operator:v0.9.4          command:          -  etcd-operator                   -  -cluster-wide          env:          -  name:  MY_POD_NAMESPACE            valueFrom:              fieldRef:                fieldPath:  metadata.namespace          -  name:  MY_POD_NAME            valueFrom:              fieldRef:                fieldPath:  metadata.name  
 
查看CRD
1 2 3 NAME                                       CREATED AT etcdclusters.etcd.database.coreos.com      2020-08-01T13:02:18Z 
 
查看etcd-operator的日志是否OK。
1 2 3 4 5 6 k logs -f etcd-operator-545df8d445-qpf6n -n operator time="2020-08-01T13:02:18Z"  level=info msg="etcd-operator Version: 0.9.4"  time="2020-08-01T13:02:18Z"  level=info msg="Git SHA: c8a1c64"  time="2020-08-01T13:02:18Z"  level=info msg="Go Version: go1.11.5"  time="2020-08-01T13:02:18Z"  level=info msg="Go OS/Arch: linux/amd64"  time="2020-08-01T13:02:18Z"  level=info msg="Event(v1.ObjectReference{Kind:\"Endpoints\", Namespace:\"operator\", Name:\"etcd-operator\", UID:\"7de38cff-1b7b-4bf2-9837-473fa66c9366\", APIVersion:\"v1\", ResourceVersion:\"41195930\", FieldPath:\"\"}): type: 'Normal' reason: 'LeaderElection' etcd-operator-545df8d445-qpf6n became leader"  
 
以上内容表示etcd-operator运行正常。
3. 部署etcd集群 1 kubectl create -f etcd-cluster.yaml 
 
当开启clusterwide则etcd集群与etcd-operator的ns可不同。
 
etcd-cluster.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 apiVersion:  "etcd.database.coreos.com/v1beta2" kind:  "EtcdCluster" metadata:   name:  "default-etcd-cluster"          annotations:      etcd.database.coreos.com/scope:  clusterwide    namespace:  etcd     spec:   size:  3    version:  "v3.3.18"    repository:  registry.cn-shenzhen.aliyuncs.com/huweihuang/etcd    pod:      busyboxImage:  registry.cn-shenzhen.aliyuncs.com/huweihuang/busybox:1.28.0-glibc  
 
查看集群部署结果
1 2 3 4 5 $ kgpo -n etcd NAME                              READY   STATUS    RESTARTS   AGE default-etcd-cluster-b6phnpf8z8   1/1     Running   0          3m3s default-etcd-cluster-hhgq4sbtgr   1/1     Running   0          109s default-etcd-cluster-ttfh5fj92b   1/1     Running   0          2m29s 
 
 
4. 访问etcd集群 查看service
1 2 3 4 $ kgsvc -n etcd NAME                          TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)             AGE default-etcd-cluster          ClusterIP   None              <none>        2379/TCP,2380/TCP   5m37s default-etcd-cluster-client   ClusterIP   192.168.255.244   <none>        2379/TCP            5m37s 
 
使用service地址访问
1 2 3 4 5 6 7 8 9 10 11 12 $ ETCDCTL_API=3 etcdctl --endpoints 192.168.255.244:2379 endpoint health 192.168.255.244:2379 is healthy: successfully committed proposal: took = 1.96126ms $ ETCDCTL_API=3 etcdctl --endpoints 192.168.255.244:2379 put foo bar OK $ ETCDCTL_API=3 etcdctl --endpoints 192.168.255.244:2379 get foo foo bar 
 
 
5. 销毁etcd-operator 1 2 3 4 5 kubectl delete -f example/deployment.yaml kubectl delete endpoints etcd-operator kubectl delete crd etcdclusters.etcd.database.coreos.com kubectl delete clusterrole etcd-operator kubectl delete clusterrolebinding etcd-operator 
 
 
参考: