[ตอนที่ 1] สร้าง Kubernetes HA-Cluster on Baremetal by KUBESPRAY

Thanaphat Nuangjumnong
4 min readSep 14, 2019
https://kubernetes.io/blog/2018/08/03/out-of-the-clouds-onto-the-ground-how-to-make-kubernetes-production-grade-anywhere/
docker.com / kubernetes.io

Kubernetes เป็นซอฟต์แวร์สำหรับ Container Orchestration คือซอฟต์แวร์ที่ใช้จัดการและควบคุม “Container” เป็น Opensource ที่สร้างขึ้นโดย Google ก็ตัดสินใจตั้งมูลนิธิ Cloud Native Computing Foundation (CNCF) มาดูแลโครงการต่อ

วันนี้ผมจะมาแชร์ ปสก. การสร้าง K8S Cluster ด้วย Product ที่ชื่อ Kubespray โดย Server ที่เราใช้ทั้งหมดจะเป็น Bare-metal ซึ่งมี Spac CPU 40 core/Mem 512G

โดยเราจะแบ่งออกเป็น 3 ส่วน คือ
1. Etcd Server ทำหน้าที่เก็บไฟล์ Config (yaml) เหมือนๆ Database ครับ

2. Master Node ประกอบไปด้วย 3 ส่วน คือ

Kube-apiserver > ทำหน้าที่รับคำสั่ง ผ่านทางคำสั่ง kubectl จาก Client
Kube-controller-manager >
ทำหน้าที่ควบคุม การทำงานระหว่าง Node และ Scale เพิ่ม / ลด ของ pod
Kube-scheduler >
ทำหน้าที่ auto-scales pod เมื่อมีจำนวนไม่ครบตาม Config file

3.Worker Node มี 2 Service

Kubelet > ทำหน้าที่คุยกับ Master Node ดูแล POD ภายใน
Docker > engine ตัวหนึ่งที่มีการทำงานในลักษณะจำลองสภาพแวดล้อมขึ้นมาบนเครื่อง server เพื่อใช้ในการ run service ที่ต้องการ

เริ่มจากเราต้องจัดการ Update CentOS 7.6 ให้เป็น Version ปัจจุบันก่อน และปิด Firewall , Swap , Selinux หลังจากปิดทั้งหมดแล้วให้ restart server สักหนึ่งรอบ

1. Make sure the CentOS is up-to-date.

$yum update -y

2. Disable Selinux

#######edit /etc/sysconfig/selinux #######
$sed -i -e s/enforcing/disabled/g /etc/sysconfig/selinux
$sed -i -e s/permissive/disabled/g /etc/sysconfig/selinux
$setenforce 0

3. Disable Swapoff and Stop firewall services on all the nodes in the cluster

$swapoff -a
$systemctl stop firewalld
$systemctl disable firewalld

4. Reboot all server

$reboot

❗❗❗Note : if server can’t go out to internet please export proxy into the servers.

ต่อมาให้หา Ansible Server มาใช้สำหรับ Command ต่างๆไปยัง Host Inventory ที่เราจะทำการ Configuration จริงๆ แล้ว เบื้องหลังของ Kubespray คือการเขียน Ansible ไป Install package ต่างๆ

Part I : Intall packege on Ansible Server

  1. How to install Pip on CentOS 7

$yum install epel-release
$yum install python-pip
$pip install — upgrade pip
Ref. https://linuxize.com/post/how-to-install-pip-on-centos-7/

2. Enable passwordless login between all servers in the cluster.

$git clone https://github.com/ilias-sp/ansible-setup-passwordless-ssh.git
$ansible-playbook -i hosts ansible_setup_passwordless_ssh.yml

Ref : https://github.com/ilias-sp/ansible-setup-passwordless-ssh
Ref: https://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/

3. Git clone the Kubespray repository

$git clone https://github.com/kubernetes-sigs/kubespray.git

4. Go to Kubespray directory

# Install requirements
sudo pip install -r requirements.txt

# Copy ``inventory/sample`` as ``inventory/mycluster``
cp -rfp inventory/sample inventory/mycluster

5. Edit Inventory Host >>## edit inventory/mycluster/inventory.ini

