程式狂想筆記

一個攻城師奮鬥史

0%

Kubernetes 的 ReplicaSet

我目前看書上是舊版範例
所以使用官方ReplicaSet | Kubernetes範例
目前推薦 [Kubernetes] ReplicaSet 介紹 | 小信豬的原始部落
這邊只是會放操作紀錄,不會很專業解說

前言

一般建立 pod 完可以在建立 service
我以為 ReplicaSet 也是差不多樣子
但實作完才發現不一樣…
建立 ReplicaSet 就會建立 Pod

建立有 template 的 ReplicaSet

fronted.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
# modify replicas according to your case
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 建立 fronted ReplicaSet
kubectl apply -f https://kubernetes.io/examples/controllers/frontend.yaml
# replicaset.apps/frontend created
# 查看狀況
kubectl get rs
# NAME DESIRED CURRENT READY AGE
# frontend 3 3 3 25s
kubectl describle rs/fronted
# Name: frontend
# Namespace: default
# Selector: tier=frontend
# Labels: app=guestbook
# tier=frontend
# Annotations: <none>
# Replicas: 3 current / 3 desired
# Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
# Pod Template:
# Labels: tier=frontend
# Containers:
# php-redis:
# Image: gcr.io/google_samples/gb-frontend:v3
# Port: <none>
# Host Port: <none>
# Environment: <none>
# Mounts: <none>
# Volumes: <none>
# Events:
# Type Reason Age From Message
# ---- ------ ---- ---- -------
# Normal SuccessfulCreate 53s replicaset-controller Created pod: frontend-bfdqg
# Normal SuccessfulCreate 53s replicaset-controller Created pod: frontend-7rlhd
# Normal SuccessfulCreate 53s replicaset-controller Created pod: frontend-p54kd
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# frontend-b2zdv 1/1 Running 0 6m36s
# frontend-vcmts 1/1 Running 0 6m36s
# frontend-wtsmm 1/1 Running 0 6m36s
1
kubectl get pods frontend-b2zdv -o yaml

查看 meta.ownerReferences
這邊先跳過
详解 Kubernetes ReplicaSet 的实现原理 - 面向信仰编程

無 template 建立

pod-rs.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: v1
kind: Pod
metadata:
name: pod1
labels:
tier: frontend
spec:
containers:
- name: hello1
image: gcr.io/google-samples/hello-app:2.0

---

apiVersion: v1
kind: Pod
metadata:
name: pod2
labels:
tier: frontend
spec:
containers:
- name: hello2
image: gcr.io/google-samples/hello-app:1.0
1
2
3
4
5
6
7
8
kubectl apply -f https://kubernetes.io/examples/pods/pod-rs.yaml
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# frontend-7rlhd 1/1 Running 0 10m
# frontend-bfdqg 1/1 Running 0 10m
# frontend-p54kd 1/1 Running 0 10m
# pod1 0/1 Terminating 0 5s
# pod2 0/1 Terminating 0 5s

這邊會看到,我們建立的 pod 沒有變建立起來
原因是 ReplicaSet 設定為三,已經建立過了(label 相同)

如果清空,先建立兩個 pod 再 新增 rs
會友不一樣的結果

1
2
3
4
NAME             READY   STATUS    RESTARTS   AGE
frontend-hmmj2 1/1 Running 0 9s
pod1 1/1 Running 0 36s
pod2 1/1 Running 0 36s

擴展 ReplicaSet

指令

1
kubectl scale replicasets fronted --replicas=4

指令操作可以直接套用
但大多數不推薦這個方式
假如 yaml 重建不會用到
大多數都從文件調整

kubectl apply 套用

1
kubectl apply -f xxx.yaml

自動擴展

1
2
3
4
5
6
7
8
9
10
11
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: frontend-scaler
spec:
scaleTargetRef:
kind: ReplicaSet
name: frontend
minReplicas: 3
maxReplicas: 10
targetCPUUtilizationPercentage: 50
1
kubectl apply -f https://k8s.io/examples/controllers/hpa-rs.yaml

或只打指令kubectl autoscale rs frontend --max=10 --min=3 --cpu-percent=50

看完這麼多,官方推薦使用 Deployment 來替代 ReplicaSet
這單元簡單操作並不難

刪除 ReplicaSet 不刪除 pod

刪除 ReplicaSet 會一起刪除 pod
要刪除 ReplicaSet 不刪除 pod 情況下要使用

1
2
3
4
5
# 書上這樣寫,但好像廢棄了
kubectl delete rs fronted --cascade=false
# warning: --cascade=false is deprecated (boolean value) and can be replaced with --cascade=orphan.
kubectl delete rs frontend --cascade=orphan
# 也能正常運作

StatefulSet介绍 - taotaozh - 博客园
不知道跟這個有沒有關係
暫時不研究

小記重點

  1. 確保在任何時間點會有幾個副本。
  2. 相同Pod都是可用的,取決你設定的數字。
  3. 透過 selector 綁定在一起

觀察指令

1
2
3
kubectl describe rs
kubectl get pods
# Controller By 可以觀察是誰操控 Pod