Deploy K8S บน Cent OS 7 ตั้งเเต่ Zero ถึง Hero !! (ตอนที่ 1)

Pao Payungsak Klinchampa
Next-Hop Co., Ltd.
Published in
4 min readAug 5, 2019
Ref: https://mapr.com/products/kubernetes/

เข้าเรื่องเลยครับ เนื่องจากจู่ๆ อยากลอง Deploy K8S ใช้ขึ้นมา ผมก็ไม่รอช้า มานั่งหน้าคอม เปิด VMware ESXi เเล้วกดสร้าง VM ทันที

เนื่องจาก Server ที่ใช้ไม่ได้เเรงอะไรเวอร์วังมาก เเค่พอให้รันเทสๆได้เฉยๆ ผมเลยกำหนด Spec ประมาณนี้

vCPU : 2 Core

RAM : 3000 MB

HDD: 50GB

ISO : Cent OS 7 minimal

โดยผมใช้ Spec นี้ Deploy ทั้ง 2 เครื่องนะครับ ทั้งตัวที่เป็น Master Node ที่คอยจัดการต่างๆนาๆ เเละอีกเครื่องเป็น Worker Node ที่เวลา Deploy พวก Pods ต่างๆจะมา run อยู่บนเครื่องนี้

k8s-master vm in ESXi.

ก็ติดตั้ง Cent OS 7 ไปตามปกติครับ โดยที่

เครื่องเเรก

IP : 10.10.200.105/24

hostname : k8s-master

เครื่องที่ 2

IP : 10.10.200.106/24

hostname : k8s-master

กำหนด IP Address , DNS ตาม Network ของท่านเลยครับ แล้วก็ตั้ง Password ของ Root เเละสร้าง User ขึ้นมาด้วย และกำหนดสิทธ์ให้เป็น admin

เมื่อทั้งสองเครื่องติดตั้งเสร็จ ก็กดปุ่ม Reboot ได้เลย

แต่นี้ก็เสร็จสิ้นขั้นตอนเเรกเเล้ว ในการเตรียมเครื่องเพื่อติดตั้ง k8s

ขั้นตอนต่อมาคือขั้นตอนของการจัดเตรียม / ติดตั้ง k8s ครับ โดยให้ทำเหมือนกันทั้งสองเครื่อง ซึ่งมีขั้นตอนดังต่อไปนี้

  1. sudo -i เพื่อยกระดับสิทธ์เป็น root
  2. ตั้งค่า /etc/hosts โดยให้ตั้งค่าแบบนี้

10.10.200.105 k8s-master

10.10.200.106 k8s-node1

โดยให้เปลี่ยน IP / hostname ตามเครื่องของท่านได้เลยครับ จะใช้ vim / nano ก็เเล้วแต่ความถนัดเลย อย่าลืมเซฟด้วย

/etc/hosts file

3.ปิดการทำงานของ SELinux ด้วยคำสั่ง setenforce 0 และ sed -i — follow-symlinks ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/sysconfig/selinux

4.เปิดการใช้ br_netfilter & overlay Kernel Module ด้วยคำสั่ง

# modprobe br_netfilter

# modprobe overlay
# echo ‘1’ > /proc/sys/net/bridge/bridge-nf-call-iptables

5.ปิดการใช้งาน swap ด้วยคำสั่ง swapoff -a และเข้าไปแก้ไข file /etc/fstab ด้วยเพื่อปิด swap ถาวร เวลา Reboot มันจะได้ไม่กลับมาเปิดอีก โดยมองหาบันทัดที่มีคำว่า swap ตัวอย่างเช่น

#/dev/mapper/centos-swap swap swap defaults 0 0

โดยให้ comment บันทัดนี้ ซึ่งจะอยู่บันทัดล่างสุด ถ้ายังไม่ไปแก้อะไรหรือทำอะไรอย่างอื่นนะครับ

6.จัดการเรื่อง firewall ครับ โดยให้ใช้คำสั่งต่อไปนี้

firewall-cmd — permanent — add-port=80/tcp
firewall-cmd — permanent — add-port=443/tcp
firewall-cmd — permanent — add-port=6443/tcp
firewall-cmd — permanent — add-port=2379–2380/tcp
firewall-cmd — permanent — add-port=10250/tcp
firewall-cmd — permanent — add-port=10251/tcp
firewall-cmd — permanent — add-port=10252/tcp
firewall-cmd — permanent — add-port=10255/tcp
firewall-cmd — permanent — add-port=8472/udp
firewall-cmd — permanent — add-port=8001/tcp
firewall-cmd — permanent — add-port=9090/tcp
firewall-cmd — permanent — add-port=30000–32767/tcp
firewall-cmd — add-masquerade — permanent
firewall-cmd — reload

ส่วนถ้าจะใช้ Port อื่นๆเพิ่ม ก็มาเปิดเพิ่มทีหลังได้ เเล้วสั่ง reload ด้วย

7.ติดตั้ง Package ที่จำเป็น ด้วยคำสั่ง

# yum install -y yum-utils device-mapper-persistent-data lvm2

8. เพิ่ม Docker Repo และติดตั้ง Docker-CE

