Đây là hướng dẫn từng bước về cách thiết lập Kubernetes trên ARM và x86-64 kim loại trần của Scaleway. Lý do chính khiến tôi thực hiện dự án này là vì tôi muốn tự động hóa việc tạo môi trường thử nghiệm cho OpenFaaS và WeaNet trên ARM. Tôi đang tìm kiếm một giải pháp rẻ tiền để chạy thử nghiệm tích hợp và sau khi dùng thử một số nhà cung cấp dịch vụ đám mây, tôi đã chọn Scaleway. Scaleway là nhà cung cấp đám mây của Pháp cung cấp máy chủ ARM và x86-64 kim loại trần với giá cả phải chăng. Sử dụng nhà cung cấp Terraform Scaleway cùng với kubeadm, bạn có thể có một cụm Kubernetes đầy đủ chức năng trong mười phút Thiết lập ban đầu Sao chép kho lưu trữ và cài đặt các phụ thuộc: $ git clone httpsgithub.com/stefanprodan/k8s-scw-baremetal.git $ cd k8s-scw-baremetal $ terraform init Lưu ý rằng bạn sẽ cần Terraform v0.10 hoặc mới hơn để chạy dự án này Trước khi chạy dự án, bạn sẽ phải tạo mã thông báo truy cập cho Terraform để kết nối với API Scaleway. Sử dụng mã thông báo và khóa truy cập của bạn, tạo hai biến môi trường: $ xuất SCALEWAY_ORGANIZATIONACCESS-KEY>"$ xuất SCALEWAY_TOKENACCESS-TOKEN>"Cách sử dụng Tạo một cụm Kubernetes kim loại trần ARMv7 với một nút chính và hai nút: $ terraform workspace new arm $ terraform apply \ -var region=par1 \ -var arch=arm \ -var server_type=C1 \ -var nodes=2 \ -var weave_passwd=ChangeMe \ -var k8s_version=stable-1.9 \ -var docker_version =17.03.0~ce-0~ubuntu-xenial Điều này sẽ làm như sau: - dự trữ IP công cộng cho mỗi máy chủ - cung cấp ba máy chủ bare-metal với Ubuntu 16.04.1 LTS - kết nối với máy chủ chính thông qua SSH và cài đặt các gói Docker CE và kubeadm armhf apt - chạy kubeadm init trên master server và cấu hình kubectl - tải xuống tệp cấu hình quản trị viên kubectl trên máy cục bộ của bạn và thay thế IP riêng bằng IP chung - tạo bí mật Kubernetes bằng mật khẩu Wea Net - cài đặt WeaNet với lớp phủ được mã hóa - cài đặt các tiện ích bổ sung cho cụm (bảng điều khiển Kubernetes, máy chủ số liệu và Heapster) - khởi động các worker node song song và cài đặt Docker CE và kubeadm - tham gia các nút worker trong cụm bằng cách sử dụng mã thông báo kubeadm nhận được từ master Mở rộng quy mô bằng cách tăng số lượng nút: $ địa hình áp dụng -var nút = 3 Xé toàn bộ cơ sở hạ tầng với: lực lượng địa hình Tạo cụm Kubernetes kim loại trần AMD64 với một nút chính và một nút: $ terraform workspace mới amd64 $ terraform apply \ -var region=par1 \ -var arch=x86_64 \ -var server_type=C2S \ -var nodes=1 \ -var weave_passwd=ChangeMe \ -var k8s_version=stable-1.9 \ -var docker_version =17.03.0~ce-0~ubuntu-xenial Điều khiển từ xa Sau khi áp dụng gói Terraform, bạn sẽ thấy một số biến đầu ra như IP công cộng chính, lệnh tham gia kubeadmn và cấu hình quản trị không gian làm việc hiện tại Để chạy các lệnh kubectl đối với cụm Scaleway, bạn có thể sử dụng biến đầu ra kubectl_config: Kiểm tra xem Heapster có hoạt động không: $ kubectl --kubeconfig đầu ra địa hình kubectl_config) các nút trên cùng TÊN CPU(lõi) CPU% BỘ NHỚ(byte) BỘ NHỚ% arm-master-1 655m 16% 873Mi 45% arm-node-1 147m 3% 618Mi 32% arm-node- 2 101m 2% 584Mi 30% Các định dạng tệp cấu hình kubectl là .conf as in arm.conf or amd64.conf In order to access the dashboard you’ll need to find its cluster IP: $ kubectl --kubeconfig terraform output kubectl_config) \ -n kube-system get svc --selector=k8s-app=kubernetes-dashboard NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes-dashboard ClusterIP 10.107.37.220 80/TCP 6m Open a SSH tunnel: ssh -L 8888::80 [email protected] Now you can access the dashboard on your computer at httplocalhost:8888 Expose services outside the cluster Since we’re running on bare-metal and Scaleway doesn’t offer a load balancer, the easiest way to expose applications outside of Kubernetes is using a NodePort service Let’s deploy the podinfo app in the default namespace. Podinfo has a multi-arch Docker image and it will work on arm, arm64 or amd64 Create the podinfo nodeport service: $ kubectl --kubeconfig terraform output kubectl_config) \ apply -f httpsraw.githubusercontent.com/stefanprodan/k8s-podinfo/master/deploy/auto-scaling/podinfo-svc-nodeport.yaml service "podinfo-nodeport" created Create the podinfo deployment: $ kubectl --kubeconfig terraform output kubectl_config) \ apply -f httpsraw.githubusercontent.com/stefanprodan/k8s-podinfo/master/deploy/auto-scaling/podinfo-dep.yaml deployment "podinfo" created Inspect the podinfo service to obtain the port number: $ kubectl --kubeconfig terraform output kubectl_config) \ get svc --selector=app=podinfo NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE podinfo-nodeport NodePort 10.104.132.14 9898:31190/TCP 3m You can access podinfo at httpMASTER_PUBLIC_IP>:31190 or using curl: $ curl httpterraform output k8s_master_public_ip):31190 runtime: arch: arm max_procs: "4" num_cpu: "4" num_goroutine: "12" os: linux version: go1.9.2 labels: app: podinfo pod-template-hash: "1847780700" annotations: kubernetes.io/config.seen: 2018-01-08T00:39:45.580597397Z kubernetes.io/config.source: api environment: HOME: /root HOSTNAME: podinfo-5d8ccd4c44-zrczc KUBERNETES_PORT: tcp10.96.0.1:443 KUBERNETES_PORT_443_TCP: tcp10.96.0.1:443 KUBERNETES_PORT_443_TCP_ADDR: 10.96.0.1 KUBERNETES_PORT_443_TCP_PORT: "443" KUBERNETES_PORT_443_TCP_PROTO: tcp KUBERNETES_SERVICE_HOST: 10.96.0.1 KUBERNETES_SERVICE_PORT: "443" KUBERNETES_SERVICE_PORT_HTTPS: "443" PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin externalIP: IPv4: 163.172.139.112 OpenFaaS You can deploy OpenFaaS on Kubernetes with Helm or by using the YAML files form the faas-netes repository Clone the faas-netes repo: git clone httpsgithub.com/openfaas/faas-netes cd faas-netes Deploy OpenFaaS for ARM: $ kubectl --kubeconfig terraform output kubectl_config) \ apply -f ./namespaces.ymlyaml_armhf Deploy OpenFaaS for AMD64: $ kubectl --kubeconfig terraform output kubectl_config) \ apply -f ./namespaces.ymlyaml You can access the OpenFaaS gateway at httpMASTER_PUBLIC_IP>:31112 Horizontal Pod Autoscaling Starting from Kubernetes 1.9 kube-controller-manager is configured by default with horizontal-pod-autoscaler-use-rest-clients In order to use HPA we need to install the metrics server to enable the new metrics API used by HPA v2 Both Heapster and the metrics server have been deployed from Terraform when the master node was provisioned The metric server collects resource usage data from each node using Kubelet Summary API. Check if the metrics server is running: $ kubectl --kubeconfig terraform output kubectl_config) \ get --raw "/apis/metrics.k8s.io/v1beta1/nodes" | jq { "kind": "NodeMetricsList", "apiVersion": "metrics.k8s.io/v1beta1", "metadata": { "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes" }, "items": [ { "metadata": { "name": "arm-master-1", "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/arm-master-1", "creationTimestamp": "2018-01-08T15:17:09Z" }, "timestamp": "2018-01-08T15:17:00Z", "window": "1m0s", "usage": { "cpu": "384m", "memory": "935792Ki" } }, { "metadata": { "name": "arm-node-1", "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/arm-node-1", "creationTimestamp": "2018-01-08T15:17:09Z" }, "timestamp": "2018-01-08T15:17:00Z", "window": "1m0s", "usage": { "cpu": "130m", "memory": "649020Ki" } }, { "metadata": { "name": "arm-node-2", "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/arm-node-2", "creationTimestamp": "2018-01-08T15:17:09Z" }, "timestamp": "2018-01-08T15:17:00Z", "window": "1m0s", "usage": { "cpu": "120m", "memory": "614180Ki" } } ] } Let’s define a HPA that will maintain a minimum of two replicas and will scale up to ten if the CPU average is over 80% or if the memory goes over 200Mi apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: podinfo spec: scaleTargetRef: apiVersion: apps/v1beta1 kind: Deployment name: podinfo minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu targetAverageUtilization: 80 - type: Resource resource: name: memory targetAverageValue: 200Mi Apply the podinfo HPA: $ kubectl --kubeconfig terraform output kubectl_config) \ apply -f httpsraw.githubusercontent.com/stefanprodan/k8s-podinfo/master/deploy/auto-scaling/podinfo-hpa.yaml horizontalpodautoscaler "podinfo" created After a couple of seconds the HPA controller will contact the metrics server and will fetch the CPU and memory usage: $ kubectl --kubeconfig terraform output kubectl_config) get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE podinfo Deployment/podinfo 2826240 / 200Mi, 15% / 80% 2 10 2 5m In order to increase the CPU usage we could run a load test with hey: #install hey go get -u github.com/rakyll/hey #do 10K requests rate limited at 20 QPS hey -n 10000 -q 10 -c 5 httpterraform output k8s_master_public_ip):31190 You can monitor the autoscaler events with: $ kubectl --kubeconfig terraform output kubectl_config) describe hpa Events: Type Reason Age From MessageNormal SuccessfulRescale 7m horizontal-pod-autoscaler New size: 4; reason: cpu resource utilization (percentage of request) above target Normal SuccessfulRescale 3m horizontal-pod-autoscaler New size: 8; reason: cpu resource utilization (percentage of request) above target After the load tests finishes the autoscaler will remove replicas until the deployment reaches the initial replica count: Events: Type Reason Age From MessageNormal SuccessfulRescale 20m horizontal-pod-autoscaler New size: 4; reason: cpu resource utilization (percentage of request) above target Normal SuccessfulRescale 16m horizontal-pod-autoscaler New size: 8; reason: cpu resource utilization (percentage of request) above target Normal SuccessfulRescale 12m horizontal-pod-autoscaler New size: 10; reason: cpu resource utilization (percentage of request) above target Normal SuccessfulRescale 6m horizontal-pod-autoscaler New size: 2; reason: All metrics below target Conclusions Thanks to kubeadm and Terraform, bootstrapping a Kubernetes cluster on bare-metal can be done with a single command and it takes just ten minutes to have a fully functional setup. If you have any suggestion on improving this guide please submit an issue or PR on GitHub at stefanprodan/k8s-scw-baremetal. Contributions are more than welcome!