k8s.io/kubernetes@v1.29.3/test/e2e/testing-manifests/statefulset/etcd/statefulset.yaml (about) 1 apiVersion: apps/v1 2 kind: StatefulSet 3 metadata: 4 name: etcd 5 labels: 6 app: etcd 7 spec: 8 serviceName: etcd 9 replicas: 3 10 selector: 11 matchLabels: 12 app: etcd 13 template: 14 metadata: 15 name: etcd 16 labels: 17 app: etcd 18 spec: 19 containers: 20 - name: etcd 21 image: registry.k8s.io/etcd:3.2.24 22 imagePullPolicy: Always 23 ports: 24 - containerPort: 2380 25 name: peer 26 - containerPort: 2379 27 name: client 28 resources: 29 requests: 30 cpu: 100m 31 memory: 512Mi 32 env: 33 - name: INITIAL_CLUSTER_SIZE 34 value: "3" 35 - name: SET_NAME 36 value: etcd 37 volumeMounts: 38 - name: datadir 39 mountPath: /var/run/etcd 40 lifecycle: 41 preStop: 42 exec: 43 command: 44 - "/bin/sh" 45 - "-ec" 46 - | 47 EPS="" 48 for i in $(seq 0 $((${INITIAL_CLUSTER_SIZE} - 1))); do 49 EPS="${EPS}${EPS:+,}http://${SET_NAME}-${i}.${SET_NAME}:2379" 50 done 51 52 HOSTNAME=$(hostname) 53 54 member_hash() { 55 etcdctl member list | grep http://${HOSTNAME}.${SET_NAME}:2380 | cut -d':' -f1 | cut -d'[' -f1 56 } 57 58 echo "Removing ${HOSTNAME} from etcd cluster" 59 60 ETCDCTL_ENDPOINT=${EPS} etcdctl member remove $(member_hash) 61 if [ $? -eq 0 ]; then 62 # Remove everything otherwise the cluster will no longer scale-up 63 rm -rf /var/run/etcd/* 64 fi 65 command: 66 - "/bin/sh" 67 - "-ec" 68 - | 69 HOSTNAME=$(hostname) 70 71 # store member id into PVC for later member replacement 72 collect_member() { 73 while ! etcdctl member list &>/dev/null; do sleep 1; done 74 etcdctl member list | grep http://${HOSTNAME}.${SET_NAME}:2380 | cut -d':' -f1 | cut -d'[' -f1 > /var/run/etcd/member_id 75 exit 0 76 } 77 78 eps() { 79 EPS="" 80 for i in $(seq 0 $((${INITIAL_CLUSTER_SIZE} - 1))); do 81 EPS="${EPS}${EPS:+,}http://${SET_NAME}-${i}.${SET_NAME}:2379" 82 done 83 echo ${EPS} 84 } 85 86 member_hash() { 87 etcdctl member list | grep http://${HOSTNAME}.${SET_NAME}:2380 | cut -d':' -f1 | cut -d'[' -f1 88 } 89 90 # re-joining after failure? 91 if [ -e /var/run/etcd/default.etcd ]; then 92 echo "Re-joining etcd member" 93 member_id=$(cat /var/run/etcd/member_id) 94 95 # re-join member 96 ETCDCTL_ENDPOINT=$(eps) etcdctl member update ${member_id} http://${HOSTNAME}.${SET_NAME}:2380 97 exec etcd --name ${HOSTNAME} \ 98 --listen-peer-urls http://${HOSTNAME}.${SET_NAME}:2380 \ 99 --listen-client-urls http://${HOSTNAME}.${SET_NAME}:2379,http://127.0.0.1:2379 \ 100 --advertise-client-urls http://${HOSTNAME}.${SET_NAME}:2379 \ 101 --data-dir /var/run/etcd/default.etcd 102 fi 103 104 # etcd-SET_ID 105 SET_ID=${HOSTNAME:5:${#HOSTNAME}} 106 107 # adding a new member to existing cluster (assuming all initial pods are available) 108 if [ "${SET_ID}" -ge ${INITIAL_CLUSTER_SIZE} ]; then 109 export ETCDCTL_ENDPOINT=$(eps) 110 111 # member already added? 112 MEMBER_HASH=$(member_hash) 113 if [ -n "${MEMBER_HASH}" ]; then 114 # the member hash exists but for some reason etcd failed 115 # as the datadir has not be created, we can remove the member 116 # and retrieve new hash 117 etcdctl member remove ${MEMBER_HASH} 118 fi 119 120 echo "Adding new member" 121 etcdctl member add ${HOSTNAME} http://${HOSTNAME}.${SET_NAME}:2380 | grep "^ETCD_" > /var/run/etcd/new_member_envs 122 123 if [ $? -ne 0 ]; then 124 echo "Exiting" 125 rm -f /var/run/etcd/new_member_envs 126 exit 1 127 fi 128 129 cat /var/run/etcd/new_member_envs 130 source /var/run/etcd/new_member_envs 131 132 collect_member & 133 134 exec etcd --name ${HOSTNAME} \ 135 --listen-peer-urls http://${HOSTNAME}.${SET_NAME}:2380 \ 136 --listen-client-urls http://${HOSTNAME}.${SET_NAME}:2379,http://127.0.0.1:2379 \ 137 --advertise-client-urls http://${HOSTNAME}.${SET_NAME}:2379 \ 138 --data-dir /var/run/etcd/default.etcd \ 139 --initial-advertise-peer-urls http://${HOSTNAME}.${SET_NAME}:2380 \ 140 --initial-cluster ${ETCD_INITIAL_CLUSTER} \ 141 --initial-cluster-state ${ETCD_INITIAL_CLUSTER_STATE} 142 fi 143 144 for i in $(seq 0 $((${INITIAL_CLUSTER_SIZE} - 1))); do 145 while true; do 146 echo "Waiting for ${SET_NAME}-${i}.${SET_NAME} to come up" 147 ping -W 1 -c 1 ${SET_NAME}-${i}.${SET_NAME} > /dev/null && break 148 sleep 1s 149 done 150 done 151 152 PEERS="" 153 for i in $(seq 0 $((${INITIAL_CLUSTER_SIZE} - 1))); do 154 PEERS="${PEERS}${PEERS:+,}${SET_NAME}-${i}=http://${SET_NAME}-${i}.${SET_NAME}:2380" 155 done 156 157 collect_member & 158 159 # join member 160 exec etcd --name ${HOSTNAME} \ 161 --initial-advertise-peer-urls http://${HOSTNAME}.${SET_NAME}:2380 \ 162 --listen-peer-urls http://${HOSTNAME}.${SET_NAME}:2380 \ 163 --listen-client-urls http://${HOSTNAME}.${SET_NAME}:2379,http://127.0.0.1:2379 \ 164 --advertise-client-urls http://${HOSTNAME}.${SET_NAME}:2379 \ 165 --initial-cluster-token etcd-cluster-1 \ 166 --initial-cluster ${PEERS} \ 167 --initial-cluster-state new \ 168 --data-dir /var/run/etcd/default.etcd 169 volumeClaimTemplates: 170 - metadata: 171 name: datadir 172 spec: 173 accessModes: 174 - "ReadWriteOnce" 175 resources: 176 requests: 177 # upstream recommended max is 700M 178 storage: 1Gi