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: -
71. App A
glibc 2.39
App B
glibc 1.2
1. ปัญหาของเทคโนโลยี VIRTUALIZATION
Babel Coder
Babel Coder
https://www.babelcoder.com
72. 1. ปัญหาของเทคโนโลยี VIRTUALIZATION
Host OS
Guest OS Guest OS
App A
glibc 2.39
App B
glibc 1.2
VM 1 VM 2
Babel Coder
Babel Coder
https://www.babelcoder.com
73. 1. ปัญหาของเทคโนโลยี VIRTUALIZATION
Host OS
App A
glibc 2.39
App B
glibc 1.2
C 1 C 2
Docker Engine
Babel Coder
Babel Coder
https://www.babelcoder.com
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
83. 5. การสร้าง DOCKER IMAGES
./api
$
$
CGO_ENABLED=0 go build -o api
Babel Coder
https://www.babelcoder.com
$ # install Go compiler
$ go mod download
84. 5. การสร้าง DOCKER IMAGES
./api
$
$
CGO_ENABLED=0 go build -o api
Babel Coder
Babel Coder
https://www.babelcoder.com
มี Go Compiler ใน Image นี้
Dockerfile
$ # install Go compiler
$ go mod download
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 [email protected]
ลำดับถัดไปเราจะทำการทดสอบว่า 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
145. CI / CD
Babel Coder
Babel Coder
https://www.babelcoder.com
146. Babel Coder
CI / CD
CI/CD ย่อมาจาก Continuous Integration และ Continuous Delivery/Deployment เป็นกลุ่มของ
หลักการปฏิบัติในการกระบวนการพัฒนาและส่งมอบซอฟต์แวร์อย่างอัะตโนมัติ
Continuous Integration (CI) เป็นหลักปฏิบัติที่ทำให้สามารถเปลี่ยนแปลงซอร์จโค้ดได้บ่อยตาม
ต้องการ เนื่องจากรวมหลักปฏิบัติที่ดีแบบอัตโนมัติไว้ในขั้นตอนของ CI เช่น การทดสอบซอฟต์แวร์แบบ
อัตโนมัติ เป็นต้น ขั้นตอนดังกล่าวจึงช่วยให้การเปลี่ยนแปลงซอร์จโค้ดผ่านการ Merged Code เกิดขึ้นได้
บ่อยเท่าที่ต้องการ โดยลดความเป็นกังวลด้านความน่าเชื่อถือของซอฟต์แวร์ลงด้วยการทดสอบแบบ
อัตโนมัตินั่นเอง
Continuous Delivery/Deployment (CD) เป็นขั้นตอนที่กล่าวถึงการรวมความเปลี่ยนแปลงของ
โค้ดเข้ากับการทดสอบแล้วจึงทำการส่งมอบโค้ดที่เปลี่ยนแปลงนั้นออกเป็นแอปพลิเคชันต่อไป
Continuous Delivery นั้นจะเป็นขั้นตอนที่รวมถึงการ built การทดสอบแบบอัตโนมัติ และการเตรียม
ความพร้อมสำหรับการ Deploy สู่ Production โดยการนำส่งสู่ Production นี้ขึ้นอยู่กับการตัดสินใจซึ่ง
อาจจะอยู่ในรูปแบบของการ Manual Deploy ในขณะที่ Continuous Deployment จะเป็นขั้นตอนแบบ
อัตโนมัติทั้งหมดที่โค้ดทุกส่วนที่เปลี่ยนแปลงและได้รับการทดสอบแบบอัตโนมัติแล้วจะถูกนำส่งสู่
Production โดยอัตโนมัติ
Babel Coder
https://www.babelcoder.com
147. Babel Coder
CI / CD
Code
push
Github
Test
Build
Register Image
Deploy
CI
CI
CI
CD
CD
CD
Babel Coder
https://www.babelcoder.com
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
162. /usr/share/nginx/html
index.html
3. MULTI-CONTAINER DESIGN PATTERNS
site
init
Init Containers
api
ambassador
Ambassador Pattern
localhost:6379
redis pod
redis
redis:6379
Babel Coder
Babel Coder
https://www.babelcoder.com
163. 3. MULTI-CONTAINER DESIGN PATTERNS
site
log
Sidecar Pattern
api redis pod
Volume
log transformer
Volume
site
Adapter Pattern
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
177. HORIZONTAL POD AUTOSCALER
Babel Coder
Babel Coder
https://www.babelcoder.com
Pod
31%
CPU
Metrics: CPU > 50%
Pod
61%
CPU
Pod