26. 1.2 การทำงานร่วมกัน
DevOps ทำให้บทบาทที่เคยแยกกัน ได้แก่ การพัฒนา การดำเนินการ IT วิศวกรรมคุณภาพ และ
ความปลอดภัย สามารถประสานงานและทำงานร่วมกันเพื่อผลิตผลิตภัณฑ์ที่ดีและเชื่อถือได้มากขึ้น
Dev Team Op Team
DevOps Team
Babel Coder
Babel Coder
https://www.babelcoder.com
31. Monitoring and Logging
IaC
Babel Coder
3. คำศัพท์ DEVOPS ที่ควรทราบ
Code
push
Github
Test
Build
Register Image
Deploy
CI
CI
CI
CD
CD
CD
CaC
Babel Coder
https://www.babelcoder.com
58. 3. API GATEWAY คืออะไร
Order Stock Payment
POST <ORDER_IP>/orders
Babel Coder
Babel Coder
https://www.babelcoder.com
59. Order Stock Payment
3. API GATEWAY คืออะไร
POST <GATEWAY_IP>/orders
POST /orders
A
P
I
G
a
t
e
w
a
y
Babel Coder
Babel Coder
https://www.babelcoder.com
68. 5.2 ORCHESTRATION-BASED SAGA
Orchestrator
Order
Stock
Payment
T1: Order requested
Saga
Log
ORDER_REQUESTED
1.
T3: Check status requested
3. CHECK_STOCK_REQUESTED
2. ORDER_CREATED
4. STOCK_RESERVED
6. PAYMENT_APPROVED
T5: Payment requested
5. PAYMENT_REQUESTED
T6: Payment approved
7. O
RD
ER_
RESERV
ED
T2: Order created
T4: Stock reserved
T7: Order reserved
Babel Coder
Babel Coder
https://www.babelcoder.com
69. 6. COMPENSATING TRANSACTIONS
Orchestrator
Order
Stock
Payment
T1: Order requested
Saga
Log
ORDER_REQUESTED
1.
T3: Check status requested
3. CHECK_STOCK_REQUESTED
2. ORDER_CREATED
4. STOCK_REJECTED
C3: -
C2: -
T2: Order created
T4: Stock rejected
C1: Order cancelled
5
.
O
R
D
E
R
_
C
A
N
C
E
L
L
E
D
Babel Coder
Babel Coder
https://www.babelcoder.com
C4: -
74. 1. ปัญหาของเทคโนโลยี VIRTUALIZATION
Host OS
Docker Engine
Service A
C 1 C 2
Service B
C 2
Service B
C 2
Service B
Babel Coder
Babel Coder
https://www.babelcoder.com
96. 1. API GATEWAY
API Gateway เป็นอินเตอร์เฟซที่จัดการกับ Request ต่าง ๆ ที่หลากหลาย ก่อนจะทำการส่งต่อไปยังเซอร์วิสที่อยู่ภายใน
API Gateway มีหน้าที่ดังนี้:
Filter: กรอง traffic หรือ request ที่เข้ามาจากทั้ง web, mobile, web service และอื่น ๆ โดยแก้ปัญหาได้หลายหลาก เช่น
การมีหลาย Entry point (URL) ของแต่ละเซอร์วิส ทำให้ยากต่อการจดจำและเข้าถึง และปัญหาด้านความปลอดภัย เป็นต้น
Single Entry Point: เปิดเผย Endpoint ของ APIs ต่าง ๆ โดยเปิดเผยเพียงแค่ endpoint เดียว แล้วให้ request ที่เข้ามา
ถูกพิจารณาส่วนของ Path ก่อน เช่น เมื่อพาธเป็น /articles ให้วิ่งต่อไปยังเซอร์วิสคือ Article ส่วนนี้จึงกล่าวได้ว่า API
Gateway ทำหน้าที่ Routing
API Management: การจัดการกับ API ต่าง ๆ ที่จะถูกส่งต่อไป เช่น rate limit เป็นต้น
Security mechanism: กลไกของเรื่องความปลอดภัย ไม่ว่าจะเป็นการเข้าถึงบางเซอร์วิสที่ต้องผ่านการลอคอินก่อน หรือการ
ทำ logging เป็นต้น
Babel Coder
Babel Coder
https://www.babelcoder.com
97. 2. KONG API GATEWAY
ซอฟต์แวร์ API Gateway ที่นิยมในปัจจุบันมีหลายตัวในที่นี้จะนำเสนอ Kong API Gateway
Kong API Gateway เป็นระบบ API Gateway แบบ Opensource ที่คอยบริหารจัดการ API ทั้งส่วนของการทำ Routing และ
Monitoring นอกจากนี้ยังรองรับ Plugin ต่าง ๆ ที่เกี่ยวข้องในการจัดการ API อีกด้วย วิธีการตั้งค่า Kong มีด้วยกันหลายวิธี
สำหรับบทเรียนนี้จะนำเสนอรูปแบบการตั้งค่าผ่านไฟล์ kong.yml โดยสร้าง Endpoint เดียวเมื่อมี Request ส่งเข้ามาจะส่งการ
ทำงานต่อเนื่องไปยังเซอร์วิสปลายทางโดยพิจารณาจากพาธ ดังนี้
/: ให้ส่ง Request ต่อไปยังเซอร์วิส site
/api: ให้ส่ง Request ต่อไปยังเซอร์วิส api
Babel Coder
Babel Coder
https://www.babelcoder.com
101. DIGITAL OCEAN
Babel Coder
Babel Coder
https://www.babelcoder.com
$ ssh-keygen
เมื่อ Droplets มีลักษณะเป็นเซิฟเวอร์ เราจึงสามารถเข้าถึงเซิฟเวอร์นี้ได้ด้วย 2 วิธี คือการใช้ SSH และการใช้รหัสผ่าน ในที่นี้จะ
นำเสนอการเข้าถึงเซิฟเวอร์ด้วย SSH โดยเริ่มต้นจากการสร้าง SSH Keys ก่อนผ่านคำสั่งดังนี้ เมื่อ nthongjor คือชื่อของผู้ใช้
งานปัจจุบันบนเครื่อง
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nthongjor/.ssh/id_rsa): /home/nthongjor/.ssh/do_terraform
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/nthongjor/.ssh/do_terraform
Your public key has been saved in /home/nthongjor/.ssh/do_terraform.pub
The key fingerprint is:
SHA256:U1q3moz32e2ElwXZ7iI+d5qX6UxJlgJlN33Hkp09dIw nthongjor@LAPTOP-HEF902DE
The key's randomart image is:
+---[RSA 3072]----+
| o.X=|
| o E=@|
| o.. o.=|
|
102. DIGITAL OCEAN
Babel Coder
Babel Coder
https://www.babelcoder.com
$ cat /home/nthongjor/.ssh/do_terraform.pub
จากนั้นให้ทำการแสดง Public Key ดังกล่าวผ่านคำสั่ง cat แล้วจึงทำการคัดลอกค่าดังกล่าวไว้
ssh-rsa xxxxxxxxxxxxxxxxxxxx
116. Babel Coder
Babel Coder
https://www.babelcoder.com
DIGITAL OCEAN
$ ssh -i ~/.ssh/do_terraform root@206.189.43.202
ลำดับถัดไปเราจะทำการทดสอบว่า Droplet ของเราสามารถใช้งานได้จริงและมี Docker ติดตั้งอยู่ภายในเซิฟ
เวอร์ ให้ทำการคัดลอก IP ของ Droplet แล้วจึงออกคำสั่งดังต่อไปนี้
The authenticity of host '206.189.43.202 (206.189.43.202)' can't be established.
ED25519 key fingerprint is SHA256:C+HytWBXrD957ZKo4QGvYhcKRBn/kTm6gQm4eOxTJOg.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '206.189.43.202' (ED25519) to the list of known hosts.
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-94-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
System information as of Wed Mar 27 11:45:50 UTC 2024
124. การสร้างไฟล์ตั้งค่า DROPLETS
Babel Coder
Babel Coder
https://www.babelcoder.com
กรณีของ Digital Ocean การใช้งาน Terraform มีผลลัพธ์ให้เกิดการเรียกใช้ API โดยส่งไปยัง Digital Ocean เพื่อ
ทำการสร้างทรัพยากรตามที่ระบุ การเข้าถึง API ของ Digital Ocean นั้นต้องแนบ Personal Access Token (PAT) ไป
ด้วย เพื่อให้ Digital Ocean ทราบว่าเราผู้กระทำการเรียกใช้ API นั้นคือใคร
136. TERRAFORM PLAN
$ terraform plan
Babel Coder
Babel Coder
https://www.babelcoder.com
Terraform will perform the following actions:
# digitalocean_droplet.my-node will be created
+ resource "digitalocean_droplet" "my-node" {
+ backups = false
+ created_at = (known after apply)
+ disk = (known after apply)
+ graceful_shutdown = false
+ id = (known after apply)
+ image = "docker-20-04"
+ ipv4_address = (known after apply)
+ ipv4_address_private = (known after apply)
+ ipv6 = false
+ ipv6_address = (known after apply)
+ locked = (known after apply)
....
137. Babel Coder
Babel Coder
https://www.babelcoder.com
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# digitalocean_droplet.my-node will be created
+ resource "digitalocean_droplet" "my-node" {
+ backups = false
+ created_at = (known after apply)
+ disk = (known after apply)
+ graceful_shutdown = false
+ id = (known after apply)
+ image = "docker-20-04"
+ ipv4_address = (known after apply)
TERRAFORM APPLY
$ terraform apply
138. Babel Coder
Babel Coder
https://www.babelcoder.com
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:
# digitalocean_droplet.my-node will be destroyed
- resource "digitalocean_droplet" "my-node" {
- backups = false -> null
- created_at = "2024-04-18T11:43:43Z" -> null
TERRAFORM DESTROY
$ terraform destroy
159. 2. PODS
$ kubectl run site --image=babelcoder/intro-to-devops-ui:1.0
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
site 1/1 Running 0 2m1s
$ kubectl port-forward site 5151:80
Forwarding from 127.0.0.1:5151 -> 80
Forwarding from [::1]:5151 -> 80
Babel Coder
Babel Coder
https://www.babelcoder.com
160. 2. PODS
$ kubectl port-forward site 5151:80
Forwarding from 127.0.0.1:5151 -> 80
Forwarding from [::1]:5151 -> 80
kubectl
5151 kube API
server
Pod
443 80
localhost Kubernetes Cluster
Babel Coder
Babel Coder
https://www.babelcoder.com
161. 2. PODS
$ kubectl delete pod site
pod "site" deleted
Babel Coder
Babel Coder
https://www.babelcoder.com
166. Target Pod
Target Pod Target Pod Source Pod
Cluster IP
5. SERVICES - CLUSTER IP
Kubernetes Cluster
Node Node
Internal
Communication
(api)
(db)
(db)
(db)
service.yaml
Babel Coder
Babel Coder
https://www.babelcoder.com
167. 5. SERVICES - CLUSTER IP
Kubernetes Cluster
Target Pod
Target Pod Target Pod Source Pod
Cluster IP
Node Node
Internal
Communication
(api)
(db)
(db)
(db)
$ $ kubectl apply -f service.yaml
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
db ClusterIP 10.102.134.43 <none> 6379/TCP 3s
$ kubectl describe svc db
TargetPort: 6379/TCP
Endpoints: 10.1.0.26:6379,10.1.0.30:6379,10.1.0.32:6379
$ kubectl run busybox --rm --restart Never -it --
image=busybox
/ # telnet db 6379
Connected to db
Babel Coder
Babel Coder
https://www.babelcoder.com
168. Target Pod
Target Pod Target Pod
Cluster IP
Node Port - 32074 Node Port - 32074
5. SERVICES - NODEPORT
Kubernetes Cluster
(api)
(api)
(api)
service.yaml
Babel Coder
Babel Coder
https://www.babelcoder.com
169. 5. SERVICES - NODEPORT
Target Pod
Target Pod Target Pod
Cluster IP
Node Port - 32074 Node Port - 32074
Babel Coder
Babel Coder
https://www.babelcoder.com
Kubernetes Cluster
(api)
(api)
(api)
$ kubectl apply -f service.yaml
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
api NodePort 10.100.61.121 <none> 5152:32074/TCP 14m
$ kubectl describe svc api
Port: <unset> 5152/TCP
TargetPort: 3000/TCP
NodePort: <unset> 32074/TCP
Endpoints: 10.1.0.27:3000,10.1.0.28:3000,10.1.0.34:3000
$ curl localhost:32074
เข้าถึงด้วย IP ของ Node กรณีของการใช้ Kubernetes บน Docker
จะมีเพียง 1 Node และสามารถเข้าถึง Node นั้นได้ผ่าน localhost
170. Target Pod
Target Pod Target Pod
Cluster IP
Node Port - 32074 Node Port - 32074
5. SERVICES - LOADBALANCER
Load Balancer
Kubernetes Cluster
(site)
(site)
(site)
service.yaml
Babel Coder
Babel Coder
https://www.babelcoder.com
171. Target Pod
Target Pod Target Pod
Cluster IP
Node Port - 30575 Node Port - 30575
5. SERVICES - LOADBALANCER
Load Balancer
Kubernetes Cluster
(site)
(site)
(site)
$ kubectl apply -f service.yaml
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
site LoadBalancer 10.96.239.241 localhost 5151:30575/TCP 34m
$ kubectl describe svc site
Port: <unset> 5151/TCP
TargetPort: 80/TCP
NodePort: <unset> 30575/TCP
Endpoints: 10.1.0.29:80,10.1.0.31:80,10.1.0.33:80
Session Affinity: None
External Traffic Policy: Cluster
$ curl localhost:5151
Babel Coder
Babel Coder
https://www.babelcoder.com
เข้าถึงด้วย IP ของ Cluster กรณีของการใช้ Kubernetes บน Docker
จะมีเพียง 1 Node และสามารถเข้าถึง Cluster ผ่าน Node นั้นได้ผ่าน localhost
181. Babel Coder
Babel Coder
https://www.babelcoder.com
2. การเรียกใช้งาน HPA
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
api Deployment/api 1%/20% 1 5 1 17m
ส่วนนี้จะพบกับคอลัมภ์ชื่อ TARGETS แสดงผลเป็น 1%/20% ที่มีความ
หมายว่ามีการตั้งค่า Metrics ไว้ที่ 20% แต่ปัจจุบันการใช้งาน CPU
เฉลี่ยนอยู่ที่ 1%
Pod
1%
CPU
182. Babel Coder
Babel Coder
https://www.babelcoder.com
3. ทดลองเพิ่มและลดโหลดของ API
$ kubectl run -i --tty load-generator --rm --image=busybox:1.28 --
restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O-
http://localhost:5152/articles; done"
Pod
1%
CPU
เราจะทำการเพิ่มโหลดเพื่อดูการทำงานของ HPA ว่าจะมีการเพิ่มจำนวน Pods เมื่อ CPU เฉลี่ยนเกิน 20% หรือ
ไม่ โดยออกคำสั่งสำหรับการเรียกใช้งาน API อย่างต่อเนื่อง ดังนี้
$ kubectl get hpa api --watch
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
api Deployment/api 1%/20% 1 5 1 3s
183. Babel Coder
Babel Coder
https://www.babelcoder.com
3. ทดลองเพิ่มและลดโหลดของ API
$ kubectl get deploy api -w
Pod
31%
CPU
เมื่อ CPU เฉลี่ยใช้งานถึง 31% เมื่อนั้น HPA จะทำการเพิ่มจำนวน Pod เป็น 2 ตัว
NAME READY UP-TO-DATE AVAILABLE AGE
api 2/2 2 2 6d5h
Pod
184. Babel Coder
Babel Coder
https://www.babelcoder.com
31%
3. ทดลองเพิ่มและลดโหลดของ API
$ kubectl get deploy api -w
Pod
CPU
หยุดการทำงานของคำสั่งในการร้องขอข้อมูลจาก API ลง เพื่อให้การใช้งาน CPU เฉลี่ยลดลง
ทำการสังเกตการใช้งาน CPU เมื่อเวลาผ่านไประยะหนึ่งจะพบผลลัพธ์ดังนี้
NAME READY UP-TO-DATE AVAILABLE AGE
api 1/1 1 1 6d5h
Pod