# yum-config-manager — add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install -y docker-ce

9.ทำการแก้ไข Docker deamon file ที่ /etc/docker/daemon.json

หากยังไม่มีก็สร้าง file นี้ขึ้นมาใหม่ โดยกำหนดค่าดังนี้

{

“exec-opts”: [“native.cgroupdriver=systemd”],

“log-driver”: “json-file”,

“log-opts”: {

“max-size”: “100m”

},

“storage-driver”: “overlay2”

}

จัดการ save file ให้เรียบร้อย เเละสั่ง

# systemctl daemon-reload

# systemctl start docker && systemctl enable docker

เสร็จสิ้นการเตรียม Environment ก่อนการติดตั้ง k8s เเล้วครับ ต่อไปก็ติดตั้ง k8s กันต่อเลย

10. เพิ่ม k8s repo ด้วยคำสั่ง

# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

และตามด้วย # yum install -y kubelet kubeadm kubectl เพื่อติดตั้ง k8s ครับ

เมื่อติดตั้งเสร็จก็ # systemctl start kubelet && systemctl enable kubelet เพื่อ reload k8s เเละสั่ง enable เพื่อให้มัน run service ขึ้นมาเองเวลาเรา reboot เครื่อง

11. reboot เครื่อง ซักรอบ เมื่อเครื่องติดขึ้นมาก็ login เเละเข้าใช้งานเป็น root

จากนี้จะเป็นส่วนของ k8s-master นะครับ ที่ k8s-node1 ไม่ต้องทำ 555

  • **** k8s-master *****

สั่งสร้าง k8s cluster ด้วยคำสั่ง

# kubeadm init — apiserver-advertise-address=10.10.200.105 — pod-network-cidr=10.244.0.0/16

รอๆๆ เเล้วก็รอ ไปห้องน้ำหรือหาอะไรทานก่อนก็ดีนะครับ เส้นทางของเรายังยาวไกล 5555

และเมื่อเสร็จสิ้น มันก็จะให้เรารันคำสั่งอีก 3 คำสั่ง ก็ copy and paste engineering ได้เลย ไม่ต้องคิดมากก ฮ้าๆๆๆๆๆ :D

# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config

และมันจะให้คำสั่งเพื่อให้เราเอาไป run ที่ k8s-node อื่นๆ ในที่นี้ก็คือ k8s-node1 นะครับ ก็จัดการ copy and paste engineering เอาไปไว้ใน Text Editor ซักตัวก่อนก็ได้

คำสั่งนี้ ก็จะหน้าตาประมาณนี้ครับ

kubeadm join 10.10.200.105:6443 — token vzau5v.xxxx — discovery-token-ca-cert-hash sha256:xxxxxxxyyyyyy

ต่อไปก็ให้ติดตั้งระบบ network management ด้วยคำสั่ง

# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

อันนี้ผมเลือกใช้ kube-flannel นะครับ จะตัวอื่นก็ได้ ตามความสะดวก แต่ผมเองก็ยังไม่เคยลองตัวอื่นเลยนะะ ฮาาาา

และทำการตั้งค่า sysctl อีกหน่อย ด้วยคำสั่ง

# cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

เเละ

# sysct — system

เสร็จสิ้นขั้นตอนการติดตั้ง k8s master mode เเล้วนะครับ ต่อไปจะเป็นขั้นตอนการติดตั้งของ k8s-node1 ต่อ โดยให้ SSH เข้ามา เเล้วสั่ง sudo -i เพื่อเป็น root เเละใช้คำสั่ง

# kubeadm join 10.10.200.105:6443 — token vzau5v.xxxx — discovery-token-ca-cert-hash sha256:xxxxxxxyyyyyy

เพื่อทำการตั้งค่าให้ k8s-node1 ไป join เข้ากับ k8s-master ครับผม อธิบายง่ายๆก็เป็นการตั้งค่าให้ตัวลูก ไปเชื่อมต่อเข้ากับตัวเเม่มันอะไรประมาณนี้ :D

ก็รอมัน Join ซักครู่ พอเสร็จก็ปิด SSH Session นี้ไปได้เลย เเล้วกลับมาที่ k8s-master node ของเรากันต่อนะครับ

Run คำสั่ง # kubectl get nodes เพื่อตรวจสอบการทำงาน ถ้าขึ้นสถานะ Ready ทั้ง 2 Node ก็พร้อมทำงานเเล้วครับผม

k8s-master node

จบกันเเล้วสำหรับตอนเเรก เดี๋ยวมาต่อตอนที่ 2 กันนะครับ ตอนต่อไป ผมจะพูดเรื่องการสร้าง Web App ด้วย create-react-app อย่างง่าย และจับมันมา build เป็น Docker Image พร้อมกับการสร้าง Docker Repo ส่วนตัวเอาไว้ใช้เอง.

ผิดพลาดประการใด หรือมีอะไรเพิ่มเติม ก็ติกต่อกันมาได้นะครับ

สำหรับวันนี้ ขอบคุณเเละสวัสดีครับ

ตอนที่ 2 :

Ref :

Payungsak Klinchampa

Network/System Engineer , DevOps , Blogger.

--

--