前几天的教学中我们使用 Pod 加上 Service 在 Kubernetes 里构建应用,这样的作法只适合在开发环境中测试,因为 Pod 并不是一个稳定的元件,随时都有可能停止服务,所以若是以单一 Pod 作为生产环境,服务就有可能因 Pod 失效而终止。
Pod 失效後,就没办法提供服务了。
如何解决这样的问题,简单的方法就是对 Pod 做横向扩展,在丛集中复制多个相同 Pod 同时提供服务,当其中某个 Pod 挂掉时,流量会导入到其他正常运行的 Pod ,这样就能避免服务中断。
透过 Deployment 元件,就可以根据使用者期望的数量复制多个相同的 Pod ,若有 Pod 失效, 也会依照宣告数量启动新的 Pod,并且有着滚动更新、版本回溯等功能,有了 Deployment 元件就可以轻松在生产环境部属并维护应用程序,
上图为三副本数的 Deployment 架构,当其中的 Pod 失效了,服务还是能够正常运行,并且 Deployment 也会启动新的 Pod 来取代。
首先来把部属 Deployment 的环境准备好。
进入 Cloud Shell 网站,点击终端机输入指令
列出所有的 project ,找到之前所创建专案的 PROJECT_ID
gcloud projects list
PROJECT_ID
,开启专案 Terminalmydeployment.yaml
档案cd ~/k8s-test && touch mydeployment.yaml
左上 Explorer -> Open Folder -> 选择 k8s-test 资料夹 -> Open
Kubectl get <type>
查看之前创建的 Podkubectl get pods
(输出结果)
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 2d11h
为了不影响实验环境,我们先将此 Pod 删除掉。Kubernetes 除了将 yaml 档用来部属,也可以使用kubectl delete -f <file>
指令,根据 yaml 档案提供的资讯来删除元件。
kubectl delete -f <file>
删除 Podkubectl delete -f mypod.yaml
(输出结果)
pod "mypod" deleted
Kubectl get <type>
查看 Podkubectl get pods
(输出结果)
No resources found in default namespace.
可以看到 Pod 被成功删除。
接着就来实际操作如何建置 Deployment 吧!
mydeployment.yaml
档案并贴上以下内容,并将<your iamge name>
改成之前建立的 Image Name这里的 Image 是在 Day08 所建立的 Node 应用
apiVersion: apps/v1
kind: Deployment
metadata:
name: mydeployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: mycontainer
image: <your iamge name>
ports:
- containerPort: 8080
apiVersion
kind
metadata
spec
设定完成就可以用 yaml 档案来建置。
kubectl apply -f <file>
建置 Deploymentkubectl apply -f mydeployment.yaml
使用kubectl get <type>
就能够查看 Deployment 元件。
kubectl get deployments
(输出结果)
NAME READY UP-TO-DATE AVAILABLE AGE
mydeployment 3/3 3 3 21s
可以看到成功建立了三个 Pod 并都正常运行,使用kubectl get pods
来实际确认看看。
kubectl get pods
NAME READY STATUS RESTARTS AGE
mydeployment-5c956d7866-jb7t4 1/1 Running 0 50s
mydeployment-5c956d7866-pkxg9 1/1 Running 0 50s
mydeployment-5c956d7866-qbsgj 1/1 Running 0 50s
尝试删除其中一个 Pod ,看看会发生什麽情况。
<Pod Name>
改为其中一个 Pod 的名称。kubectl delete pod <Pod Name>
(输出结果)
pod "mydeployment-5c956d7866-jb7t4" deleted
kubectl get pods
NAME READY STATUS RESTARTS AGE
mydeployment-5c956d7866-9bdhn 1/1 Running 0 18s
mydeployment-5c956d7866-pkxg9 1/1 Running 0 2m29s
mydeployment-5c956d7866-qbsgj 1/1 Running 0 2m29s
会看到还是有三个 Pod,而其中一个是新建立的,代表 Deployment 会自动调整 Pod 数量。接着测试服务能不能透过 Deployment 正常运行。
myservice
的EXTERNAL-IP
kubectl get svc
(输出结果)
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.3.240.1 <none> 443/TCP 2d18h
myservice LoadBalancer 10.3.253.46 34.150.28.184 80:30254/TCP 42h
http://<EXTERNAL-IP>
服务也能够正常运行,代表 Deployment 建置成功。
在这几天的教学中,是不是觉得 Pod、Service、Deployment 等 k8s 元件建置方式很类似呢,可以简单归类成以下顺序
kubectl apply -f <file>
建置元件Kubernetes 的元件介绍就先暂时停在这,在之後的实战篇中会根据使用情形学习更多元件。
今天难得有足够的时间可在Dungeon的专案进行调整,本来是想将时间花在整理行为的部份,但一直觉得目...
从刚开始教大家使用Google Colaboratory,也介绍了模型的训练,资料预处理等基础,相信...
今天要介绍的是最後这个使用Vue-cli制作的专案,前面我们介绍了这个专案的router和vuex部...
昨天我们创好大致上的架构了,现在我们要来做abc三个跳转页面 a.php <?php if(i...
前言:相信大家对於「树」都不陌生,资料结构中的树其实是模拟现实生活中的树干、树枝和叶子,相当於树状结...