Day14 - Google Kubernetes Engine 基础 - Deployment 介绍

什麽是 Deployment ?

前几天的教学中我们使用 Pod 加上 Service 在 Kubernetes 里构建应用,这样的作法只适合在开发环境中测试,因为 Pod 并不是一个稳定的元件,随时都有可能停止服务,所以若是以单一 Pod 作为生产环境,服务就有可能因 Pod 失效而终止。

https://ithelp.ithome.com.tw/upload/images/20210913/20139235PDpUi1CEl5.png

Pod 失效後,就没办法提供服务了。

如何解决这样的问题,简单的方法就是对 Pod 做横向扩展,在丛集中复制多个相同 Pod 同时提供服务,当其中某个 Pod 挂掉时,流量会导入到其他正常运行的 Pod ,这样就能避免服务中断。

透过 Deployment 元件,就可以根据使用者期望的数量复制多个相同的 Pod ,若有 Pod 失效, 也会依照宣告数量启动新的 Pod,并且有着滚动更新、版本回溯等功能,有了 Deployment 元件就可以轻松在生产环境部属并维护应用程序,

https://ithelp.ithome.com.tw/upload/images/20210913/20139235z1hWodaMdc.png

上图为三副本数的 Deployment 架构,当其中的 Pod 失效了,服务还是能够正常运行,并且 Deployment 也会启动新的 Pod 来取代。

环境建置

首先来把部属 Deployment 的环境准备好。

  1. 进入 Cloud Shell 网站,点击终端机输入指令

  2. 列出所有的 project ,找到之前所创建专案的 PROJECT_ID

gcloud projects list

  1. 点击倒三角形->点选专案的 PROJECT_ID,开启专案 Terminal

  1. 建立 mydeployment.yaml 档案
cd ~/k8s-test && touch mydeployment.yaml
  1. 点击左上 Explorer -> Open Folder -> 选择 k8s-test 资料夹 -> Open

  1. 使用Kubectl get <type>查看之前创建的 Pod
kubectl get pods

(输出结果)

NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          2d11h

为了不影响实验环境,我们先将此 Pod 删除掉。Kubernetes 除了将 yaml 档用来部属,也可以使用kubectl delete -f <file>指令,根据 yaml 档案提供的资讯来删除元件。

  1. 使用 kubectl delete -f <file>删除 Pod
kubectl delete -f mypod.yaml

(输出结果)

pod "mypod" deleted
  1. 再次使用Kubectl get <type>查看 Pod
kubectl get pods

(输出结果)

No resources found in default namespace.

可以看到 Pod 被成功删除。

使用 Deployment 部属服务

接着就来实际操作如何建置 Deployment 吧!

  1. 点击mydeployment.yaml档案并贴上以下内容,并将<your iamge name>改成之前建立的 Image Name

https://ithelp.ithome.com.tw/upload/images/20210914/20139235pt0svlLd1H.png

这里的 Image 是在 Day08 所建立的 Node 应用

  • mydeployment.yaml
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
    • name: 指定 Deployment 的名称
  • spec
    • replicas: 需要建立多少 Pod
    • selector: 选择 Deployment 规则要使用在哪些 Pod,通常会指定 template 中设定的 label
    • template: 此 Deployment 要建立的 Pod 资讯

设定完成就可以用 yaml 档案来建置。

  1. 使用kubectl apply -f <file>建置 Deployment
kubectl apply -f mydeployment.yaml

使用kubectl get <type>就能够查看 Deployment 元件。

  1. 查看 Deployment 元件
kubectl get deployments

(输出结果)

NAME           READY   UP-TO-DATE   AVAILABLE   AGE
mydeployment   3/3     3            3           21s

可以看到成功建立了三个 Pod 并都正常运行,使用kubectl get pods来实际确认看看。

  1. 查看 pod 元件
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 ,看看会发生什麽情况。

  1. 删除 Pod 其中一个,将<Pod Name>改为其中一个 Pod 的名称。
kubectl delete pod <Pod Name>

(输出结果)

pod "mydeployment-5c956d7866-jb7t4" deleted
  1. 再次查看 pod 元件
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 正常运行。

  1. 查看之前创建的 Service 元件,找到myserviceEXTERNAL-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
  1. 开启浏览器,输入网址後送出
http://<EXTERNAL-IP>

服务也能够正常运行,代表 Deployment 建置成功。

总结

在这几天的教学中,是不是觉得 Pod、Service、Deployment 等 k8s 元件建置方式很类似呢,可以简单归类成以下顺序

  1. 根据需要的元件( 如 Service、Deployment )建立相关 yaml 档案
  2. 使用 kubectl apply -f <file> 建置元件
  3. 监控、维护服务

Kubernetes 的元件介绍就先暂时停在这,在之後的实战篇中会根据使用情形学习更多元件。


<<:  [Day 01] 前言

>>:  离职事项:我被裁员了,该准备哪些东西?

Dungeon Mizarka 025

今天难得有足够的时间可在Dungeon的专案进行调整,本来是想将时间花在整理行为的部份,但一直觉得目...

Day 30 ~ AI从入门到放弃 - 结语

从刚开始教大家使用Google Colaboratory,也介绍了模型的训练,资料预处理等基础,相信...

Vue-cli专案介绍

今天要介绍的是最後这个使用Vue-cli制作的专案,前面我们介绍了这个专案的router和vuex部...

Day27 Cookie 的使用-2

昨天我们创好大致上的架构了,现在我们要来做abc三个跳转页面 a.php <?php if(i...

[Day12]程序菜鸟自学C++资料结构演算法 – 树Tree

前言:相信大家对於「树」都不陌生,资料结构中的树其实是模拟现实生活中的树干、树枝和叶子,相当於树状结...