در این آموزش ما نحوه ی کوبرنتیس کلاستر با استفاده از K3S می پردازیم. K3S یک توزیع کوبرنتیس سبک و کم حجم است که برای سرور های دیتاسنتری هتزنر نظیر CX11 که مجموعه ی وان سرور ارائه می دهد، است. علاوه بر این، ما در این آموزش ، راه اندازی لود بالانسر ابری که بارگیری SSL و ارسال ترافیک به سیستم کوبرنتیس ما را انجام می دهد، را فرا خواهیم گرفت. ما یاد خواهید گرفت که چگونه با استفاده از GlusterFS یک فایل سیستم توزیع شده و تکراری راه اندازی کنیم.
ما در این آموزش فرض می کنیم، که شما از طریق شرکت وان سرور یک سرور دیتاسنتری هتزنر تهیه نمودید و از طریق سایت ما به این سرور مورد نظر دسترسی دارید.
در این آموزش از اصطلاحات و موارد پیشفرض زیر استفاده شده است:
10.0.0.2
10.0.0.3
10.0.0.4
10.0.0.254
اول، ما یک شبکه پرایوت ایجاد می کنیم؛ همچنین که از نود های کوبرنتیس ما برای ارتباط با یکدیگر تشکیل شده اند استفاده می کنیم. ما از شبکه ی 10.0.0.0/16 برای سابنت استفاده می کنیم.
hcloud network create --name network-kubernetes --ip-range 10.0.0.0/16
hcloud network add-subnet network-kubernetes --network-zone eu-central --type server --ip-range 10.0.0.0/16
در ادامه، یک گروه قرارگیری “گسترش” یا “spread” برای سرورهای خود و سپس ماشین های مجازی ایجاد می کنیم.
گروه تعیین سطح برای تضمین این است که ماشین های مجازی ما (VMs) بر روی هاست های مختلف ایجاد شوند، پس در این مورد، اگر هاست خراب شود و یا از دسترس خارج شود، هیچ کدام از ماشین های مجازی دیگر را تحت تاثیر خود قرار نمی دهد.
hcloud placement-group create --name group-spread --type spread
در این جا ما از دبیان 10 استفاده می کنیم.
hcloud server create --datacenter nbg1-dc3 --type cx11 --name master-1 --image debian-10 --ssh-key <your_ssh_key> --network network-kubernetes --placement-group group-spread
hcloud server create --datacenter nbg1-dc3 --type cx11 --name node-1 --image debian-10 --ssh-key <your_ssh_key> --network network-kubernetes --placement-group group-spread
hcloud server create --datacenter nbg1-dc3 --type cx11 --name node-2 --image debian-10 --ssh-key <your_ssh_key> --network network-kubernetes --placement-group group-spread
خب، حالا که سرور های ما ایجاد شده اند و همچنین فعال هستند، با هم یک فایروال را ایجاد و آن را در ترافیک ورودی و خروجی محدود می کینم(به نوعی به تنظیم آن میپردازیم). ممکن ما فایروال را با توجه به نیاز های خودمان (نیاز باشد که) کمی کاستومایز کنیم.
ایجاد فایروال:
hcloud firewall create --name firewall-kubernetes
اجازه یا Allow دادن ورودی SSH و ICMP :
hcloud firewall add-rule firewall-kubernetes --description "Allow SSH In" --direction in --port 22 --protocol tcp --source-ips 0.0.0.0/0 --source-ips ::/0
hcloud firewall add-rule firewall-kubernetes --description "Allow ICMP In" --direction in --protocol icmp --source-ips 0.0.0.0/0 --source-ips ::/0
اجازه یا Allow دادن خروجی ICMP، DNS، HTTP، HTTPS و NTP:
hcloud firewall add-rule firewall-kubernetes --description "Allow ICMP Out" --direction out --protocol icmp --destination-ips 0.0.0.0/0 --destination-ips ::/0
hcloud firewall add-rule firewall-kubernetes --description "Allow DNS TCP Out" --direction out --port 53 --protocol tcp --destination-ips 0.0.0.0/0 --destination-ips ::/0
hcloud firewall add-rule firewall-kubernetes --description "Allow DNS UDP Out" --direction out --port 53 --protocol udp --destination-ips 0.0.0.0/0 --destination-ips ::/0
hcloud firewall add-rule firewall-kubernetes --description "Allow HTTP Out" --direction out --port 80 --protocol tcp --destination-ips 0.0.0.0/0 --destination-ips ::/0
hcloud firewall add-rule firewall-kubernetes --description "Allow HTTPS Out" --direction out --port 443 --protocol tcp --destination-ips 0.0.0.0/0 --destination-ips ::/0
hcloud firewall add-rule firewall-kubernetes --description "Allow NTP UDP Out" --direction out --port 123 --protocol udp --destination-ips 0.0.0.0/0 --destination-ips ::/0
اعمال رول های فایروال بر روی هر سه سرورها:
hcloud firewall apply-to-resource firewall-kubernetes --type server --server master-1
hcloud firewall apply-to-resource firewall-kubernetes --type server --server node-1
hcloud firewall apply-to-resource firewall-kubernetes --type server --server node-2
خب خب! الان زمان K3S رسیده. قبل از این که نود اصلی و نود های عامل را آماده کنیم، اول سیستم را آپگرید کرده و AppArmor را نصب می کنیم. به سرور مجازی های ایجاد شده SSH کرده و سپس دستور های زیر را بر روی همه ی آن ها اجرا می کنیم:
apt update
apt upgrade -y
apt install apparmor apparmor-utils -y
به نود اصلی (یا مستر نود) SSH می کنیم، و دستورات زیر را برای نصب و اجرا K3S سرور اجرا می کنیم:
curl -sfL https://get.k3s.io | sh -s - server \
--disable-cloud-controller \
--disable metrics-server \
--write-kubeconfig-mode=644 \
--disable local-storage \
--node-name="$(hostname -f)" \
--cluster-cidr="10.244.0.0/16" \
--kube-controller-manager-arg="address=0.0.0.0" \
--kube-controller-manager-arg="bind-address=0.0.0.0" \
--kube-proxy-arg="metrics-bind-address=0.0.0.0" \
--kube-scheduler-arg="address=0.0.0.0" \
--kube-scheduler-arg="bind-address=0.0.0.0" \
--kubelet-arg="cloud-provider=external" \
--token="<your_secret_token>" \
--tls-san="$(hostname -I | awk '{print $2}')" \
--flannel-iface=ens10
برای اطلاعات بیشتر در باره ی K3S می توانید، به اسناد ارائه شده یا همان داکیومنشن آن (در این لینک) مراجعه کنید. اما به طور خلاصه :
یک راز بزرگ درمورد 90 % هاستینگ های ایرانی، اورسل کردن بیش از حد است که باعث افت کیفیت سرورها میشود.
وان سرور با ارائه دسترسی های مختلف این امکان را به شما خواهد داد که تمامی منابع سرورتان را مدیریت و بررسی کنید و همچنین با ارائه گارانتی 100% برگشت وجه ریسک خرید شما را به %0 کاهش میدهد.
هنوز بر روی نود اصلی قرار داریم، برای نصب این مورد از دستور زیر استفاده می کنیم:
kubectl -n kube-system create secret generic hcloud --from-literal=token=<hetzner_api_token> --from-literal=network=network-kubernetes
kubectl apply -f https://github.com/hetznercloud/hcloud-cloud-controller-manager/releases/latest/download/ccm-networks.yaml
دستور زیر آپگرید کننده ی K3S را ارائه می دهد:
kubectl apply -f https://github.com/rancher/system-upgrade-controller/releases/latest/download/system-upgrade-controller.yaml
اکنون که سرور K3S ما راه اندازی شده است، به دو نود عامل SSH کرده و دستورات زیر را برای نصب K3S و ارتباط آن با سرور اجرا می کنیم:
curl -sfL https://get.k3s.io | K3S_URL=https://10.0.0.2:6443 K3S_TOKEN=<your_secret_token> sh -s - agent \
--node-name="$(hostname -f)" \
--kubelet-arg="cloud-provider=external" \
--flannel-iface=ens10
GlusterFS یک نرم افزار رایگان و اوپن سورس (منبع باز) سیستم فایل شبکه به صورت مقیاس پذیر است. میتوان از آن برای تکثیر فایلها در تمام ماشینهای مجازی خود استفاده کنیم تا pod های ما بدون توجه به اینکه در کدام نود در حال اجرا هستند، به ذخیرهسازی دائمی خود دسترسی داشته باشند.
به هر 3 سرور SSH کرده و دستورات زیر را برای نصب، فعال نمودن و اجرا کردن، سرور Gluster بر روی همه ی ماشین ها اجرا می کنیم:
wget -O - https://download.gluster.org/pub/gluster/glusterfs/9/rsa.pub | apt-key add -
echo deb [arch=amd64] https://download.gluster.org/pub/gluster/glusterfs/9/LATEST/Debian/buster/amd64/apt buster main > /etc/apt/sources.list.d/gluster.list
apt update && apt install -y glusterfs-server
systemctl enable glusterd && systemctl start glusterd
فایل سیستم کنترلی Gluster در پوشه ای به نام brick قرار دارد. همچنین توسط GlusterFS نصب شده است. با دستورات زیر دایرکتوری های لازم را ایجاد کنیم:
mkdir -p /data/glusterfs/k8s/brick1
mkdir -p /mnt/gluster-k8s
فقط بر روی نود اصلی، 2 نود دیگر را به عنوان همتا اضافه می کنیم:
gluster peer probe 10.0.0.3
gluster peer probe 10.0.0.4
تایید کردن وضعیت بر روی نود اصلی و نود های فرعی:
gluster peer status
در نود اصلی خودمان، دستور زیر را برای ایجاد و شروع یک volume تکراری اجرا می کنیم:
gluster volume create k8s replica 3 \
10.0.0.2:/data/glusterfs/k8s/brick1/brick \
10.0.0.3:/data/glusterfs/k8s/brick1/brick \
10.0.0.4:/data/glusterfs/k8s/brick1/brick \
force
gluster volume start k8s
gluster volume info
بر روی هر سه نود GlusterFS volume جدید اجرا شده را مونت می کنیم:
echo "127.0.0.1:/k8s /mnt/gluster-k8s glusterfs defaults,_netdev 0 0" >> /etc/fstab
mount /mnt/gluster-k8s
در اینجا ما به طور مثال از لود بالانسر هتزنر SSL offloading و برای مسیریابی رکوئست های HTTP به راه اندازی K3S استفاده می کینم.
با استفاده از دستورات زیر این عمل را انجام می دهیم:
cat <<EOF > /var/lib/rancher/k3s/server/manifests/traefik-config.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: traefik
namespace: kube-system
spec:
valuesContent: |-
additionalArguments:
- "--entryPoints.web.proxyProtocol.trustedIPs=10.0.0.254"
- "--entryPoints.web.forwardedHeaders.trustedIPs=10.0.0.254"
EOF
متعادل کننده بار یا همان لود بالانسر را ایجاد کنیم و با استفاده از IP پرایوت ثابت 10.0.0.254 آن را به شبکه پرایوت یا خصوصی متصل می کنیم:
hcloud load-balancer create --type lb11 --location nbg1 --name lb-kubernetes
hcloud load-balancer attach-to-network --network network-kubernetes --ip 10.0.0.254 lb-kubernetes
سه ماشین مجازی خودمان را به عنوان تارگت ها اضافه می کنیم و مطمئن می شویم که ترافیک با استفاده از شبکه پرایوت هدایت می شود:
hcloud load-balancer add-target lb-kubernetes --server master-1 --use-private-ip
hcloud load-balancer add-target lb-kubernetes --server node-1 --use-private-ip
hcloud load-balancer add-target lb-kubernetes --server node-2 --use-private-ip
با استفاده از Let’s Encrypt یک گواهی یا همان سرتیفیکیت برای <example.com> ایجاد می کنیم و <certificate_id> را می گیریم:
hcloud certificate create --domain <example.com> --type managed --name cert-t1
hcloud certificate list
با استفاده از پروتکل پروکسی، سرویس HTTP را برای <example.com> اضافه می کنیم و بررسی سلامت را فعال می کنیم:
hcloud load-balancer add-service lb-kubernetes --protocol https --http-redirect-http --proxy-protocol --http-certificates <certificate_id>
hcloud load-balancer update-service lb-kubernetes --listen-port 443 --health-check-http-domain <example.com>
تنظیمات و برپایی و ست آپ ما که مربوط به K3S است به اتمام رسیده است. خب وقت این رسیده که از nginx و سرویس HTTP توسط K3S استفاده کنیم.
یک index.html ایجاد می کنیم:
mkdir /mnt/gluster-k8s/webtest1
echo "Hello World!" > /mnt/gluster-k8s/webtest1/index.html
nginx را مستقر و ایجاد کنید، GlusterFS volume را برای محتوای ثابت نصب می کنیم، پورت HTTP 80 را با استفاده از یک سرویس در معرض دید (انتشار) قرار می دهیم و یک مسیر ورودی Traefik برای دامنه خود ایجاد می کینم :
cat <<"EOF" | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: webtest1
spec:
replicas: 1
selector:
matchLabels:
app: webtest1
template:
metadata:
labels:
app: webtest1
spec:
volumes:
- name: volume-webtest1
hostPath:
path: "/mnt/gluster-k8s/webtest1"
containers:
- image: nginx
name: nginx
ports:
- name: port-nginx
containerPort: 80
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: volume-webtest1
readOnly: false
---
apiVersion: v1
kind: Service
metadata:
name: webtest1
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: webtest1
type: ClusterIP
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: webtest1
spec:
entryPoints:
- web
routes:
- match: Host(`<example.com>`)
kind: Rule
services:
- name: webtest1
port: 80
EOF
اتمام کار، همچنین ما باید به وب سایت مان https://<example.com> دسترسی داشته باشیم.
ما با موفقیت یک کلاستر K3S Kubernetes را با یک نود سرور و دو نود عامل راه اندازی کردیم. متعادل کننده بار یا همان لود بالانسر ترافیک را به سیستم ما ارائه می دهد و بارگذاری HTTPS را نیز انجام داده و ما آماده هستیم تا مقداری حجم کار را روی K3S خود قرار دهیم.
خب، دوستان وان سروری اگر سوال ، پیشنهاد و انتقادی هست در خدمتیم. میتونید سوال ها تون رو در قسمت نظرات بپرسین تا خدمتتون پاسخ بدیم.