W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
本教程向你展示如何使用 Kubernetes 和 Docker 構(gòu)建和部署一個(gè)簡(jiǎn)單的 (非面向生產(chǎn)的) 多層 web 應(yīng)用程序。本例由以下組件組成:
你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:
您的 Kubernetes 服務(wù)器版本必須不低于版本 v1.14. 要獲知版本信息,請(qǐng)輸入 ?kubectl version
?。
留言板應(yīng)用程序使用 Redis 存儲(chǔ)數(shù)據(jù)。
下面包含的清單文件指定了一個(gè) Deployment 控制器,該控制器運(yùn)行一個(gè) Redis Pod 副本。
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-leader
labels:
app: redis
role: leader
tier: backend
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
role: leader
tier: backend
spec:
containers:
- name: leader
image: "docker.io/redis:6.0.5"
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
redis-leader-deployment.yaml
? 文件中應(yīng)用 Redis Deployment:kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-deployment.yaml
kubectl get pods
響應(yīng)應(yīng)該與此類似:
NAME READY STATUS RESTARTS AGE
redis-leader-fb76b4755-xjr2n 1/1 Running 0 13s
kubectl logs -f deployment/redis-leader
留言板應(yīng)用程序需要往 Redis 中寫數(shù)據(jù)。因此,需要?jiǎng)?chuàng)建 Service 來轉(zhuǎn)發(fā) Redis Pod 的流量。Service 定義了訪問 Pod 的策略。
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: v1
kind: Service
metadata:
name: redis-leader
labels:
app: redis
role: leader
tier: backend
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
role: leader
tier: backend
redis-leader-service.yaml
? 文件創(chuàng)建 Redis的服務(wù):kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-service.yaml
kubectl get service
響應(yīng)應(yīng)該與此類似:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 1m
redis-leader ClusterIP 10.103.78.24 <none> 6379/TCP 16s
說明: 這個(gè)清單文件創(chuàng)建了一個(gè)名為 ?
redis-leader
? 的 Service,其中包含一組 與前面定義的標(biāo)簽匹配的標(biāo)簽,因此服務(wù)將網(wǎng)絡(luò)流量路由到 Redis Pod 上。
盡管 Redis 領(lǐng)導(dǎo)者只有一個(gè) Pod,你可以通過添加若干 Redis 跟隨者來將其配置為高可用狀態(tài), 以滿足流量需求。
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-follower
labels:
app: redis
role: follower
tier: backend
spec:
replicas: 2
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
role: follower
tier: backend
spec:
containers:
- name: follower
image: gcr.io/google_samples/gb-redis-follower:v2
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
redis-follower-deployment.yaml
? 文件創(chuàng)建 Redis Deployment:kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-deployment.yaml
kubectl get pods
響應(yīng)應(yīng)該類似于這樣:
NAME READY STATUS RESTARTS AGE
redis-follower-dddfbdcc9-82sfr 1/1 Running 0 37s
redis-follower-dddfbdcc9-qrt5k 1/1 Running 0 38s
redis-leader-fb76b4755-xjr2n 1/1 Running 0 11m
Guestbook 應(yīng)用需要與 Redis 跟隨者通信以讀取數(shù)據(jù)。 為了讓 Redis 跟隨者可被發(fā)現(xiàn),你必須創(chuàng)建另一個(gè) Service。
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: v1
kind: Service
metadata:
name: redis-follower
labels:
app: redis
role: follower
tier: backend
spec:
ports:
# the port that this service should serve on
- port: 6379
selector:
app: redis
role: follower
tier: backend
redis-follower-service.yaml
? 文件中的 Redis Service:kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-service.yaml
kubectl get service
響應(yīng)應(yīng)該類似于這樣:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d19h
redis-follower ClusterIP 10.110.162.42 <none> 6379/TCP 9s
redis-leader ClusterIP 10.103.78.24 <none> 6379/TCP 6m10s
說明:
清單文件創(chuàng)建了一個(gè)名為 ?redis-follower
? 的 Service,該 Service 具有一些與之前所定義的標(biāo)簽相匹配的標(biāo)簽,因此該 Service 能夠?qū)⒕W(wǎng)絡(luò)流量 路由到 Redis Pod 之上。
現(xiàn)在你有了一個(gè)為 Guestbook 應(yīng)用配置的 Redis 存儲(chǔ)處于運(yùn)行狀態(tài), 接下來可以啟動(dòng) Guestbook 的 Web 服務(wù)器了。 與 Redis 跟隨者類似,前端也是使用 Kubernetes Deployment 來部署的。
Guestbook 應(yīng)用使用 PHP 前端。該前端被配置成與后端的 Redis 跟隨者或者 領(lǐng)導(dǎo)者服務(wù)通信,具體選擇哪個(gè)服務(wù)取決于請(qǐng)求是讀操作還是寫操作。 前端對(duì)外暴露一個(gè) JSON 接口,并提供基于 jQuery-Ajax 的用戶體驗(yàn)。
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
app: guestbook
tier: frontend
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v5
env:
- name: GET_HOSTS_FROM
value: "dns"
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 80
frontend-deployment.yaml
? 文件的前端 Deployment:kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-deployment.yaml
kubectl get pods -l app=guestbook -l tier=frontend
響應(yīng)應(yīng)該與此類似:
NAME READY STATUS RESTARTS AGE
frontend-85595f5bf9-5tqhb 1/1 Running 0 47s
frontend-85595f5bf9-qbzwm 1/1 Running 0 47s
frontend-85595f5bf9-zchwc 1/1 Running 0 47s
應(yīng)用的 ?Redis
?服務(wù)只能在 Kubernetes 集群中訪問,因?yàn)榉?wù)的默認(rèn)類型是 ?ClusterIP
?。 ?ClusterIP
?為服務(wù)指向的 Pod 集提供一個(gè) IP 地址。這個(gè) IP 地址只能在集群中訪問。
如果你希望訪客能夠訪問你的 Guestbook,你必須將前端服務(wù)配置為外部可見的, 以便客戶端可以從 Kubernetes 集群之外請(qǐng)求服務(wù)。 然而即便使用了 ?ClusterIP
?,Kubernetes 用戶仍可以通過 ?kubectl port-forward
? 訪問服務(wù)。
說明: 一些云提供商,如 Google Compute Engine 或 Google Kubernetes Engine, 支持外部負(fù)載均衡器。如果你的云提供商支持負(fù)載均衡器,并且你希望使用它, 只需取消注釋 ?
type: LoadBalancer
?。
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
# if your cluster supports it, uncomment the following to automatically create
# an external load-balanced IP for the frontend service.
# type: LoadBalancer
#type: LoadBalancer
ports:
# the port that this service should serve on
- port: 80
selector:
app: guestbook
tier: frontend
frontend-service.yaml
? 文件中的前端服務(wù):kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-service.yaml
kubectl get services
響應(yīng)應(yīng)該與此類似:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend ClusterIP 10.97.28.230 <none> 80/TCP 19s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d19h
redis-follower ClusterIP 10.110.162.42 <none> 6379/TCP 5m48s
redis-leader ClusterIP 10.103.78.24 <none> 6379/TCP 11m
kubectl port-forward svc/frontend 8080:80
響應(yīng)應(yīng)該與此類似:
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
如果你部署了 ?frontend-service.yaml
?,需要找到用來查看 Guestbook 的 IP 地址。
kubectl get service frontend
響應(yīng)應(yīng)該與此類似:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend LoadBalancer 10.51.242.136 109.197.92.229 80:32372/TCP 1m
說明:
嘗試通過輸入消息并點(diǎn)擊 Submit 來添加一些留言板條目。 你所輸入的消息會(huì)在前端顯示。這一消息表明數(shù)據(jù)被通過你 之前所創(chuàng)建的 Service 添加到 Redis 存儲(chǔ)中。
你可以根據(jù)需要執(zhí)行伸縮操作,這是因?yàn)榉?wù)器本身被定義為使用一個(gè) Deployment 控制器的 Service。
kubectl scale deployment frontend --replicas=5
kubectl get pods
響應(yīng)應(yīng)該類似于這樣:
NAME READY STATUS RESTARTS AGE
frontend-85595f5bf9-5df5m 1/1 Running 0 83s
frontend-85595f5bf9-7zmg5 1/1 Running 0 83s
frontend-85595f5bf9-cpskg 1/1 Running 0 15m
frontend-85595f5bf9-l2l54 1/1 Running 0 14m
frontend-85595f5bf9-l9c8z 1/1 Running 0 14m
redis-follower-dddfbdcc9-82sfr 1/1 Running 0 97m
redis-follower-dddfbdcc9-qrt5k 1/1 Running 0 97m
redis-leader-fb76b4755-xjr2n 1/1 Running 0 108m
kubectl scale deployment frontend --replicas=2
kubectl get pods
響應(yīng)應(yīng)該類似于這樣:
NAME READY STATUS RESTARTS AGE
frontend-85595f5bf9-cpskg 1/1 Running 0 16m
frontend-85595f5bf9-l9c8z 1/1 Running 0 15m
redis-follower-dddfbdcc9-82sfr 1/1 Running 0 98m
redis-follower-dddfbdcc9-qrt5k 1/1 Running 0 98m
redis-leader-fb76b4755-xjr2n 1/1 Running 0 109m
刪除 Deployments 和服務(wù)還會(huì)刪除正在運(yùn)行的 Pod。 使用標(biāo)簽用一個(gè)命令刪除多個(gè)資源。
kubectl delete deployment -l app=redis
kubectl delete service -l app=redis
kubectl delete deployment frontend
kubectl delete service frontend
響應(yīng)應(yīng)該是:
deployment.apps "redis-follower" deleted
deployment.apps "redis-leader" deleted
deployment.apps "frontend" deleted
service "frontend" deleted
kubectl get pods
響應(yīng)應(yīng)該是:
No resources found in default namespace.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: