Deploy OpenStack The Series Part II: ติดตั้ง Kubernetes โดยใช้ Kubespray

MasterTos
3 min readSep 12, 2019

--

ซีรีย์การติดตั้ง OpenStack โดยใช้ Armada ที่จะอธิบายแบบภาษาบ้าน ๆ ตามความเข้าใจของผมเอง จุดประสงค์คือกันลืม ในอนาคตจะได้เข้ามาอ่านใหม่ โดยจะแบ่งออกเป็น 3 ส่วนหลัก ๆ คือ 1.ติดตั้ง CoreOS 2.ติดตั้ง Kubernetes และ 3.ติดตั้ง OpenStack

บทนำ

เนื้อหาของพาร์ทนี้จะเป็นการติดตั้ง Kubernetes โดยใช้เครื่องมือที่ชื่อว่า Kubespray ติดตั้งลงบน CoreOS ที่เราทำกันไปในพาร์ทที่ 1

Kubernetes

https://kubernetes.io/

Kubernetes (K8s) is an open-source system for automating deployment, scaling, and management of containerized applications.

ข้อความด้านบนคัดลอกมากจาก https://kubernetes.io/ สามารถเข้าอ่านเพิ่มเติมกันได้

Kubespray คืออะไร

Kubespray คือเครื่องมือสำหรับช่วยติดตั้ง k8s ครัสเตอร์ที่ทางผู้พัฒนาได้บอกว่าเขาทำได้ดังนี้

https://kubespray.io/
  • Can be deployed on AWS, GCE, Azure, OpenStack, vSphere, Packet (bare metal), Oracle Cloud Infrastructure (Experimental), or Baremetal
  • Highly available cluster
  • Composable (Choice of the network plugin for instance)
  • Supports most popular Linux distributions
  • Continuous integration tests

นอกเหนือจากนี้ยังมีความสามารถอีกเยอะเลยครับ รวมถึงเราสามารถเลือกปลั๊กอินได้หลายอย่างมาก ๆ สามารถ อ่านเพิ่มเติม ได้จากลิงค์เลยครับ

Let Start!!

เพื่อไม่ให้เป็นการเสียเวลาเรามาเริ่มติดตั้งกันเลยดีกว่า เย้~

1. Clone Project

เริ่มต้นจากโคลนตัว Kubespray มากจาก Git ก่อนเลย

git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
ls ดูก็จะได้หน้าตาประมาณนี้

2. สร้าง Virtualenv และติดตั้งแพ็กเกจที่จำเป็นสำหรับรัน Ansible

virtualenv ~/env/kubespray
source ~/env/kubespray/bin/activate
pip install -r requirements.txt

3. แก้ไข ansible inventory

# Copy ``inventory/sample`` as ``inventory/mycluster``
cp -rfp inventory/sample inventory/mycluster
# Update Ansible inventory file with inventory builder
declare -a IPS=(192.168.0.101 192.168.0.102 192.168.0.103)
CONFIG_FILE=inventory/mycluster/hosts.yml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

ในไฟล์ inventory/mycluster/hosts.yml จะมีหน้าตาประมาณนี้ สามารถแก้ไขได้ตามต้องการเลยครับ

# inventory/mycluster/hosts.yml
all:
hosts:
node1:
ansible_host: 192.168.0.101
ip: 192.168.0.101
access_ip: 192.168.0.101
node2:
ansible_host: 192.168.0.102
ip: 192.168.0.102
access_ip: 192.168.0.102
node3:
ansible_host: 192.168.0.103
ip: 192.168.0.103
access_ip: 192.168.0.103
children:
kube-master:
hosts:
node1:
node2:
kube-node:
hosts:
node1:
node2:
node3:
etcd:
hosts:
node1:
node2:
node3:
k8s-cluster:
children:
kube-master:
kube-node:
calico-rr:
hosts: {}

4. แก้ไข data variable ต่าง ๆ

# Review and change parameters under ``inventory/mycluster/group_vars``
cat inventory/mycluster/group_vars/all/all.yml
cat inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml

ในส่วนของ CoreOS จำเป็นต้องแก้ตามนี้ครับ

# inventory/mycluster/group_vars/all/all.yml
bin_dir: /opt/bin
upstream_dns_servers:
- 8.8.8.8
- 8.8.4.4

และ

# inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml
resolvconf_mode: host_resolvconf
kubeconfig_localhost: true

5. พิมพ์คำสั่งติดตั้งแล้วรอลุ้น

ansible-playbook -i inventory/mycluster/hosts.yml --become --become-user=root --user test cluster.yml

ระหว่างนี้ก็นั่งภาวนาอ้อนวอนสิ่งศักดิ์สิทธิ์ไม่ให้เจอปัญหาอะไรระหว่างทางหรือไม่ก็ไปหาอะไรกินรองท้องเลยครับ เพราะถ้าท่านทำตามวิธีของผมทั้งหมดก็ไม่น่าเจอเออเร่ออะไร เพราะผมแก้หมดแล้ว 5555 พังไปหลายรอบเลย

หน้าตาตอนมันติดตั้งเสร็จ

6. ทดสอบใช้งาน

เมื่อติดตั้งเสร็จแรียบร้อยแล้วเราจะได้ไฟล์คอนฟิกอยู่ที่

inventory/mycluster/artifacts/admin.conf

คัดลอกไฟล์คอนฟิกเพื่อทดสอบ

cp inventory/mycluster/artifacts/admin.conf ~/.kube/config
kubectl get nodes
ใช้เวลาเขียนบล็อกข้ามวันเลยขึ้น 18h

7. ติดตั้ง Helm

ขึ้นแรกก็ลง Helm ก่อนเลย

export HELM_INSTALL_DIR=/opt/bin
curl -L https://git.io/get_helm.sh | bash

จากนั้นก็สร้าง account tiller ขึ้นมา

helm initkubectl create serviceaccount --namespace kube-system tillerkubectl create clusterrolebinding tiller-cluster-rule \
--clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy \
-p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

จริง ๆ แล้วราสามารถเปิด helm ได้ตั้งแต่ตอนคอนฟิกใน inventory เลย แต่ผมไม่ได้เปิดไว้ ถ้าใครต้องการเปิดก็ตามนี้ครับ

# inventory/mycluster/group_vars/k8s-cluster/addons.yml
helm_enabled: true

เท่านี้ก็เสร็จเรียบร้อยยยย

--

--