[all]
sprayetc01 ansible_host=172.16.xxx.xxx ip=172.16.xxx.xxx etcd_member_name=etcd1
sprayetc02 ansible_host=172.16.xxx.xxx ip=172.16.xxx.xxx etcd_member_name=etcd2
sprayetc03 ansible_host=172.16.xxx.xxx ip=172.16.xxx.xxx etcd_member_name=etcd3
spraymt04 ansible_host=172.16.xxx.xxx ip=172.16.xxx.xxx
spraymt05 ansible_host=172.16.xxx.xxx ip=172.16.xxx.xxx
spraymt06 ansible_host=172.16.xxx.xxx ip=172.16.xxx.xxx
spraymn07 ansible_host=172.16.xxx.xxx ip=172.16.xxx.xxx
spraymn08 ansible_host=172.16.xxx.xxx ip=172.16.xxx.xxx
spraymn09 ansible_host=172.16.xxx.xxx ip=172.16.xxx.xxx

[kube-master]

spraymt04

spraymt05

spraymt06

[etcd]

sprayetc01

sprayetc02

sprayetc03

[kube-node]

spraymn07

spraymn08

spraymn09

[k8s-cluster:children]

kube-master

kube-node

อธิบายเพิ่มเติม เราสามารถระบุ Kube Version ที่ต้องการลงไป ในที่นี่ ผมต้องการ Version 1.14.6 (ปัจจุบัน 1.15.3 ไปแล้ววว) > เดี๋ยวเราจะไป Update ในตอนต่อไป
ส่วน Network Plugin ผมใช้เป็น Weave สามารถอ่านเพิ่มเติมได้ที่นี่
การตั้งชื่อ Cluster_Name จะเป็น Intranet DNS ให้เราด้วยครับ

6.Edit k8s-cluster Configuration >> inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml

## Change this to use another Kubernetes version, e.g. a current beta release
kube_version: v1.14.6

# Choose network plugin (cilium, calico, contiv, weave or flannel. Use cni for generic cni plugin)# Can also be set to ‘cloud’, which lets the cloud provider setup appropriate routing
kube_network_plugin: weave

# Kubernetes cluster name, also will be used as DNS domain
cluster_name: k8scluster.local

ถ้าเราต้องการ K8S Dashboard ให้ Enable ขึ้นมาด้วยครับ ส่วน Metrics Server แนะนำใช้เปิดใช้งาน เราจะสามารถใช้คำสั่ง kubectl top pod / kubectl top node ได้

kubectl top pod

7. Edit addons.yml Configuration >> inventory/mycluster/group_vars/k8s-cluster/addons.yml

# Kubernetes dashboard
dashboard_enabled: true

# Metrics Server deployment
metrics_server_enabled: true
metrics_server_kubelet_insecure_tls: true
metrics_server_metric_resolution: 60s
metrics_server_kubelet_preferred_address_types: “InternalIP”

เราต้องการให้ Api-Server เป็น HA แนะนำให้สร้าง VIP จาก HA-Proxy แล้วนำไปจด DNS สักหน่อยจะได้ดูเท่ขึ้นมาหน่อย

8.Edit Config >> inventory/mycluster/group_vars/all/all.yml

## External LB example config
apiserver_loadbalancer_domain_name: “k8spray-apiserver.local”
loadbalancer_apiserver:
address: 172.xx.xx.xx
port: 6443

ถ้า Server อยู่ใน Zone ที่ไม่สามารถออก Internet ได้ ต้อง Export Proxy ให้กับ Docker ด้วย ไม่งั้นจะไม่สามารถไป Pull image ได้ และต้อง No_Proxy สำหรับ URL หรือ IP ที่ไม่จำเป็นต้องออก Internet ด้วยครับ

## Set these proxy values in order to update package manager and docker daemon to use proxies
http_proxy: “172.xx.xx.xx”
https_proxy: “172.xx.xx.xx”

## If you need exclude all cluster nodes from proxy and other resources, add other resources here.
additional_no_proxy: “registydocker.local”

9. Deploy Kubespray with Ansible Playbook

$ansible-playbook -i inventory/mycluster/inventory.yml cluster.yml -b -v

❗❗❗Please wait a moment. I think should be 15 min per node. ##After Finished You can check by cmd on Master node

เพียงแค่ 1 command ได้ K8S Cluster เลยครับ นี้คือข้อดีของ Kubespray ถ้ามี Stage ไหน Fail ระบบจะหยุดทำงานทันที แนะนำให้ใส่ Option -vvv เมื่อติดปัญหาจะได้แก้ไขได้ถูกต้อง

$kubectl get node

kubectl get node

ตอนต่อไป จะแชร์วิธีการ Add node / Remove node / Reset

Ref : https://kubernetes.io/
Ref : https://github.com/kubernetes-sigs/kubespray

--

--