<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Chaos Mesh 入門教程

          共 8549字,需瀏覽 18分鐘

           ·

          2020-10-26 19:25

          混沌工程是在分布式系統(tǒng)上進(jìn)行實(shí)驗(yàn)的學(xué)科,目的是建立對系統(tǒng)抵御生產(chǎn)環(huán)境中失控條件的能力以及信心。

          大規(guī)模分布式軟件系統(tǒng)的發(fā)展正在改變軟件工程,作為一個行業(yè),我們很快采用了提高開發(fā)靈活性和部署速度的實(shí)踐。緊隨著這些優(yōu)點(diǎn)的一個迫切問題是:我們對投入生產(chǎn)的復(fù)雜系統(tǒng)有多少信心?

          即使分布式系統(tǒng)中的所有單個服務(wù)都正常運(yùn)行, 這些服務(wù)之間的交互也會導(dǎo)致不可預(yù)知的結(jié)果。這些不可預(yù)知的結(jié)果, 由影響生產(chǎn)環(huán)境的罕見且破壞性的事件復(fù)合而成,令這些分布式系統(tǒng)存在內(nèi)在的混沌。

          我們需要在異常行為出現(xiàn)之前,在整個系統(tǒng)內(nèi)找出這些弱點(diǎn)。這些弱點(diǎn)包括以下形式:

          • 當(dāng)服務(wù)不可用時的不正確回滾設(shè)置;
          • 不當(dāng)?shù)某瑫r設(shè)置導(dǎo)致的重試風(fēng)暴;
          • 由于下游依賴的流量過載導(dǎo)致的服務(wù)中斷;
          • 單點(diǎn)故障時的級聯(lián)失敗等。

          我們必須主動的發(fā)現(xiàn)這些重要的弱點(diǎn),在這些弱點(diǎn)通過生產(chǎn)環(huán)境暴露給我們的用戶之前。我們需要一種方法來管理這些系統(tǒng)固有的混沌, 通過增加的靈活性和速率以提升我們對生產(chǎn)環(huán)境部署的信心, 盡管系統(tǒng)的復(fù)雜性是由這些部署所導(dǎo)致的。

          我們采用基于經(jīng)驗(yàn)和系統(tǒng)的方法解決了分布式系統(tǒng)在規(guī)模增長時引發(fā)的問題,并以此建立對系統(tǒng)抵御這些事件的能力和信心,通過在受控實(shí)驗(yàn)中觀察分布式系統(tǒng)的行為來了解它的特性,我們稱之為混沌工程。

          什么是 Chos Mesh?

          Chaos Mesh?是云原生計(jì)算基金會(CNCF)托管的項(xiàng)目。

          Chaos Mesh 是一個云原生混沌工程平臺,提供了在 Kubernetes 平臺上進(jìn)行混沌測試的能力。

          Chaos Mesh 是一個通用的混沌工程解決方案,它的特點(diǎn)是對Kubernetes 上的復(fù)雜系統(tǒng)進(jìn)行全方位的故障注入方法,涵蓋了 Pod、網(wǎng)絡(luò)、文件系統(tǒng)甚至內(nèi)核的故障。Chaos Mesh 主要包括下面兩個組件:

          • Chaos Operator:混沌編排的核心組件。
          • Chaos Dashboard:用于管理、設(shè)計(jì)、監(jiān)控混沌實(shí)驗(yàn)的 Web UI。

          Chaos Mesh 使用 CRD 來定義混沌對象。Chaos Mesh 的整體架構(gòu)非常簡單,組件部署在 Kubernetes 之上,我們可以使用 YAML 文件或者使用 Chaos mesh Dashboard 上的 Form 來指定場景。其中會有一個 Chaos Daemon,以 Daemonset 的形式運(yùn)行,對特定節(jié)點(diǎn)的網(wǎng)絡(luò)、Cgroup 等具有系統(tǒng)權(quán)限。

          目前實(shí)現(xiàn)的 CRD 對象支持6種類型的故障注入,分別是 PodChaos、NetworkChaos、IOChaos、TimeChaos、StressChaos 和 KernelChaos,對應(yīng)的主要動作如下所示:

          • pod-kill:模擬 Kubernetes Pod 被 kill。
          • pod-failure:模擬 Kubernetes Pod 持續(xù)不可用,可以用來模擬節(jié)點(diǎn)宕機(jī)不可用場景。
          • network-delay:模擬網(wǎng)絡(luò)延遲。
          • network-loss:模擬網(wǎng)絡(luò)丟包。
          • network-duplication: 模擬網(wǎng)絡(luò)包重復(fù)。
          • network-corrupt: 模擬網(wǎng)絡(luò)包損壞。
          • network-partition:模擬網(wǎng)絡(luò)分區(qū)。
          • I/O delay : 模擬文件系統(tǒng) I/O 延遲。
          • I/O errno:模擬文件系統(tǒng) I/O 錯誤?。

          安裝

          我們可以直接在 Kubernetes 集群上很方便地安裝 Chaos Mesh,這里我們使用輕量級的 Kind 搭建的 Kubernetes 集群。當(dāng)然在部署之前,先確保 Docker 已在本地機(jī)器上安裝并運(yùn)行。

          $?curl?-sSL?https://mirrors.chaos-mesh.org/v1.0.1/install.sh?|?bash

          上面的命令會安裝所有的 CRD、ServiceAccount 和所有組件,如果你使用的是 k3s 或 k3d,需要指定 kind 參數(shù)。

          $?curl?-sSL?https://mirrors.chaos-mesh.org/v1.0.1/install.sh?|?bash?-s?—-local?kind

          如果你已經(jīng)安裝了大于 0.7 版本的Kind,那么腳本將繼續(xù),否則將安裝一個新的版本。腳本運(yùn)行后的輸出結(jié)果如下所示:

          Install?kubectl?client
          kubectl?Version?1.18.8?has?been?installed
          Install?Kind?tool
          Kind?Version?0.8.1?has?been?installed
          Install?local?Kubernetes?kind
          No?kind?clusters?found.
          Clean?data?dir:?/Users/rbanka/kind/kind/data
          start?to?create?kubernetes?cluster?kindCreating?cluster?"kind"?...
          DEBUG:?docker/images.go:58]?Image:?kindest/node:v1.17.2?present?locally
          ???Ensuring?node?image?(kindest/node:v1.17.2)??
          ???Preparing?nodes????????
          ???Writing?configuration??
          ???Starting?control-plane???
          ???Installing?CNI??
          ???Installing?StorageClass??
          ???Joining?worker?nodes??
          Set?kubectl?context?to?"kind-kind"
          You?can?now?use?your?cluster?with:
          kubectl?cluster-info?--context?kind-kind
          Thanks?for?using?kind!??
          Install?Chaos?Mesh?chaos-mesh
          customresourcedefinition.apiextensions.k8s.io/iochaos.chaos-mesh.org?created
          customresourcedefinition.apiextensions.k8s.io/kernelchaos.chaos-mesh.org?created
          customresourcedefinition.apiextensions.k8s.io/networkchaos.chaos-mesh.org?created
          customresourcedefinition.apiextensions.k8s.io/podchaos.chaos-mesh.org?created
          customresourcedefinition.apiextensions.k8s.io/podiochaos.chaos-mesh.org?created
          customresourcedefinition.apiextensions.k8s.io/podnetworkchaos.chaos-mesh.org?created
          customresourcedefinition.apiextensions.k8s.io/stresschaos.chaos-mesh.org?created
          customresourcedefinition.apiextensions.k8s.io/timechaos.chaos-mesh.org?created
          namespace/chaos-testing?created
          serviceaccount/chaos-controller-manager?created
          secret/chaos-mesh-webhook-certs?created
          clusterrole.rbac.authorization.k8s.io/chaos-mesh:chaos-controller-manager-target-namespace?created
          clusterrole.rbac.authorization.k8s.io/chaos-mesh:chaos-controller-manager-cluster-level?created
          clusterrolebinding.rbac.authorization.k8s.io/chaos-mesh:chaos-controller-manager-cluster-level?created
          clusterrolebinding.rbac.authorization.k8s.io/chaos-mesh:chaos-controller-manager-target-namespace?created
          role.rbac.authorization.k8s.io/chaos-mesh:chaos-controller-manager-control-plane?created
          rolebinding.rbac.authorization.k8s.io/chaos-mesh:chaos-controller-manager-control-plane?created
          service/chaos-dashboard?created
          service/chaos-mesh-controller-manager?created
          daemonset.apps/chaos-daemon?created
          deployment.apps/chaos-dashboard?created
          deployment.apps/chaos-controller-manager?created
          mutatingwebhookconfiguration.admissionregistration.k8s.io/chaos-mesh-mutation?created
          validatingwebhookconfiguration.admissionregistration.k8s.io/chaos-mesh-validation?created
          Waiting?for?pod?running
          chaos-controller-manager-754d4f7585-h9p4c???0/1???ContainerCreating???0?????10s
          Waiting?for?pod?running
          chaos-controller-manager-754d4f7585-h9p4c???0/1???ContainerCreating???0?????21s
          Waiting?for?pod?running
          chaos-controller-manager-754d4f7585-h9p4c???0/1???ContainerCreating???0?????31s
          Waiting?for?pod?running
          Chaos?Mesh?chaos-mesh?is?installed?successfully

          要驗(yàn)證組件是否在 Kubernetes Cluster 上運(yùn)行成功,可以使用以下方法檢查。

          $?kubectl?get?pods?-n?chaos-testing
          NAME????????????????????????????????????????READY???STATUS????RESTARTS???AGE
          chaos-controller-manager-754d4f7585-h9p4c???1/1?????Running???0??????????7h9m
          chaos-daemon-94687??????????????????????????1/1?????Running???0??????????7h9m
          chaos-daemon-k7pnj??????????????????????????1/1?????Running???0??????????7h9m
          chaos-daemon-tfgp6??????????????????????????1/1?????Running???0??????????7h9m
          chaos-dashboard-6fdb79c549-vmvtp????????????1/1?????Running???0??????????7h9m

          我們可以看到有3個組件處于運(yùn)行狀態(tài),controller、dashboard 以及作為 Daemonset 的運(yùn)行混沌 daemon 進(jìn)程。接著檢查下 CRD 是否在集群上創(chuàng)建成功。

          $?kubectl?get?crds
          NAME?????????????????????????????CREATED?AT
          iochaos.chaos-mesh.org???????????2020-10-22T09:15:05Z
          kernelchaos.chaos-mesh.org???????2020-10-22T09:15:05Z
          networkchaos.chaos-mesh.org??????2020-10-22T09:15:05Z
          podchaos.chaos-mesh.org??????????2020-10-22T09:15:05Z
          podiochaos.chaos-mesh.org????????2020-10-22T09:15:05Z
          podnetworkchaos.chaos-mesh.org???2020-10-22T09:15:05Z
          stresschaos.chaos-mesh.org???????2020-10-22T09:15:05Z
          timechaos.chaos-mesh.org?????????2020-10-22T09:15:05Z

          這些 CRD 就代表了上面詳細(xì)提到的各種故障注入的使用對象。

          要訪問 Dashboard,我們將使用 kube-proxy,或者你可以直接在Loadbalancer 上暴露它。顯示獲取 Chaos mesh Dashbaord 上的容器端口。

          $?kubectl?get?deploy?chaos-dashboard?-n?chaos-testing?-o=jsonpath="{.spec.template.spec.containers[0].ports[0].containerPort}{'\n'}"
          2333

          輸出顯示 Dashboard 正在監(jiān)聽的端口。然后緊接著我們把本地端口轉(zhuǎn)發(fā)到 Pod 上的端口,我們可以從上面得到 pod 名稱得到 pod 輸出。

          $?kubectl?port-forward?-n?chaos-testing?chaos-dashboard-6fdb79c549-vmvtp?8888:2333

          現(xiàn)在我們可以通過 http://localhost:8888 訪問 Dashboard 了。從 Dashboard 上可以看到,目前我們還沒有創(chuàng)建任何實(shí)驗(yàn)。

          創(chuàng)建混沌實(shí)驗(yàn)

          這里我們定義一個測試場景,在這個場景中,我們將為一個命名空間中的 Pod 配置 Chaos,它將被安排每1分鐘殺死一個 Pod。本例中 App 沒有標(biāo)簽選擇器,所以在多副本部署的情況下,它可以殺死任何 Pod。我們可以在配置中擁有不同的作用域。

          首先讓我們克隆我們的示例倉庫來獲得 YAML 資源清單文件。

          $?git?clone?https://github.com/ronakbanka/chaos-mesh-examples.git
          $?cd?pod-chaos

          然后使用 Kubectl 應(yīng)用命名空間選擇器定義的文件,這將創(chuàng)建3個資源對象。

          • 命名空間的名稱為 appns
          • 使用 nginx 鏡像部署3個副本
          • 使用 podchaos.chaos-mesh.org CRD 的 PodChaos對象
          $?kubectl?apply?-f?pod-namespace-selector.yml
          namespace/appns?created
          deployment.apps/nginx?created
          podchaos.chaos-mesh.org/pod-kill-example?created

          現(xiàn)在我們切換到 Chaos Mesh Dashboard 上驗(yàn)證這個實(shí)驗(yàn),使用上面同樣的步驟進(jìn)入。

          我們可以看到實(shí)驗(yàn)已經(jīng)被創(chuàng)建了,點(diǎn)擊 pod-kill-example 旁邊的 DETAIL 按鈕可以來獲取我們實(shí)驗(yàn)的詳細(xì)信息。

          詳細(xì)內(nèi)容基本上和我們的 YAML 文件中的 PodChaos 對象描述是一樣的。

          apiVersion:?chaos-mesh.org/v1alpha1
          kind:?PodChaos
          metadata:
          ??name:?pod-kill-example
          ??namespace:?chaos-testing
          spec:
          ??action:?pod-kill
          ??mode:?one
          ??selector:
          ????namespaces:
          ??????-?appns
          ??scheduler:
          ????cron:?"@every?1m"

          現(xiàn)在,讓我們在終端上使用 kubectl 來驗(yàn)證 pod 故障:

          • 初始化狀態(tài)
          $?kubectl?get?pods?-n?appns?-w
          NAME?????????????????????READY???STATUS????RESTARTS???AGE
          nginx-86c57db685-57l8j???1/1?????Running???0??????????7s
          nginx-86c57db685-mf2m9???1/1?????Running???0??????????5m7s
          nginx-86c57db685-szvqx???1/1?????Running???0??????????3m7s
          • 中間狀態(tài)
          nginx-86c57db685-mf2m9???1/1?????Terminating???0??????????6m
          nginx-86c57db685-26cs9???0/1?????Pending???????0??????????0s
          nginx-86c57db685-26cs9???0/1?????Pending???????0??????????0s
          nginx-86c57db685-mf2m9???1/1?????Terminating???0??????????6m
          nginx-86c57db685-26cs9???0/1?????ContainerCreating???0??????????0s
          nginx-86c57db685-26cs9???1/1?????Running?????????????0??????????4s

          我們可以清楚地看到,nginx-86c57db685-mf2m9 正在被終止,nginx-86c57db685-26cs9 正在被創(chuàng)建。

          • 最終狀態(tài)
          $?kubectl?get?pods?-n?appns
          NAME?????????????????????READY???STATUS????RESTARTS???AGE
          nginx-86c57db685-skcfv???1/1?????Running???0??????????118s
          nginx-86c57db685-szvqx???1/1?????Running???0??????????9m58s
          nginx-86c57db685-znk4r???1/1?????Running???0??????????58s

          我們可以看到此時有2個 Pod 被重新創(chuàng)建,另外,我們還可以在實(shí)驗(yàn)詳情下查看 Chaos Mesh Dashboard 上的事件。

          實(shí)驗(yàn)完成后我們可以執(zhí)行下面的步驟來清理卸載組件,也包括 kind 創(chuàng)建的集群。

          $?kubectl?delete?ns?chaos-testing
          $?kind?delete?cluster?--name=kind

          我們還可以使用 Chaos Mesh 創(chuàng)建各種各樣的故障場景,后面我們再分別介紹一些其他場景。

          參考鏈接

          • https://itnext.io/getting-started-with-chaos-mesh-and-kubernetes-bfd98d25d481
          • https://principlesofchaos.org/
          • https://chaos-mesh.org/docs/
          • https://chaos-mesh.org/docs/use_cases/multi_data_centers



          訓(xùn)練營推薦





          ?點(diǎn)擊屏末?|??|?即刻學(xué)習(xí)

          瀏覽 97
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产强 暴 疼 哭 处 | 黄色AV免费观看 | 免费的黄色A片 | 日韩一级黄色 | 99青娱乐在线视频观看 |