บันทึกการเล่น Kubespray : สร้าง Cluster และระเบิดทิ้ง

zaserzafear
5 min readMay 19, 2024

--

ก่อนอื่นขอให้เครดิต youtube channel
Just me and Opensource กับ playlist : Kubernetes Kubespray Provisioning

เริ่มด้วย Architecture ได้ออกแบบไว้ประมาณนี้
1 Load Balancer สำหรับ Kube Api Server ติดตั้ง HaProxy IP : 192.168.0.200
3 K8S Control Plane
3 K8S Node

Spec เครื่อง ประมาณนี้

เริ่มการเตรียมเครื่อง
1. VM ทั้งหมดที่เตรียมไว้ จะเป็น Ubuntu Server 22.04 ได้ทำการ Fix IPV4 ตาม Diagram และปิด Swap
2. ติดตั้ง HaProxy ที่เครื่อง 192.168.0.200

 sudo apt update && sudo apt install -y haproxy

2.1 แก้ไข haproxy.cfg

sudo nano /etc/haproxy/haproxy.cfg

ทำการเพิ่มสมาชิก K8S Control Plane เข้าไป

listen kubernetes-apiserver-https
bind 192.168.0.200:8383
mode tcp
option log-health-checks
timeout client 3h
timeout server 3h
server master1 192.168.0.201:6443 check check-ssl verify none inter 10000
server master2 192.168.0.202:6443 check check-ssl verify none inter 10000
server master3 192.168.0.203:6443 check check-ssl verify none inter 10000
balance roundrobin

จะหน้าตา haproxy.cfg ได้ประมาณ

2.2 ทำการ Restart HaProxy และเช็คสถานะของ HaProxy

sudo systemctl restart haproxy
systemctl status haproxy

2.3 ทำการตรวจสอบว่า port 8383 ที่ได้ทำการ listener ไว้หรือเปล่า

netstat -nltp

3. เครื่องสำหรับ k8s cluster ไม่ต้องทำอะไร เดี๋ยว ansible จัดการให้เอง

4. ในบทความนี้จะใช้เครื่อง k8s-lb-kube-api-server เป็น Bastion Host

4.1 ทำการสร้าง ssh key เพื่อให้ ansible ใช้งาน

ssh-keygen -f $HOME/.ssh/ansible -C ansible

4.2 ทำการคัดลอก ssh key ไปอยู่ส่วนของ authorized_keysเพื่อเวลาที่จะ shell ไยังเครื่องเป้าหมายจะได้ไม่ต้องใช้รหัสผ่าน (ให้ ansible ใช้นั่นแหละ) ทำทีละเครื่อง

ssh-copy-id -i .ssh/ansible.pub ubuntu@192.168.0.201
ssh-copy-id -i .ssh/ansible.pub ubuntu@192.168.0.202
ssh-copy-id -i .ssh/ansible.pub ubuntu@192.168.0.203
ssh-copy-id -i .ssh/ansible.pub ubuntu@192.168.0.204
ssh-copy-id -i .ssh/ansible.pub ubuntu@192.168.0.205
ssh-copy-id -i .ssh/ansible.pub ubuntu@192.168.0.206

ตอบ yes และใส่ password

4.3 (Optional) สร้าง .ssh/config เพื่อสะดวกในการใช้คำสั่ง ssh

nano .ssh/config
Host 192.168.0.201
User ubuntu
IdentityFile ~/.ssh/ansible

Host 192.168.0.202
User ubuntu
IdentityFile ~/.ssh/ansible

Host 192.168.0.203
User ubuntu
IdentityFile ~/.ssh/ansible

Host 192.168.0.204
User ubuntu
IdentityFile ~/.ssh/ansible

Host 192.168.0.205
User ubuntu
IdentityFile ~/.ssh/ansible

Host 192.168.0.206
User ubuntu
IdentityFile ~/.ssh/ansible

4.4 (Optional) ทำการตรวจสอบ .ssh/config

ssh 192.168.0.201

4.5 กำหนด Local DNS เพื่อชี้ IP สำหรับ domain lb-kube.mycluster.local โดยกำหนดที่ /etc/hosts

sudo nano /etc/hosts
192.168.0.200       lb-kube.mycluster.local

4.6 ทำการ Clone Kubespray มาไว้ที่เครื่อง Bastion Host

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

4.7 ทำการ Change Directory ไปยัง Directory kubespray

cd kubespray

4.8 ทำการติดตั้ง Packages ที่จำเป็น

pip install -r requirements.txt

4.9 ทำการแก้ไขตัวแปร $PATH เพื่อให้สามารถใช้คำสั่ง ansible ได้

