به طور پیشفرض، kubeadm یک نمونه etcd محلی را روی هر گره(node) control plane اجرا میکند.
همچنین میتوان با کلاستر(cluster) etcd به عنوان خارجی رفتار کرد و نمونههای etcd را روی میزبانهای جداگانه آمادهسازی کرد. تفاوتهای بین این دو رویکرد در صفحه گزینههایی برای توپولوژی با دسترسی بالا پوشش داده شده است.
این وظیفه، فرآیند ایجاد یک کلاستر خارجی etcd با دسترسی بالا از سه عضو را بررسی میکند که میتوانند توسط kubeadm در طول ایجاد کلاستر مورد استفاده قرار گیرند.
registry.k8s.io) دسترسی داشته باشد یا فایل image از etcd مورد نیاز را با استفاده از kubeadm config images list/pull فهرست/دریافت کند. این راهنما نمونههای etcd را به عنوان پادهای استاتیک که توسط یک kubelet مدیریت میشود، تنظیم میکند.ssh و scp میتوانند این نیاز را برآورده کنند.رویکرد کلی این است که تمام گواهینامهها روی یک گره(node) تولید شوند و فقط فایلهای لازم بین گرههای دیگر توزیع شوند.
kubelet را طوری پیکربندی کنید که به عنوان مدیر سرویس برای etcd عمل کند.
cat << EOF > /etc/systemd/system/kubelet.service.d/kubelet.conf
# Replace "systemd" with the cgroup driver of your container runtime. The default value in the kubelet is "cgroupfs".
# Replace the value of "containerRuntimeEndpoint" for a different container runtime if needed.
#
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authentication:
anonymous:
enabled: false
webhook:
enabled: false
authorization:
mode: AlwaysAllow
cgroupDriver: systemd
address: 127.0.0.1
containerRuntimeEndpoint: unix:///var/run/containerd/containerd.sock
staticPodPath: /etc/kubernetes/manifests
EOF
cat << EOF > /etc/systemd/system/kubelet.service.d/20-etcd-service-manager.conf
[Service]
ExecStart=
ExecStart=/usr/bin/kubelet --config=/etc/systemd/system/kubelet.service.d/kubelet.conf
Restart=always
EOF
systemctl daemon-reload
systemctl restart kubelet
وضعیت kubelet را بررسی کنید تا مطمئن شوید که در حال اجرا است.
systemctl status kubelet
ایجاد فایلهای پیکربندی برای kubeadm.
با استفاده از اسکریپت زیر، یک فایل پیکربندی kubeadm برای هر میزبانی که قرار است یک عضو etcd روی آن اجرا شود، ایجاد کنید.
# Update HOST0, HOST1 and HOST2 with the IPs of your hosts
export HOST0=10.0.0.6
export HOST1=10.0.0.7
export HOST2=10.0.0.8
# Update NAME0, NAME1 and NAME2 with the hostnames of your hosts
export NAME0="infra0"
export NAME1="infra1"
export NAME2="infra2"
# Create temp directories to store files that will end up on other hosts
mkdir -p /tmp/${HOST0}/ /tmp/${HOST1}/ /tmp/${HOST2}/
HOSTS=(${HOST0} ${HOST1} ${HOST2})
NAMES=(${NAME0} ${NAME1} ${NAME2})
for i in "${!HOSTS[@]}"; do
HOST=${HOSTS[$i]}
NAME=${NAMES[$i]}
cat << EOF > /tmp/${HOST}/kubeadmcfg.yaml
---
apiVersion: "kubeadm.k8s.io/v1beta4"
kind: InitConfiguration
nodeRegistration:
name: ${NAME}
localAPIEndpoint:
advertiseAddress: ${HOST}
---
apiVersion: "kubeadm.k8s.io/v1beta4"
kind: ClusterConfiguration
etcd:
local:
serverCertSANs:
- "${HOST}"
peerCertSANs:
- "${HOST}"
extraArgs:
- name: initial-cluster
value: ${NAMES[0]}=https://${HOSTS[0]}:2380,${NAMES[1]}=https://${HOSTS[1]}:2380,${NAMES[2]}=https://${HOSTS[2]}:2380
- name: initial-cluster-state
value: new
- name: name
value: ${NAME}
- name: listen-peer-urls
value: https://${HOST}:2380
- name: listen-client-urls
value: https://${HOST}:2379
- name: advertise-client-urls
value: https://${HOST}:2379
- name: initial-advertise-peer-urls
value: https://${HOST}:2380
EOF
done
مرجع صدور گواهی را ایجاد کنید.
اگر از قبل یک CA دارید، تنها کاری که باید انجام دهید کپی کردن فایلهای crt و key مربوط به CA در /etc/kubernetes/pki/etcd/ca.crt و /etc/kubernetes/pki/etcd/ca.key است. پس از کپی کردن این فایلها، به مرحله بعدی، "ایجاد گواهینامه برای هر عضو" بروید.
اگر از قبل CA ندارید، این دستور را روی $HOST0 (جایی که فایلهای پیکربندی kubeadm را ایجاد کردهاید) اجرا کنید.
kubeadm init phase certs etcd-ca
این دو فایل را ایجاد میکند:
/etc/kubernetes/pki/etcd/ca.crt/etc/kubernetes/pki/etcd/ca.keyایجاد گواهی برای هر عضو
kubeadm init phase certs etcd-server --config=/tmp/${HOST2}/kubeadmcfg.yaml
kubeadm init phase certs etcd-peer --config=/tmp/${HOST2}/kubeadmcfg.yaml
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST2}/kubeadmcfg.yaml
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST2}/kubeadmcfg.yaml
cp -R /etc/kubernetes/pki /tmp/${HOST2}/
# cleanup non-reusable certificates
find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete
kubeadm init phase certs etcd-server --config=/tmp/${HOST1}/kubeadmcfg.yaml
kubeadm init phase certs etcd-peer --config=/tmp/${HOST1}/kubeadmcfg.yaml
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST1}/kubeadmcfg.yaml
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST1}/kubeadmcfg.yaml
cp -R /etc/kubernetes/pki /tmp/${HOST1}/
find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete
kubeadm init phase certs etcd-server --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs etcd-peer --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST0}/kubeadmcfg.yaml
# No need to move the certs because they are for HOST0
# clean up certs that should not be copied off this host
find /tmp/${HOST2} -name ca.key -type f -delete
find /tmp/${HOST1} -name ca.key -type f -delete
کپی گواهینامهها و پیکربندیهای kubeadm.
گواهینامهها ایجاد شدهاند و اکنون باید به میزبانهای مربوطه منتقل شوند.
USER=ubuntu
HOST=${HOST1}
scp -r /tmp/${HOST}/* ${USER}@${HOST}:
ssh ${USER}@${HOST}
USER@HOST $ sudo -Es
root@HOST $ chown -R root:root pki
root@HOST $ mv pki /etc/kubernetes/
اطمینان حاصل کنید که همه فایلهای مورد انتظار وجود دارند.
لیست کامل فایلهای مورد نیاز در $HOST0 به شرح زیر است:
/tmp/${HOST0}
└── kubeadmcfg.yaml
---
/etc/kubernetes/pki
├── apiserver-etcd-client.crt
├── apiserver-etcd-client.key
└── etcd
├── ca.crt
├── ca.key
├── healthcheck-client.crt
├── healthcheck-client.key
├── peer.crt
├── peer.key
├── server.crt
└── server.key
روی $HOST1:
$HOME
└── kubeadmcfg.yaml
---
/etc/kubernetes/pki
├── apiserver-etcd-client.crt
├── apiserver-etcd-client.key
└── etcd
├── ca.crt
├── healthcheck-client.crt
├── healthcheck-client.key
├── peer.crt
├── peer.key
├── server.crt
└── server.key
روی $HOST2:
$HOME
└── kubeadmcfg.yaml
---
/etc/kubernetes/pki
├── apiserver-etcd-client.crt
├── apiserver-etcd-client.key
└── etcd
├── ca.crt
├── healthcheck-client.crt
├── healthcheck-client.key
├── peer.crt
├── peer.key
├── server.crt
└── server.key
پاد استاتیک را ایجاد کنید.
حالا که گواهینامهها و پیکربندیها آماده شدهاند، وقت آن رسیده که تنظیمات را ایجاد کنیم. روی هر میزبان، دستور kubeadm را اجرا کنید تا یک تنظیمات ثابت برای etcd ایجاد شود.
root@HOST0 $ kubeadm init phase etcd local --config=/tmp/${HOST0}/kubeadmcfg.yaml
root@HOST1 $ kubeadm init phase etcd local --config=$HOME/kubeadmcfg.yaml
root@HOST2 $ kubeadm init phase etcd local --config=$HOME/kubeadmcfg.yaml
اختیاری: سلامت کلاستر را بررسی کنید.
اگر etcdctl در دسترس نباشد، میتوانید این ابزار را درون یک container image اجرا کنید. شما میتوانید این کار را مستقیماً با مجری کانتینر خود با استفاده از ابزاری مانند crictl run انجام دهید و نه از طریق کوبرنتیز.
ETCDCTL_API=3 etcdctl \
--cert /etc/kubernetes/pki/etcd/peer.crt \
--key /etc/kubernetes/pki/etcd/peer.key \
--cacert /etc/kubernetes/pki/etcd/ca.crt \
--endpoints https://${HOST0}:2379 endpoint health
...
https://[HOST0 IP]:2379 is healthy: successfully committed proposal: took = 16.283339ms
https://[HOST1 IP]:2379 is healthy: successfully committed proposal: took = 19.44402ms
https://[HOST2 IP]:2379 is healthy: successfully committed proposal: took = 35.926451ms
${HOST0} را برابر با نشانی(آدرس) IP میزبانی که در حال آزمایش آن هستید، قرار دهید.زمانی که یک کلاستر etcd با ۳ عضو فعال داشتید، میتوانید با استفاده از روش etcd خارجی با kubeadm به راهاندازی یک control plane با دسترسیپذیری بالا ادامه دهید.