nano ~/.profile

4.10 เพิ่ม export PATH=”$PATH:$HOME/.local/bin”

export PATH="$PATH:$HOME/.local/bin"

4.11 ทำการใช้การตั้งค่า ~/.profile

source ~/.profile

4.12 เตรียม Inventory Cluster ที่จะสร้างขึ้น

cp -rfp inventory/sample inventory/mycluster
declare -a IPS=(192.168.0.201 192.168.0.202 192.168.0.203 192.168.0.204 192.168.0.205 192.168.0.206)
CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

4.13 ทำการกำหนดค่าของ External Load Balancer K8S API Server

nano inventory/mycluster/group_vars/all/all.yml
## External LB example config
apiserver_loadbalancer_domain_name: "lb-kube.mycluster.local"
loadbalancer_apiserver:
address: 192.168.0.200
port: 8383

## Internal loadbalancers for apiservers
loadbalancer_apiserver_localhost: false
# valid options are "nginx" or "haproxy"
# loadbalancer_apiserver_type: nginx # valid values "nginx" or "haproxy"

4.14 จัดกลุ่มของ K8S Cluster สักหน่อย

nano inventory/mycluster/hosts.yaml
all:
hosts:
k8s-cp-1:
ansible_host: 192.168.0.201
ip: 192.168.0.201
access_ip: 192.168.0.201
k8s-cp-2:
ansible_host: 192.168.0.202
ip: 192.168.0.202
access_ip: 192.168.0.202
k8s-cp-3:
ansible_host: 192.168.0.203
ip: 192.168.0.203
access_ip: 192.168.0.203
k8s-node-1:
ansible_host: 192.168.0.204
ip: 192.168.0.204
access_ip: 192.168.0.204
k8s-node-2:
ansible_host: 192.168.0.205
ip: 192.168.0.205
access_ip: 192.168.0.205
k8s-node-3:
ansible_host: 192.168.0.206
ip: 192.168.0.206
access_ip: 192.168.0.206
children:
kube_control_plane:
hosts:
k8s-cp-1:
k8s-cp-2:
k8s-cp-3:
kube_node:
hosts:
k8s-node-1:
k8s-node-2:
k8s-node-3:
etcd:
hosts:
k8s-cp-1:
k8s-cp-2:
k8s-cp-3:
k8s_cluster:
children:
kube_control_plane:
kube_node:
calico_rr:
hosts: {}

4.15 สั่งให้ ansible ติดตั้ง k8s cluster ให้เรา !!!

ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root -u ubuntu cluster.yml -K

4.17 เย่ !!! เสร็จสักที

5 ทดสอบการใช้ kubectl

5.1 ทำการเชื่อมต่อไปยัง Control Plane

ssh 192.168.0.201

5.2 ทำการสร้าง Directory ~/.kube และ คัดลอก /etc/kubernetes/admin.conf มายัง ~/.kube/config และ ทำการเปลี่ยนเจ้าของไฟล์/กลุ่มเจ้าของไฟล์ เป็น User/Group ที่เราใช้

mkdir ~/.kube
sudo cp /etc/kubernetes/admin.conf ~/.kube/config
sudo chown ubuntu:ubuntu ~/.kube/config

5.3 ทดสอบโดยการใช้คำสั่ง kubectl get nodes -owide

เย่ !!! k8s cluster ของเราใช้งานได้แล้ว

5.4 ทำการคัดลอก Kubernetes Config มายัง Bastion Host โดยการกลับมาที่ Bastion Host แล้วใช้คำสั่ง

mkdir ~/.kube
scp ubuntu@192.168.0.201:~/.kube/config ~/.kube/config

5.5 ติดตั้ง kubectl

sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
sudo chmod 644 /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo chmod 644 /etc/apt/sources.list.d/kubernetes.lis
sudo apt-get update && sudo apt-get install -y kubectl

5.6 ทดสอบการ Deploy nginx สัก 10 replicas

kubectl create deployment nginx-deployment --image=nginx --replicas=10

5.7 ตรวจสอบการ Deploy nginx ทั้งหมด

kubectl get deploy,pods -owide
Deploy ขึ้นไม่ครบ 10 Replicas เป็นเพราะว่า Kube Node ของเราตัวเล็ก เลยบรรจุไม่พอ

6. Reset Cluster สามารถใช้คำสั่ง

ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root -u ubuntu reset.yml -K

ขออนุญาตจบบทความก่อนนะครับ…

สำหรับรายละเอียด หรือท่วงท่าอื่น ๆ สามารถดูตาม ref ที่ให้ไว้ข้างต้นได้เลยนะครับ

--

--