<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Chaos Mesh Blog</title>
        <link>https://chaos-mesh.org/blog/</link>
        <description>Chaos Mesh Blog</description>
        <lastBuildDate>Tue, 07 Jun 2022 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Chaos Mesh Q&A at KUBECON EU 2022]]></title>
            <link>https://chaos-mesh.org/blog/chaos-mesh-qa-at-kubecon-eu-2022/</link>
            <guid>https://chaos-mesh.org/blog/chaos-mesh-qa-at-kubecon-eu-2022/</guid>
            <pubDate>Tue, 07 Jun 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Chaos Mesh Q&A]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh Q&amp;amp;A" src="https://chaos-mesh.org/assets/images/chaos-mesh-q&amp;a-5ee3460631a40ccb4ab675860e9bddd7.jpeg" width="3126" height="1043" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh Q&amp;A</figcaption></figure><p></p>
<p>At KubeCon EU 2022, the <a href="https://chaos-mesh.org/" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> team hosted two activities "Make Cloud Native Chaos Engineering Easier - Deep Dive into Chaos Mesh" and "office hours session". We are very grateful and enjoyed it with all of you very much. We shared with each other, got to know each other, and discussed a lot of things in depth.</p>
<!-- -->
<p>For the presentations, we gave a brief overview of Chaos Mesh, then delved into how Chaos Mesh is implemented and how it is practiced, and shared the team's latest explorations around chaos engineering and plans for Chaos Mesh's development.</p>
<p>For Office Hour, we introduced the Chaos Mesh project and its latest progress, and answered online questions from attendees.</p>
<p>Many thanks to each of our friends that came out to support us! And for Office Hour, we received some great questions and we decided to have a follow-up Q&amp;A.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="your-questions-answered">Your questions answered<a href="https://chaos-mesh.org/blog/chaos-mesh-qa-at-kubecon-eu-2022/#your-questions-answered" class="hash-link" aria-label="Direct link to Your questions answered" title="Direct link to Your questions answered" translate="no">​</a></h2>
<p><strong>Q: Does chaos play well with Windows/Linux hybrid clusters?</strong></p>
<p><strong>A:</strong> Chaos Mesh can only work with Linux now, but we have kindly contributors who are trying to port some features to Windows: <a href="https://github.com/chaos-mesh/chaos-mesh/issues/2956" target="_blank" rel="noopener noreferrer" class="">github.com/chaos-mesh/chaos-mesh/issues/2956</a></p>
<p><strong>Q: I think Istio and Linkerd also support fault injection. How does Chaos Mesh differ? Chaos Mesh provides much richer chaos injections (like IOChaos, TimeChaos...), but the injection provided by linked or istio, as I know, is focused on the network?</strong></p>
<p><strong>A:</strong> Yeah of course! Service Mesh Frameworks have the potential to cause havoc in the RPC/Network layer. More types of chaos, such as stresschaos, pod kill, DNSChaos, and IOChaos, could be injected into Chaos Mesh (just mentioned) In addition to the list, we offer additional types of chaos. JVM, GCP, Azure, and so on...</p>
<p><strong>Q: As part of the chaos mesh can we run any pre-initialization scripts before introducing the chaos experiment?</strong></p>
<p><strong>A:</strong> Yes! You may organize your customized scripts and various chaotic experiments together with Chaos Mesh's integrated Workflow engine. See <a href="https://chaos-mesh.org/docs/next/create-chaos-mesh-workflow/#task-field-description" target="_blank" rel="noopener noreferrer" class="">task field in workflow</a> for the document.</p>
<p><strong>Q: Is this similar to the Gremlin Chaos engineering tool?</strong></p>
<p><strong>A:</strong> Yes, this is a Kubernetes-specific open-source project. It's a Kubernetes plugin that you can utilize. You can get more Infos on <a href="https://chaos-mesh.org/" target="_blank" rel="noopener noreferrer" class="">https://chaos-mesh.org</a></p>
<p><strong>Q: How does it inject network latency for network chaos? if we use cilium CNI with no iptables, would this latency injection still work in that case?</strong></p>
<p><strong>A:</strong> Chaos Mesh has a chaos-daemon component. When network chaos is produced, chaos-daemon will enter the target pod's network namespace and set TC and iptables rules on the network device.</p>
<p>When using clium CNI without iptables, Chaos Mesh still works.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="join-the-chaos-mesh-community">Join the Chaos Mesh community<a href="https://chaos-mesh.org/blog/chaos-mesh-qa-at-kubecon-eu-2022/#join-the-chaos-mesh-community" class="hash-link" aria-label="Direct link to Join the Chaos Mesh community" title="Direct link to Join the Chaos Mesh community" translate="no">​</a></h2>
<p>If you are interested in Chaos Mesh and would like to help us improve it, you're welcome to join <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">our Slack channel</a>(#project-chaos-mesh) or submit your pull requests or issues to our <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
            <category>KubeCon</category>
            <category>CloudNativeCon</category>
        </item>
        <item>
            <title><![CDATA[Experience as an LFX Mentee for Chaos Mesh]]></title>
            <link>https://chaos-mesh.org/blog/experience-as-a-chaos-mesh-lfx-mentee/</link>
            <guid>https://chaos-mesh.org/blog/experience-as-a-chaos-mesh-lfx-mentee/</guid>
            <pubDate>Fri, 14 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Experience as an LFX Mentee for Chaos Mesh]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Experience as an LFX Mentee for Chaos Mesh" src="https://chaos-mesh.org/assets/images/lfx-mentee-experience-banner-69b87cf6f4a6a751404a33fd8d42af63.png" width="1600" height="530" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Experience as an LFX Mentee for Chaos Mesh</figcaption></figure><p></p>
<p>I am a graduate student studying software engineering at Nanjing University. My research focuses on DevOps, which has intrinsic connections with chaos engineering and observability. To get involved in the open-source community, understand Kubernetes more deeply, and experience the daily jobs around infrastructure, I applied for the CNCF LFX Mentorship in Fall 2021 to work on the <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> project.</p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="application-process">Application Process<a href="https://chaos-mesh.org/blog/experience-as-a-chaos-mesh-lfx-mentee/#application-process" class="hash-link" aria-label="Direct link to Application Process" title="Direct link to Application Process" translate="no">​</a></h2>
<p>At the end of August, I finished an internship of a business nature. As expected, I decided that I was not much into business-related work. However, I always had a strong passion for infrastructure technologies. By chance, I discovered the Chaos Mesh project at CNCF LFX Mentorship.I thought this was a great opportunity to work on an open source project, which I had been dreaming about. I also had the right technology stack, so I submitted my resume right before the deadline.</p>
<p>Three days later, I received an interview email from my mentor. As part of the interview, the mentor left a small piece of homework - to write a mini-node-exporter that would expose Prometheus metrics and present them in the Grafana dashboard. I was also required to deploy the mini-node-exporter, the configured Prometheus, and Grafana dashboard on the Kubernetes platform. The design and implementation process was very smooth. The only difficulty was to write the Grafana dashboard as a configuration YAML for the Kubernetes deployment. After a series of queries through documentation and experiments, this problem was finally solved.</p>
<p>On August 30, I was lucky enough to receive the good news that I passed the interview. During the one-on-one meeting with the mentor, we simply talked about my familiarity with Kubernetes and other technologies, the main tasks, and some key timelines. I also raised some concerns, such as the pressure of my graduate lab project that might affect the progress of the mentorship, and the design guidelines of the metrics. My mentor understood me well and addressed my concerns.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="project-process">Project Process<a href="https://chaos-mesh.org/blog/experience-as-a-chaos-mesh-lfx-mentee/#project-process" class="hash-link" aria-label="Direct link to Project Process" title="Direct link to Project Process" translate="no">​</a></h2>
<p>The project I applied for was called <a href="https://mentorship.lfx.linuxfoundation.org/project/8db683b0-0273-4a83-9ed9-4c33ee2cfcf0" target="_blank" rel="noopener noreferrer" class="">Monitoring Metrics about Chaos Mesh</a>, which aimed to improve the observability of the Chaos Mesh system by collecting metrics and providing a Grafana dashboard.</p>
<p>During the first two weeks of the project, I got familiar with the business process and some code details of chaos mesh. In the next two weeks, I started to write the design document to sort out all the metrics and collection methods. During this time, I studied the metric design guidelines and met with the mentor to understand the details of the proposal and some of the code logic.</p>
<p>Most of these metrics are relatively simple to collect, requiring only simple queries to database objects, k8s objects, or some simple counts. However, there are some special metrics that are difficult to collect. For example, you need to query the data by executing commands in the network namespace of the corresponding container, or query all the containers under the daemon through three different container runtimes, or collect data on the communication between the gRPC client and the server.</p>
<p>These tasks were strange to me. Therefore, I had to ask my mentor for technical support from time to time, and he was always very responsive. I was greatly impressed by my mentor’s extensive knowledge and experience in this field. Under the guidance from my mentor, I was finally able to put together the <a href="https://github.com/chaos-mesh/rfcs/pull/23" target="_blank" rel="noopener noreferrer" class="">RFC</a> document for my design. Later, in order to track my work, I created a <a href="https://github.com/chaos-mesh/chaos-mesh/issues/2397" target="_blank" rel="noopener noreferrer" class="">tracking issue</a>.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Tracking issue" src="https://chaos-mesh.org/assets/images/lfx-mentee-experience-tracking-issue-7ea5bc9c4a4193bbfc5b1e8c449de2a9.png" width="851" height="972" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Tracking issue</figcaption></figure><p></p>
<p>However, during the subsequent coding work, I encountered various problems. In retrospect, I found that many of them could have been solved in advance. So I have summarized some suggestions below:</p>
<p><strong>Keep thinking critically</strong>. When I accepted the proposal, I proposed my solution for each metric off the top of my head, but ignored some basic questions: are these metrics necessary? Do we have a better solution that’s available? These basic questions should have been addressed during the proposal phase, but they were propagated to the later design implementation phase. For example, when submitting the RFC, I was reminded by my mentor and reviewers that some metrics were already implemented in the controller-runtime library. When I was working on BPM-related metrics, I was asked similarly by the reviewer. Only then did I realize that I had never paid attention to it.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Comments about BPM metrics" src="https://chaos-mesh.org/assets/images/lfx-mentee-experience-thinking-critically-fcd1d0475090c15217fac74a711df8ef.png" width="558" height="536" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Comments about BPM metrics</figcaption></figure><p></p>
<p><strong>Continuous communication</strong>. How to communicate effectively is a very important issue in this mentorship. There are many lessons learned about communication, but the most profound is that it is better to give options before getting advice. When you have to ask for help, provide some options for the other party to reference. Although these options may not be valid, it contains your own thinking. Therefore, unless you still have no idea after thinking things through, don’t put other people in the middle of your questions.</p>
<p><strong>Understand open source</strong>. This is my first actual experience with open source. Compared with working in a company, things are a lot different. Here are some examples:</p>
<ol>
<li class="">
<p>The way information is synchronized. Unlike working in a company where we communicate often with face-to-face meetings, basically most of the communications with an open source community are concentrated in slack channels, GitHub issues, and pull requests. Therefore, we need to record our work so that we can always let other folks know what is going on. In the first few weeks, I maintained an online R&amp;D document based on my previous habit. Later I found that it was better to set up a Kanban or issue on GitHub, so that I would not introduce additional communication cost for my mentor by using a different platform.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Online R&amp;amp;D document" src="https://chaos-mesh.org/assets/images/lfx-mentee-experience-rd-doc-61a0b04340778b07db56a096231feb5e.png" width="925" height="647" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Online R&amp;D document</figcaption></figure><p></p>
</li>
<li class="">
<p>Better and more rigorous automated testing. For business companies, automated testing only includes static code analysis, unit testing and simple smoke testing, while manual testing will be more rigorous. But in open source projects, the automated code pipeline contains more detailed and complete test cases, such as integration testing, end-to-end testing, license checking, and so on. The quality and security of the submitted code will be checked initially in this phase.</p>
</li>
<li class="">
<p>Code review. Many people will participate in your code reviews, and the review may last for a long time. Unlike company work, there are no dedicated reviewers in an open source community. It could be users, maintainers, or other community members who are either assigned or voluntarily do the job, which may be part of the reason for the long review duration.</p>
</li>
</ol>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="after-the-project">After the project<a href="https://chaos-mesh.org/blog/experience-as-a-chaos-mesh-lfx-mentee/#after-the-project" class="hash-link" aria-label="Direct link to After the project" title="Direct link to After the project" translate="no">​</a></h2>
<p>I had a wonderful experience in these 12 weeks. I gained a deeper understanding of Kubernetes, CRD, and observability. I also realized that I was still lacking a lot of knowledge on how to improve code structure, Linux basics, and container technologies. There is still more to learn!</p>
<p>At the same time, because of the unexpected pressure of the graduate lab project, I didn’t have much dedicated time for the mentorship. I didn’t even get to finish the design of the Grafana part within the time frame. I will definitely follow up with it and hope to finish it successfully and give a real conclusion to this project.</p>
<p>I would like to thank my mentor <a href="https://github.com/STRRL" target="_blank" rel="noopener noreferrer" class="">@STRRL</a>. During my internship, I encountered many problems in the project, such as Git operations, cycle dependency solutions, and finding the runtime interface for CRI-O. Without my mentor's patience and guidance, it would have been difficult for me to complete these unfamiliar technical challenges. I would also like to thank the maintainers of Chaos Mesh for reviewing my code, and the CNCF LFX Mentorship project for providing a great platform for all of us who want to participate in the open-source community.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Mentor&amp;#39;s LGTM" src="https://chaos-mesh.org/assets/images/lfx-mentee-experience-mentors-lgtm-d408ab5a3921965164faf556fe5fa653.png" width="592" height="143" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Mentor's LGTM</figcaption></figure><p></p>
<p>Finally, I hope every student who wants to be part of the open-source community can take the first step with LFX Mentorship!</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
            <category>LFX Mentorship</category>
            <category>Monitoring Metrics</category>
        </item>
        <item>
            <title><![CDATA[How to Develop a Daily Reporting System to Track Chaos Testing Results]]></title>
            <link>https://chaos-mesh.org/blog/develop-a-daily-reporting-system/</link>
            <guid>https://chaos-mesh.org/blog/develop-a-daily-reporting-system/</guid>
            <pubDate>Tue, 11 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[How to Develop a Daily Reporting System to Track Chaos Testing Results]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="How to Develop a Daily Reporting System to Track Chaos Testing Results" src="https://chaos-mesh.org/assets/images/chaos-mesh-digitalchina-banner-c7d6ac176f56621aa799af0e30d06e96.png" width="1501" height="501" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">How to Develop a Daily Reporting System to Track Chaos Testing Results</figcaption></figure><p></p>
<p>Chaos Mesh is a cloud-native chaos engineering platform that orchestrates chaos experiments on Kubernetes environments. It allows you to test the resilience of your system by simulating problems such as network faults, file system faults, and Pod faults. After each chaos experiment, you can review the testing results by checking the logs. But this is neither direct nor efficient. Therefore, I decided to develop a daily reporting system that would automatically analyze logs and generate reports. This way, it’s easy to examine the logs and identify the issues.</p>
<!-- -->
<p>In this article, I will give you some insights about how to build a daily reporting system, as well as the problems I encountered during the process and how I fixed them.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="deploy-chaos-mesh-on-kubernetes">Deploy Chaos Mesh on Kubernetes<a href="https://chaos-mesh.org/blog/develop-a-daily-reporting-system/#deploy-chaos-mesh-on-kubernetes" class="hash-link" aria-label="Direct link to Deploy Chaos Mesh on Kubernetes" title="Direct link to Deploy Chaos Mesh on Kubernetes" translate="no">​</a></h2>
<p>Chaos Mesh is designed for Kubernetes, which is one of the important reasons why it can allow users to inject faults into the file system, Pod, or network for specific applications.</p>
<p>In earlier documents, Chaos Mesh offered two ways to quickly deploy a virtual Kubernetes cluster on your machine: <a href="https://github.com/kubernetes-sigs/kind" target="_blank" rel="noopener noreferrer" class="">kind</a> and <a href="https://minikube.sigs.k8s.io/docs/start/" target="_blank" rel="noopener noreferrer" class="">minikube</a>. Generally, it only takes a one-line command to deploy a Kubernetes cluster as well as install Chaos Mesh. But there are some problems:</p>
<ul>
<li class="">Starting Kubernetes clusters locally affects network-related fault types.</li>
<li class="">Users on the Chinese mainland might experience an extremely slow process to pull the Docker image or even a timeout.</li>
</ul>
<p>If you use the provided script to deploy a Kubernetes cluster using kind, all Kubernetes nodes are virtual machines (VM). This adds difficulty when you pull the image offline. To address this issue, you can deploy the Kubernetes cluster on multiple physical machines instead, with each physical machine acting as a worker node. To expedite the image pulling process, you can use the <code>docker load</code> command to load the required image in advance. Apart from the two problems above, you can install <a href="https://kubernetes.io/docs/reference/kubectl/overview/" target="_blank" rel="noopener noreferrer" class="">kubectl</a> and <a href="https://helm.sh/" target="_blank" rel="noopener noreferrer" class="">Helm</a> by following the documentation.</p>
<p>Note: For the latest installation and deployment instructions, refer to <a href="https://chaos-mesh.org/docs/quick-start/" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh Quick Start</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="deploy-tidb">Deploy TiDB<a href="https://chaos-mesh.org/blog/develop-a-daily-reporting-system/#deploy-tidb" class="hash-link" aria-label="Direct link to Deploy TiDB" title="Direct link to Deploy TiDB" translate="no">​</a></h2>
<p>The next step is to deploy TiDB on Kubernetes. I used TiDB Operator to streamline the process. For details, check out <a href="https://docs.pingcap.com/tidb-in-kubernetes/stable/get-started" target="_blank" rel="noopener noreferrer" class="">Get started with TiDB Operator in Kubernetes</a>.</p>
<p>I’d like to highlight two points in this process:</p>
<ul>
<li class="">First, install Custom Resource Definitions (CRDs) to implement different components of TiDB Operator. Otherwise, you’ll get errors when you try to install TiDB Operator.</li>
<li class="">Use <a href="https://longhorn.io/" target="_blank" rel="noopener noreferrer" class="">Longhorn</a>, a distributed block storage system for Kubernetes, to create local persistent volumes (PV) for your Kubernetes cluster. This way, you don’t have to create PVs in advance: whenever a Pod is pulled, a PV is automatically created and mounted.</li>
</ul>
<p>The biggest problem that I encountered was that pulling the image could be extremely slow when deploying the service. If the nodes in your Kubernetes cluster are virtual machines, pull the required images in advance and load them to the Docker of each machine:</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">## Pull required images on a machine with a good network connection</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> pull pingcap/tikv:latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> pull pingcap/tidb:latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> pull pingcap/pd:latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">## Export images and save them to each machine in the Kubernetes cluster</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> save </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> tikv.tar pingcap/tikv:latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> save </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> tidb.tar pingcap/tidb:latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> save </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> pd.tar pingcap/pd:latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">## Load images to each machine</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> load </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">lt</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> tikv.tar</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> load </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">lt</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> tidb.tar</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> load </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">lt</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> pd.tar</span><br></div></code></pre></div></div>
<p>The above commands allow you to use the TiDB image in the local Docker registry to deploy the latest TiDB cluster, saving you the trouble of pulling the image from the remote repository. The idea also applies to the Chaos Mesh installation as described earlier. If you do not know which images you need to pull, install Chaos Mesh using Helm to trigger the installation process, then use the <code>kubectl describe</code> command to verify:</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">## Check pods that are deployed in a specific namespace.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl describe pods </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> tidb-test</span><br></div></code></pre></div></div>
<p>The mirror pulling process usually takes the longest time to complete. If the Pod is being scheduled to a node, check it later.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="run-a-chaos-experiment">Run a chaos experiment<a href="https://chaos-mesh.org/blog/develop-a-daily-reporting-system/#run-a-chaos-experiment" class="hash-link" aria-label="Direct link to Run a chaos experiment" title="Direct link to Run a chaos experiment" translate="no">​</a></h2>
<p>To run a chaos experiment, you have to define it first through YAML files and use <code>kubectl apply</code> to start it. In this example, I created a chaos experiment using PodChaos to simulate a Pod crashing. For detailed instructions, refer to <a href="https://chaos-mesh.org/docs/run-a-chaos-experiment/" target="_blank" rel="noopener noreferrer" class="">Run a Chaos Experiment</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="generate-daily-report">Generate daily report<a href="https://chaos-mesh.org/blog/develop-a-daily-reporting-system/#generate-daily-report" class="hash-link" aria-label="Direct link to Generate daily report" title="Direct link to Generate daily report" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="collect-logs">Collect logs<a href="https://chaos-mesh.org/blog/develop-a-daily-reporting-system/#collect-logs" class="hash-link" aria-label="Direct link to Collect logs" title="Direct link to Collect logs" translate="no">​</a></h3>
<p>Usually, when you run chaos experiments on TiDB clusters, many errors are returned. To collect those error logs, run the <code>kubectl logs</code> command:</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">kubectl logs </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">lt</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">podname</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> tidb-test </span><span class="token parameter variable" style="color:#36acaa">--since</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">24h </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"> tidb.log</span><br></div></code></pre></div></div>
<p>All logs generated in the past 24 hours of the specific Pod in the <code>tidb-test</code> namespace will be saved to the <code>tidb.log</code> file.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="filter-errors-and-warnings">Filter errors and warnings<a href="https://chaos-mesh.org/blog/develop-a-daily-reporting-system/#filter-errors-and-warnings" class="hash-link" aria-label="Direct link to Filter errors and warnings" title="Direct link to Filter errors and warnings" translate="no">​</a></h3>
<p>In this step, you have to filter error messages and warning messages from logs. There are two options:</p>
<ul>
<li class="">Use text processing tools, such as awk. This requires a proficient understanding of Linux/Unix commands.</li>
<li class="">Write a script. If you’re not familiar with Linux/Unix commands, this is the better option.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="draw-a-plot">Draw a plot<a href="https://chaos-mesh.org/blog/develop-a-daily-reporting-system/#draw-a-plot" class="hash-link" aria-label="Direct link to Draw a plot" title="Direct link to Draw a plot" translate="no">​</a></h3>
<p>For plotting, I used <a href="http://www.gnuplot.info/" target="_blank" rel="noopener noreferrer" class="">gnuplot</a>, a Linux command-line graphing utility. In the example below, I imported the pressure measurement results and created a line graph to show how queries per second (QPS) were affected when a specific Pod became unavailable. Since the chaos experiment was executed periodically, the number of QPS exhibited a pattern: it would drop abruptly and then quickly return to normal.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="QPS line graph" src="https://chaos-mesh.org/assets/images/qps-line-graph-10389785bbe639db08850f5d73c47239.png" width="678" height="356" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">QPS line graph</figcaption></figure><p></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="generate-the-report-in-pdf">Generate the report in PDF<a href="https://chaos-mesh.org/blog/develop-a-daily-reporting-system/#generate-the-report-in-pdf" class="hash-link" aria-label="Direct link to Generate the report in PDF" title="Direct link to Generate the report in PDF" translate="no">​</a></h3>
<p>Currently, there is no available API for generating Chaos Mesh reports or analyzing results. I decided to generate the report in PDF format so it would be readable on different browsers. In my case, I used <a href="https://github.com/signintech/gopdf" target="_blank" rel="noopener noreferrer" class="">gopdf</a>, a support library that allows users to create PDF files. It also lets me insert images or draw tables, which meets my needs.</p>
<p>To generate a daily report, I used <a href="https://www.linux.org/docs/man8/cron.html" target="_blank" rel="noopener noreferrer" class="">crond</a>, a command-line utility that executes cron jobs in the background, to execute the commands early each morning. So, when I start work, there is a daily report waiting for me.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="build-a-web-application-for-daily-reporting">Build a web application for daily reporting<a href="https://chaos-mesh.org/blog/develop-a-daily-reporting-system/#build-a-web-application-for-daily-reporting" class="hash-link" aria-label="Direct link to Build a web application for daily reporting" title="Direct link to Build a web application for daily reporting" translate="no">​</a></h2>
<p>But I want to make the report more readable and accessible. Isn’t it nicer if you can check reports on a web application? At first, I wanted to add a backend API and track when the report was generated. It sounds applicable but it may be too much work since all I want is to know which report requires further troubleshooting. The exact information is shown in the file name, for example: <code>report-2021-07-09-bad.pdf</code>. Thus, the reporting system’s workload and complexity are greatly reduced.</p>
<p>Still, it is necessary to improve the backend interfaces as well as enrich the report content. But for now, a daily, workable reporting system is just fine.</p>
<p>In my case, I used <a href="https://github.com/vuejs/vue" target="_blank" rel="noopener noreferrer" class="">Vue.js</a> to scaffold the web application using a UI library <a href="https://www.antdv.com/docs/vue/introduce/" target="_blank" rel="noopener noreferrer" class="">antd</a>. After that, I updated the page content by saving the automatically generated report to the static resources folder <code>static</code>. This allows the web application to read the static reports and then render them to the front end page. For details, check out <a href="https://www.antdv.com/docs/vue/use-with-vue-cli/" target="_blank" rel="noopener noreferrer" class="">Use antd in vue-cli 3</a>.</p>
<p>Below is an example of a web application that I developed for daily reporting. The red card indicates that I should take a look at the testing report because exceptions are thrown after running chaos experiments.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Web application for daily reporting" src="https://chaos-mesh.org/assets/images/web-app-for-daily-reporting-3fc7adf871410eb6a52f15ac84c00d5b.png" width="1999" height="580" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Web application for daily reporting</figcaption></figure><p></p>
<p>Clicking the red card will open the report, as shown below. I used <a href="https://github.com/mozilla/pdf.js" target="_blank" rel="noopener noreferrer" class="">pdf.js</a> to view the PDF.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Daily report in PDF" src="https://chaos-mesh.org/assets/images/daily-report-pdf-8ae60cf1beb170450c7fd87443084175.png" width="930" height="841" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Daily report in PDF</figcaption></figure><p></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="summary">Summary<a href="https://chaos-mesh.org/blog/develop-a-daily-reporting-system/#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<p>Chaos Mesh enables you to simulate faults that most cloud-native applications might encounter. In this article, I created a PodChaos experiment and observed that QPS in the TiDB cluster was affected when the Pod became unavailable. After analyzing the logs, I can enhance the robustness and high availability of the system. I built a web application to generate daily reports for troubleshooting and debugging. You can also customize the reports to meet your own requirements.</p>
<p>Our team is also working on a project to <a href="https://github.com/DigitalChinaOpenSource/TiDB-for-PostgreSQL" target="_blank" rel="noopener noreferrer" class="">make TiDB compatible with PostgreSQL</a>. If you are interested and want to make contributions, you are welcome to pick an issue and get started.</p>
<p><strong>Originally published at <em><a href="https://thenewstack.io/develop-a-daily-reporting-system-for-chaos-mesh-to-improve-system-resilience/" target="_blank" rel="noopener noreferrer" class="">The New Stack</a></em>.</strong></p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
            <category>Use Cases</category>
        </item>
        <item>
            <title><![CDATA[Share your #ChaosMeshStory!]]></title>
            <link>https://chaos-mesh.org/blog/share-your-chaos-mesh-story/</link>
            <guid>https://chaos-mesh.org/blog/share-your-chaos-mesh-story/</guid>
            <pubDate>Mon, 27 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Share your #ChaosMeshStory!]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Share your #ChaosMeshStory!" src="https://chaos-mesh.org/assets/images/chaos-mesh-story-09361823544167ed242d9ae1945013eb.jpeg" width="1400" height="467" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Share your #ChaosMeshStory!</figcaption></figure><p></p>
<p>Hey community,</p>
<p>🥳 Chaos Mesh will turn 2 on 2021.12.31! We're grateful for every contribution from you that helped this project grow. And we'd like to hear your Chaos Mesh story! How did you hear about the project? How did you get involved? Are you an adopter or a contributor? What do you think of it? It can be anything! Share your <strong><a href="https://twitter.com/intent/tweet?text=%23ChaosMeshStory" target="_blank" rel="noopener noreferrer" class="">#ChaosMeshStory</a></strong> over on Twitter and win a Chaos Mesh Tee!</p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="-chaosmeshstory-entry-via-twitter">🍼 #ChaosMeshStory Entry via Twitter<a href="https://chaos-mesh.org/blog/share-your-chaos-mesh-story/#-chaosmeshstory-entry-via-twitter" class="hash-link" aria-label="Direct link to 🍼 #ChaosMeshStory Entry via Twitter" title="Direct link to 🍼 #ChaosMeshStory Entry via Twitter" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="rules">Rules<a href="https://chaos-mesh.org/blog/share-your-chaos-mesh-story/#rules" class="hash-link" aria-label="Direct link to Rules" title="Direct link to Rules" translate="no">​</a></h3>
<ul>
<li class="">Eligibility: anyone with a Twitter account</li>
<li class="">Event Period: December 27, 2021, at 9:00 AM - December 31, 2021, at 11:59 PM (PT)</li>
<li class="">How to participate:<!-- -->
<ol>
<li class="">Follow <a href="https://twitter.com/chaos_mesh" target="_blank" rel="noopener noreferrer" class="">@chaos_mesh</a>.</li>
<li class="">Add the <strong><a href="https://twitter.com/intent/tweet?text=%23ChaosMeshStory" target="_blank" rel="noopener noreferrer" class="">#ChaosMeshStory</a></strong> hashtag.</li>
<li class="">Share your experience with Chaos Mesh!</li>
</ol>
</li>
<li class="">Judging Criteria: all qualified entries will be eligible to receive a Chaos Mesh Tee. The link to collect your contact information will be available on January 1st, 2022. Stay tuned with <a href="https://twitter.com/chaos_mesh" target="_blank" rel="noopener noreferrer" class="">@chaos_mesh</a> on Twitter!</li>
<li class="">Rules: please comply with the <a href="https://github.com/chaos-mesh/chaos-mesh/blob/master/CODE_OF_CONDUCT.md" target="_blank" rel="noopener noreferrer" class="">Code of Conduct</a>, otherwise you will be ineligible to participate.</li>
</ul>
<p>If you have any questions regarding the event, please DM <a href="https://twitter.com/chaos_mesh" target="_blank" rel="noopener noreferrer" class="">@chaos_mesh</a>.</p>
<p>Have fun!</p>
<p>Yours truly,</p>
<p>Chaos Mesh community</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Community</category>
        </item>
        <item>
            <title><![CDATA[Deploy Chaos Mesh on KubeSphere]]></title>
            <link>https://chaos-mesh.org/blog/deploy-chaos-mesh-on-kubesphere/</link>
            <guid>https://chaos-mesh.org/blog/deploy-chaos-mesh-on-kubesphere/</guid>
            <pubDate>Wed, 22 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Deploy Chaos Mesh on KubeSphere]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Deploy Chaos Mesh on KubeSphere" src="https://chaos-mesh.org/assets/images/chaos-mesh-kubesphere-banner-d1ac1761a1832e257e371d279ad9c82f.png" width="1500" height="500" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Deploy Chaos Mesh on KubeSphere</figcaption></figure><p></p>
<p><a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> is a cloud-native Chaos Engineering platform that orchestrates chaos in Kubernetes environments. With Chaos Mesh, you can test your system's resilience and robustness on Kubernetes by injecting various types of faults into Pods, network, file system, and even the kernel.</p>
<!-- -->
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh architecture" src="https://chaos-mesh.org/assets/images/chaos-mesh-architecture-2.0-8f9608a528cf0eaab88b05032cc8a1f8.png" width="1999" height="1398" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh architecture</figcaption></figure><p></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="whats-kubesphere">What’s KubeSphere<a href="https://chaos-mesh.org/blog/deploy-chaos-mesh-on-kubesphere/#whats-kubesphere" class="hash-link" aria-label="Direct link to What’s KubeSphere" title="Direct link to What’s KubeSphere" translate="no">​</a></h2>
<p><a href="https://kubesphere.io/" target="_blank" rel="noopener noreferrer" class="">KubeSphere</a> is a distributed operating system for cloud-native application management, using Kubernetes as its kernel. It provides a plug-and-play architecture, allowing third-party applications to be seamlessly integrated into its ecosystem.</p>
<p>KubeSphere 3.2.0 adds the feature of dynamically loading community-developed Helm charts into the <a href="https://kubesphere.io/docs/pluggable-components/app-store/" target="_blank" rel="noopener noreferrer" class="">KubeSphere App Store</a>. Thanks to this new feature, Chaos Mesh is now available on KubeSphere. In this tutorial, you will learn how to deploy Chaos Mesh on KubeSphere to conduct chaos experiments.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="enable-app-store-on-kubesphere">Enable App Store on KubeSphere<a href="https://chaos-mesh.org/blog/deploy-chaos-mesh-on-kubesphere/#enable-app-store-on-kubesphere" class="hash-link" aria-label="Direct link to Enable App Store on KubeSphere" title="Direct link to Enable App Store on KubeSphere" translate="no">​</a></h2>
<ol>
<li class="">
<p>Make sure you have installed and enabled the <a href="https://kubesphere.io/docs/pluggable-components/app-store/" target="_blank" rel="noopener noreferrer" class="">KubeSphere App Store</a>.</p>
</li>
<li class="">
<p>You need to create a workspace, a project, and a user account (project-regular) for this tutorial. The account needs to be a platform regular user and to be invited as the project operator with the operator role. For more information, see <a href="https://kubesphere.io/docs/quick-start/create-workspace-and-project/" target="_blank" rel="noopener noreferrer" class="">Create Workspaces, Projects, Users and Roles</a>.</p>
</li>
</ol>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="chaos-experiments-with-chaos-mesh">Chaos experiments with Chaos Mesh<a href="https://chaos-mesh.org/blog/deploy-chaos-mesh-on-kubesphere/#chaos-experiments-with-chaos-mesh" class="hash-link" aria-label="Direct link to Chaos experiments with Chaos Mesh" title="Direct link to Chaos experiments with Chaos Mesh" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="step-1-deploy-chaos-mesh">Step 1: Deploy Chaos Mesh<a href="https://chaos-mesh.org/blog/deploy-chaos-mesh-on-kubesphere/#step-1-deploy-chaos-mesh" class="hash-link" aria-label="Direct link to Step 1: Deploy Chaos Mesh" title="Direct link to Step 1: Deploy Chaos Mesh" translate="no">​</a></h3>
<ol>
<li class="">
<p>Login KubeSphere as <code>project-regular</code>, search for <strong>chaos-mesh</strong> in the <strong>App Store</strong>, and click on the search result to enter the app.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh app" src="https://chaos-mesh.org/assets/images/chaos-mesh-app-8adffd3053f397bb95fcda48a2c0a5a0.png" width="1999" height="1132" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh app</figcaption></figure><p></p>
</li>
<li class="">
<p>In the <strong>App Information</strong> page, click <strong>Install</strong> on the upper right corner.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Install Chaos Mesh" src="https://chaos-mesh.org/assets/images/install-chaos-mesh-d521449e8a0d735b7a53389420471008.png" width="1999" height="1090" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Install Chaos Mesh</figcaption></figure><p></p>
</li>
<li class="">
<p>In the <strong>App Settings</strong> page, set the application <strong>Name,</strong> <strong>Location</strong> (as your Namespace), and <strong>App Version</strong>, and then click <strong>Next</strong> on the upper right corner.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh basic information" src="https://chaos-mesh.org/assets/images/chaos-mesh-basic-info-08cf0a7bd5e76a47cbcc304eb25687ca.png" width="1999" height="1245" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh basic information</figcaption></figure><p></p>
</li>
<li class="">
<p>Configure the <code>values.yaml</code> file as needed, or click <strong>Install</strong> to use the default configuration.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh configurations" src="https://chaos-mesh.org/assets/images/chaos-mesh-config-09ac3ba9ad416620a5cdb4d6b63b36d2.png" width="1999" height="1322" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh configurations</figcaption></figure><p></p>
</li>
<li class="">
<p>Wait for the deployment to be finished. Upon completion, Chaos Mesh will be shown as <strong>Running</strong> in KubeSphere.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh deployed" src="https://chaos-mesh.org/assets/images/chaos-mesh-deployed-363a24608b8daa7da207cbddf42604bf.png" width="1999" height="721" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh deployed</figcaption></figure><p></p>
</li>
</ol>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="step-2-visit-chaos-dashboard">Step 2: Visit Chaos Dashboard<a href="https://chaos-mesh.org/blog/deploy-chaos-mesh-on-kubesphere/#step-2-visit-chaos-dashboard" class="hash-link" aria-label="Direct link to Step 2: Visit Chaos Dashboard" title="Direct link to Step 2: Visit Chaos Dashboard" translate="no">​</a></h3>
<ol>
<li class="">
<p>In the <strong>Resource Status</strong> page, copy the **NodePort **of <code>chaos-dashboard</code>.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh NodePort" src="https://chaos-mesh.org/assets/images/chaos-mesh-nodeport-a4d9f826906e930e860982726841b582.png" width="1999" height="1183" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh NodePort</figcaption></figure><p></p>
</li>
<li class="">
<p>Access the Chaos Dashboard by entering <code>${NodeIP}:${NODEPORT}</code> in your browser. Refer to <a href="https://chaos-mesh.org/docs/manage-user-permissions/" target="_blank" rel="noopener noreferrer" class="">Manage User Permissions</a> to generate a Token and log into Chaos Dashboard.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Login to Chaos Dashboard" src="https://chaos-mesh.org/assets/images/login-to-dashboard-a9c2d9c7daa5a4532e19add776db193d.png" width="1600" height="767" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Login to Chaos Dashboard</figcaption></figure><p></p>
</li>
</ol>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="step-3-create-a-chaos-experiment">Step 3: Create a chaos experiment<a href="https://chaos-mesh.org/blog/deploy-chaos-mesh-on-kubesphere/#step-3-create-a-chaos-experiment" class="hash-link" aria-label="Direct link to Step 3: Create a chaos experiment" title="Direct link to Step 3: Create a chaos experiment" translate="no">​</a></h3>
<p>Before creating a chaos experiment, you should identify and deploy your experiment target, for example, to test how an application works under network latency. Here, we use a demo application <code>web-show</code> as the target application to be tested, and the test goal is to observe the system network latency. You can deploy a demo application <code>web-show</code> with the following command: <code>web-show</code>.</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-sSL</span><span class="token plain"> https://mirrors.chaos-mesh.org/latest/web-show/deploy.sh </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">bash</span><br></div></code></pre></div></div>
<blockquote>
<p>Note: The network latency of the Pod can be observed directly from the web-show application pad to the kube-system pod.</p>
</blockquote>
<ol>
<li class="">
<p>From your web browser, visit <code>${NodeIP}:8081</code> to access the <strong>Web Show</strong> application.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh web show app" src="https://chaos-mesh.org/assets/images/web-show-app-895d8add29dc5ead3186061140dd08c9.png" width="1600" height="748" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh web show app</figcaption></figure><p></p>
</li>
<li class="">
<p>Log in to Chaos Dashboard to create a chaos experiment. To observe the effect of network latency on the application, we set the **Target **as "Network Attack" to simulate a network delay scenario.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Dashboard" src="https://chaos-mesh.org/assets/images/chaos-dashboard-networkchaos-b9db285317d00b05eb3bb07ebe582916.png" width="1999" height="1263" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Dashboard</figcaption></figure><p></p>
<p>The <strong>Scope</strong> of the experiment is set to <code>app: web-show</code>.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Experiment scope" src="https://chaos-mesh.org/assets/images/chaos-experiment-scope-215b20d1a6b9e1e235ceca59079c01c1.png" width="1999" height="1154" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Experiment scope</figcaption></figure><p></p>
</li>
<li class="">
<p>Start the chaos experiment by submitting it.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Submit Chaos Experiment" src="https://chaos-mesh.org/assets/images/start-chaos-experiment-d709c21f47e704f7349bf8627b4a2498.png" width="1999" height="980" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Submit Chaos Experiment</figcaption></figure><p></p>
</li>
</ol>
<p>Now, you should be able to visit <strong>Web Show</strong> to observe experiment results:</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Experiment result" src="https://chaos-mesh.org/assets/images/experiment-result-fe46c56819b85b5e68bb0d3b27550424.png" width="1600" height="720" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Experiment result</figcaption></figure><p></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="to-summarize">To summarize<a href="https://chaos-mesh.org/blog/deploy-chaos-mesh-on-kubesphere/#to-summarize" class="hash-link" aria-label="Direct link to To summarize" title="Direct link to To summarize" translate="no">​</a></h2>
<p>KubeSphere makes cloud-native application deployments and maintenance easy. Thanks to the App Store, users can easily deploy Chaos Mesh on KubeSphere with just a few clicks, enabling you to quickly start your own chaos experiments.</p>
<p>To learn more about Chaos Mesh, refer to the <a href="https://chaos-mesh.org/docs/" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh docs</a> or join the community Slack (<a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">CNCF</a>/#project-chaos-mesh).</p>]]></content:encoded>
            <author>cwenyin0@gmail.com (Cwen Yin)</author>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
            <category>Community</category>
        </item>
        <item>
            <title><![CDATA[Chaos Mesh + SkyWalking: Better Observability for Chaos Engineering]]></title>
            <link>https://chaos-mesh.org/blog/better-observability-for-chaos-engineering/</link>
            <guid>https://chaos-mesh.org/blog/better-observability-for-chaos-engineering/</guid>
            <pubDate>Thu, 16 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Chaos Mesh + SkyWalking: Better Observability for Chaos Engineering]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh + SkyWalking: Better Observability for Chaos Engineering" src="https://chaos-mesh.org/assets/images/chaos-mesh-skywalking-banner-1f6183766d34f1bcd35f2e812504954f.png" width="1501" height="501" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh + SkyWalking: Better Observability for Chaos Engineering</figcaption></figure><p></p>
<p><a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> is an open-source cloud-native <a href="https://en.wikipedia.org/wiki/Chaos_engineering" target="_blank" rel="noopener noreferrer" class="">chaos engineering</a> platform. You can use Chaos Mesh to conveniently inject failures and simulate abnormalities that might occur in reality, so you can identify potential problems in your system. Chaos Mesh also offers a Chaos Dashboard which allows you to monitor the status of a chaos experiment. However, this dashboard cannot let you observe how the failures in the experiment impact the service performance of applications. This hinders us from further testing our systems and finding potential problems.</p>
<!-- -->
<p><a href="https://github.com/apache/skywalking" target="_blank" rel="noopener noreferrer" class="">Apache SkyWalking</a> is an open-source application performance monitor (APM), specially designed to monitor, track, and diagnose cloud native, container-based distributed systems. It collects events that occur and then displays them on its dashboard, allowing you to observe directly the type and number of events that have occurred in your system and how different events impact the service performance.</p>
<p>When you use SkyWalking and Chaos Mesh together during chaos experiments, you can observe how different failures impact the service performance.</p>
<p>This tutorial will show you how to configure SkyWalking and Chaos Mesh. You’ll also learn how to leverage the two systems to monitor events and observe in real time how chaos experiments impact applications’ service performance.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="preparation">Preparation<a href="https://chaos-mesh.org/blog/better-observability-for-chaos-engineering/#preparation" class="hash-link" aria-label="Direct link to Preparation" title="Direct link to Preparation" translate="no">​</a></h2>
<p>Before you start to use SkyWalking and Chaos Mesh, you have to:</p>
<ul>
<li class="">Set up a SkyWalking cluster according to <a href="https://github.com/apache/skywalking-kubernetes#install" target="_blank" rel="noopener noreferrer" class="">the SkyWalking configuration guide</a>.</li>
<li class="">Deploy Chao Mesh <a href="https://chaos-mesh.org/docs/production-installation-using-helm/" target="_blank" rel="noopener noreferrer" class="">using Helm</a>.</li>
<li class="">Install <a href="https://jmeter.apache.org/index.html" target="_blank" rel="noopener noreferrer" class="">JMeter</a> or other Java testing tools (to increase service loads).</li>
<li class="">Configure SkyWalking and Chaos Mesh according to <a href="https://github.com/chaos-mesh/chaos-mesh-on-skywalking" target="_blank" rel="noopener noreferrer" class="">this guide</a> if you just want to run a demo.</li>
</ul>
<p>Now, you are fully prepared, and we can cut to the chase.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="step-1-access-the-skywalking-cluster">Step 1: Access the SkyWalking cluster<a href="https://chaos-mesh.org/blog/better-observability-for-chaos-engineering/#step-1-access-the-skywalking-cluster" class="hash-link" aria-label="Direct link to Step 1: Access the SkyWalking cluster" title="Direct link to Step 1: Access the SkyWalking cluster" translate="no">​</a></h2>
<p>After you install the SkyWalking cluster, you can access its user interface (UI). However, no service is running at this point, so before you start monitoring, you have to add one and set the agents.</p>
<p>In this tutorial, we take Spring Boot, a lightweight microservice framework, as an example to build a simplified demo environment.</p>
<ol>
<li class="">Create a SkyWalking demo in Spring Boot by referring to <a href="https://github.com/chaos-mesh/chaos-mesh-on-skywalking/blob/master/demo-deployment.yaml" target="_blank" rel="noopener noreferrer" class="">this document</a>.</li>
<li class="">Execute the command <code>kubectl apply -f demo-deployment.yaml -n skywalking</code> to deploy the demo.</li>
</ol>
<p>After you finish deployment, you can observe the real-time monitoring results at the SkyWalking UI.</p>
<p><strong>Note:</strong> Spring Boot and SkyWalking have the same default port number: 8080. Be careful when you configure the port forwarding; otherise, you may have port conflicts. For example, you can set Spring Boot’s port to 8079 by using a command like <code>kubectl port-forward svc/spring-boot-skywalking-demo 8079:8080 -n skywalking</code> to avoid conflicts.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="step-2-deploy-skywalking-kubernetes-event-exporter">Step 2: Deploy SkyWalking Kubernetes Event Exporter<a href="https://chaos-mesh.org/blog/better-observability-for-chaos-engineering/#step-2-deploy-skywalking-kubernetes-event-exporter" class="hash-link" aria-label="Direct link to Step 2: Deploy SkyWalking Kubernetes Event Exporter" title="Direct link to Step 2: Deploy SkyWalking Kubernetes Event Exporter" translate="no">​</a></h2>
<p><a href="https://github.com/apache/skywalking-kubernetes-event-exporter" target="_blank" rel="noopener noreferrer" class="">SkyWalking Kubernetes Event Exporter</a> is able to watch, filter, and send Kubernetes events into the SkyWalking backend. SkyWalking then associates the events with the system metrics and displays an overview about when and how the metrics are affected by the events.</p>
<p>If you want to deploy SkyWalking Kubernetes Event Explorer with one line of commands, refer to <a href="https://github.com/chaos-mesh/chaos-mesh-on-skywalking/blob/master/exporter-deployment.yaml" target="_blank" rel="noopener noreferrer" class="">this document</a> to create configuration files in YAML format and then customize the parameters in the filters and exporters. Now, you can use the command <code>kubectl apply</code> to deploy SkyWalking Kubernetes Event Explorer.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="step-3-use-jmeter-to-increase-service-loads">Step 3: Use JMeter to increase service loads<a href="https://chaos-mesh.org/blog/better-observability-for-chaos-engineering/#step-3-use-jmeter-to-increase-service-loads" class="hash-link" aria-label="Direct link to Step 3: Use JMeter to increase service loads" title="Direct link to Step 3: Use JMeter to increase service loads" translate="no">​</a></h2>
<p>To better observe the change in service performance, you need to increase the service loads on Spring Boot. In this tutorial, we use JMeter, a widely adopted Java testing tool, to increase the service loads.</p>
<p>Perform a stress test on <code>localhost:8079</code> using JMeter and add five threads to continuously increase the service loads.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="JMeter Dashboard 1" src="https://chaos-mesh.org/assets/images/jmeter-1-57604bd61820a513fba79f7e3fe622a5.png" width="1156" height="517" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">JMeter Dashboard 1</figcaption></figure><p></p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="JMeter Dashboard 2" src="https://chaos-mesh.org/assets/images/jmeter-2-5286dd8271fc4872d751d69f04c955a2.png" width="1525" height="429" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">JMeter Dashboard 2</figcaption></figure><p></p>
<p>Open the SkyWalking Dashboard. You can see that the access rate is 100%, and that the service loads reach about 5,300 calls per minute (CPM).</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="SkyWalking Dashboard" src="https://chaos-mesh.org/assets/images/skywalking-dashboard-be15b01a2de79a2abddad3f33fc15346.png" width="1919" height="934" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">SkyWalking Dashboard</figcaption></figure><p></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="step-4-inject-failures-via-chaos-mesh-and-observe-results">Step 4: Inject failures via Chaos Mesh and observe results<a href="https://chaos-mesh.org/blog/better-observability-for-chaos-engineering/#step-4-inject-failures-via-chaos-mesh-and-observe-results" class="hash-link" aria-label="Direct link to Step 4: Inject failures via Chaos Mesh and observe results" title="Direct link to Step 4: Inject failures via Chaos Mesh and observe results" translate="no">​</a></h2>
<p>After you finish the three steps above, you can use the Chaos Dashboard to simulate stress scenarios and observe the change in service performance during chaos experiments.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="StressChaos on Chaos Dashboard" src="https://chaos-mesh.org/assets/images/chaos-dashboard-stresschaos-0958f21ef5a185aa16e9c2327a226fe0.png" width="1918" height="935" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">StressChaos on Chaos Dashboard</figcaption></figure><p></p>
<p>The following sections describe how service performance varies under the stress of three chaos conditions:</p>
<ul>
<li class="">
<p>CPU load: 10%; memory load: 128 MB</p>
<p>The first chaos experiment simulates low CPU usage. To display when a chaos experiment starts and ends, click the switching button on the right side of the dashboard. To learn whether the experiment is Applied to the system or Recovered from the system, move your cursor onto the short, green line.</p>
<p>During the time period between the two short, green lines, the service load decreases to 4,929 CPM, but returns to normal after the chaos experiment ends.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Test 1" src="https://chaos-mesh.org/assets/images/cpuload-1-3188bd3a6afc8e73e4e8723b58518b20.png" width="722" height="316" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Test 1</figcaption></figure><p></p>
</li>
<li class="">
<p>CPU load: 50%; memory load: 128 MB</p>
<p>When the application’s CPU load increases to 50%, the service load decreases to 4,307 CPM.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Test 2" src="https://chaos-mesh.org/assets/images/cpuload-2-1ef91964d35ba5f9bceef75075756250.png" width="724" height="321" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Test 2</figcaption></figure><p></p>
</li>
<li class="">
<p>CPU load: 100%; memory load: 128 MB</p>
<p>When the CPU usage is at 100%, the service load decreases to only 40% of what it would be if no chaos experiments were taking place.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Test 3" src="https://chaos-mesh.org/assets/images/cpuload-3-8630b8200eca779f6f534a29ac08a65e.png" width="725" height="321" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Test 3</figcaption></figure><p></p>
<p>Because the process scheduling under the Linux system does not allow a process to occupy the CPU all the time, the deployed Spring Boot Demo can still handle 40% of the access requests even in the extreme case of a full CPU load.</p>
</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="summary">Summary<a href="https://chaos-mesh.org/blog/better-observability-for-chaos-engineering/#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<p>By combining SkyWalking and Chaos Mesh, you can clearly observe when and to what extent chaos experiments affect application service performance. This combination of tools lets you observe the service performance in various extreme conditions, thus boosting your confidence in your services.</p>
<p>Chaos Mesh has grown a lot in 2021 thanks to the unremitting efforts of all PingCAP engineers and community contributors. In order to continue to upgrade our support for our wide variety of users and learn more about users’ experience in Chaos Engineering, we’d like to invite you to take<a href="https://www.surveymonkey.com/r/X77BCNM" target="_blank" rel="noopener noreferrer" class=""> this survey</a> and give us your valuable feedback.</p>
<p>If you want to know more about Chaos Mesh, you’re welcome to join <a href="https://github.com/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">the Chaos Mesh community on GitHub</a> or our <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">Slack discussions</a> (#project-chaos-mesh). If you find any bugs or missing features when using Chaos Mesh, you can submit your pull requests or issues to our <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
            <category>Tutorials</category>
        </item>
        <item>
            <title><![CDATA[Implementing Chaos Engineering in K8s: Chaos Mesh Principle Analysis and Control Plane Development]]></title>
            <link>https://chaos-mesh.org/blog/implement-chaos-engineering-in-k8s/</link>
            <guid>https://chaos-mesh.org/blog/implement-chaos-engineering-in-k8s/</guid>
            <pubDate>Fri, 10 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Implementing Chaos Engineering in K8s]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Implementing Chaos Engineering in K8s" src="https://chaos-mesh.org/assets/images/implement-chaos-engineering-in-k8s-5c4f937587bc5753714f6b0f406f4e63.png" width="1501" height="501" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Implementing Chaos Engineering in K8s</figcaption></figure><p></p>
<p><a href="https://chaos-mesh.org/docs/" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> is an open-source, cloud-native Chaos Engineering platform built on Kubernetes (K8s) custom resource definitions (CRDs). Chaos Mesh can simulate various types of faults and has an enormous capability to orchestrate fault scenarios. You can use Chaos Mesh to conveniently simulate various abnormalities that might occur in development, testing, and production environments and find potential problems in the system.</p>
<!-- -->
<p>In this article, I'll explore the practice of Chaos Engineering in Kubernetes clusters, discuss important Chaos Mesh features through analysis of its source code, and explain how to develop Chaos Mesh's control plane with code examples.</p>
<p>If you're not familiar with Chaos Mesh, please review the <a href="https://chaos-mesh.org/docs/#architecture-overview" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh documentation</a> to get a basic knowledge of Chaos Mesh's architecture.</p>
<p>For the test code in this article, see the <a href="https://github.com/mayocream/chaos-mesh-controlpanel-demo" target="_blank" rel="noopener noreferrer" class="">mayocream/chaos-mesh-controlpanel-demo</a> repository on GitHub.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="how-chaos-mesh-creates-chaos">How Chaos Mesh creates chaos<a href="https://chaos-mesh.org/blog/implement-chaos-engineering-in-k8s/#how-chaos-mesh-creates-chaos" class="hash-link" aria-label="Direct link to How Chaos Mesh creates chaos" title="Direct link to How Chaos Mesh creates chaos" translate="no">​</a></h2>
<p>Chaos Mesh is a Swiss army knife for implementing Chaos Engineering on Kubernetes. This section introduces how it works.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="privileged-mode">Privileged mode<a href="https://chaos-mesh.org/blog/implement-chaos-engineering-in-k8s/#privileged-mode" class="hash-link" aria-label="Direct link to Privileged mode" title="Direct link to Privileged mode" translate="no">​</a></h3>
<p>Chaos Mesh runs privileged containers in Kubernetes to create failures. Chaos Daemon's Pod runs as <code>DaemonSet</code> and adds additional <a href="https://kubernetes.io/docs/concepts/policy/pod-security-policy/#capabilities" target="_blank" rel="noopener noreferrer" class="">capabilities</a> to the Pod's container runtime via the Pod's security context.</p>
<div class="language-yaml codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-yaml codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DaemonSet</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> chaos</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">daemon</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token key atrule" style="color:#00a4db">securityContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> if .Values.chaosDaemon.privileged </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token key atrule" style="color:#00a4db">privileged</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token key atrule" style="color:#00a4db">capabilities</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">             </span><span class="token key atrule" style="color:#00a4db">add</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> SYS_PTRACE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> else </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token key atrule" style="color:#00a4db">capabilities</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">             </span><span class="token key atrule" style="color:#00a4db">add</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> SYS_PTRACE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> NET_ADMIN</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> MKNOD</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> SYS_CHROOT</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> SYS_ADMIN</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> KILL</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token comment" style="color:#999988;font-style:italic"># CAP_IPC_LOCK is used to lock memory</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> IPC_LOCK</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> end </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The Linux capabilities grant containers privileges to create and access the <code>/dev/fuse</code> Filesystem in Userspace (FUSE) pipe. FUSE is the Linux userspace filesystem interface. It lets non-privileged users create their own file systems without editing the kernel code.</p>
<p>According to <a href="https://github.com/chaos-mesh/chaos-mesh/pull/1109" target="_blank" rel="noopener noreferrer" class="">pull request #1109</a> on GitHub, the <code>DaemonSet</code> program uses cgo to call the Linux <code>makedev</code> function to create a FUSE pipe.</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// #include &lt;sys/sysmacros.h&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// #include &lt;sys/types.h&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// // makedev is a macro, so a wrapper is needed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// dev_t Makedev(unsigned int maj, unsigned int min) {</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//   return makedev(maj, min);</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// }</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// EnsureFuseDev ensures /dev/fuse exists. If not, it will create one</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">EnsureFuseDev</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">_</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> os</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Open</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/dev/fuse"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> os</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">IsNotExist</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token comment" style="color:#999988;font-style:italic">// 10, 229 according to https://www.kernel.org/doc/Documentation/admin-guide/devices.txt</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       fuse </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> C</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Makedev</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">229</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       syscall</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Mknod</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/dev/fuse"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0o666</span><span class="token operator" style="color:#393A34">|</span><span class="token plain">syscall</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">S_IFCHR</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">int</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fuse</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>In <a href="https://github.com/chaos-mesh/chaos-mesh/pull/1453" target="_blank" rel="noopener noreferrer" class="">pull request #1453</a>, Chaos Daemon enables privileged mode by default; that is, it sets <code>privileged: true</code> in the container's <code>SecurityContext</code>.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="killing-pods">Killing Pods<a href="https://chaos-mesh.org/blog/implement-chaos-engineering-in-k8s/#killing-pods" class="hash-link" aria-label="Direct link to Killing Pods" title="Direct link to Killing Pods" translate="no">​</a></h3>
<p><code>PodKill</code>, <code>PodFailure</code>, and <code>ContainerKill</code> belong to the <code>PodChaos</code> category. <code>PodKill</code> randomly kills a Pod. It calls the API server to send the kill command.</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string" style="color:#e3116c">"context"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   v1 </span><span class="token string" style="color:#e3116c">"k8s.io/api/core/v1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string" style="color:#e3116c">"sigs.k8s.io/controller-runtime/pkg/client"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> Impl </span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">impl </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">Impl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Apply</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> index </span><span class="token builtin">int</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> records </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Record</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> obj v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">InnerObject</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Phase</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   err </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> impl</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> namespacedName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">pod</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token comment" style="color:#999988;font-style:italic">// TODO: handle this error</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NotInjected</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   err </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> impl</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Delete</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">pod</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DeleteOptions</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       GracePeriodSeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">podchaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GracePeriod</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// PeriodSeconds has to be set specifically</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Injected</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The <code>GracePeriodSeconds</code> parameter lets Kubernetes <a href="https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination-forced" target="_blank" rel="noopener noreferrer" class="">forcibly terminate a Pod</a>. For example, if you need to delete a Pod immediately, use the <code>kubectl delete pod --grace-period=0 --force</code> command.</p>
<p><code>PodFailure</code> patches the Pod object resource to replace the image in the Pod with a wrong one. Chaos only modifies the <code>image</code> fields of <code>containers</code> and <code>initContainers</code>. This is because most of the metadata about a Pod is immutable. For more details, see <a href="https://kubernetes.io/docs/concepts/workloads/pods/#pod-update-and-replacement" target="_blank" rel="noopener noreferrer" class="">Pod update and replacement</a>.</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">impl </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">Impl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Apply</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> index </span><span class="token builtin">int</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> records </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Record</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> obj v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">InnerObject</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Phase</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   pod </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> origin</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">DeepCopy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> index </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">range</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Containers </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       originImage </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Containers</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Image</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       name </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Containers</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       key </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> annotation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GenKeyForImage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">podchaos</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Annotations </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Annotations </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">make</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">map</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">]</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token comment" style="color:#999988;font-style:italic">// If the annotation is already existed, we could skip the reconcile for this container</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">_</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ok </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Annotations</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">key</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> ok </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token keyword" style="color:#00009f">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Annotations</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">key</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> originImage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Containers</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Image </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ControllerCfg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PodFailurePauseImage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> index </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">range</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">InitContainers </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       originImage </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">InitContainers</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Image</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       name </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">InitContainers</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       key </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> annotation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GenKeyForImage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">podchaos</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Annotations </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Annotations </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">make</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">map</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">]</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token comment" style="color:#999988;font-style:italic">// If the annotation is already existed, we could skip the reconcile for this container</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">_</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ok </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Annotations</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">key</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> ok </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token keyword" style="color:#00009f">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Annotations</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">key</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> originImage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">InitContainers</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Image </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ControllerCfg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PodFailurePauseImage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   err </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> impl</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Patch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">MergeFrom</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">origin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token comment" style="color:#999988;font-style:italic">// TODO: handle this error</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NotInjected</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Injected</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The default container image that causes failures is <code>gcr.io/google-containers/pause:latest</code>.</p>
<p><code>PodKill</code> and <code>PodFailure</code> control the Pod lifecycle through the Kubernetes API server. But <code>ContainerKill</code> does this through Chaos Daemon that runs on the cluster node. <code>ContainerKill</code> uses Chaos Controller Manager to run the client to initiate gRPC calls to Chaos Daemon.</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">b </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ChaosDaemonClientBuilder</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pod </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">v1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Pod</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">chaosdaemonclient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ChaosDaemonClientInterface</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   daemonIP</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FindDaemonIP</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   builder </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> grpcUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">daemonIP</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ControllerCfg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ChaosDaemonPort</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithDefaultTimeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ControllerCfg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">TLSConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ChaosMeshCACert </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">TLSFromFile</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ControllerCfg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">TLSConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ChaosMeshCACert</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ControllerCfg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">TLSConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ChaosDaemonClientCert</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ControllerCfg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">TLSConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ChaosDaemonClientKey</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Insecure</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   cc</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> chaosdaemonclient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cc</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>When Chaos Controller Manager sends commands to Chaos Daemon, it creates a corresponding client based on the Pod information. For example, to control a Pod on a node, it creates a client by getting the <code>ClusterIP</code> of the node where the Pod is located. If the Transport Layer Security (TLS) certificate configuration exists, Controller Manager adds the TLS certificate for the client.</p>
<p>When Chaos Daemon starts, if it has a TLS certificate it attaches the certificate to enable gRPCS. The TLS configuration option <code>RequireAndVerifyClientCert</code> indicates whether to enable mutual TLS (mTLS) authentication.</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">newGRPCServer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">containerRuntime </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> reg prometheus</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Registerer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> tlsConf tlsConfig</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Server</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> tlsConf </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tlsConfig</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       caCert</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> ioutil</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ReadFile</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tlsConf</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CaCert</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       caCertPool </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> x509</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewCertPool</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       caCertPool</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AppendCertsFromPEM</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">caCert</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       serverCert</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> tls</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">LoadX509KeyPair</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tlsConf</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Cert</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> tlsConf</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Key</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       creds </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> credentials</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewTLS</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">tls</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Config</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           Certificates</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">tls</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Certificate</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">serverCert</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           ClientCAs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">    caCertPool</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           ClientAuth</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">   tls</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">RequireAndVerifyClientCert</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       grpcOpts </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">grpcOpts</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Creds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">creds</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   s </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewServer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">grpcOpts</span><span class="token operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   grpcMetrics</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">InitializeMetrics</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RegisterChaosDaemonServer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ds</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   reflection</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> s</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Chaos Daemon provides the following gRPC interfaces to call:</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// ChaosDaemonClient is the client API for ChaosDaemon service.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> ChaosDaemonClient </span><span class="token keyword" style="color:#00009f">interface</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">SetTcs</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">TcsRequest</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> opts </span><span class="token operator" style="color:#393A34">...</span><span class="token plain">grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CallOption</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">empty</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Empty</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">FlushIPSets</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">IPSetsRequest</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> opts </span><span class="token operator" style="color:#393A34">...</span><span class="token plain">grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CallOption</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">empty</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Empty</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">SetIptablesChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">IptablesChainsRequest</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> opts </span><span class="token operator" style="color:#393A34">...</span><span class="token plain">grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CallOption</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">empty</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Empty</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">SetTimeOffset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">TimeRequest</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> opts </span><span class="token operator" style="color:#393A34">...</span><span class="token plain">grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CallOption</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">empty</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Empty</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">RecoverTimeOffset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">TimeRequest</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> opts </span><span class="token operator" style="color:#393A34">...</span><span class="token plain">grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CallOption</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">empty</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Empty</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">ContainerKill</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ContainerRequest</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> opts </span><span class="token operator" style="color:#393A34">...</span><span class="token plain">grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CallOption</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">empty</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Empty</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">ContainerGetPid</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ContainerRequest</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> opts </span><span class="token operator" style="color:#393A34">...</span><span class="token plain">grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CallOption</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ContainerResponse</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">ExecStressors</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ExecStressRequest</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> opts </span><span class="token operator" style="color:#393A34">...</span><span class="token plain">grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CallOption</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ExecStressResponse</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">CancelStressors</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">CancelStressRequest</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> opts </span><span class="token operator" style="color:#393A34">...</span><span class="token plain">grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CallOption</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">empty</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Empty</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">ApplyIOChaos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ApplyIOChaosRequest</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> opts </span><span class="token operator" style="color:#393A34">...</span><span class="token plain">grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CallOption</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ApplyIOChaosResponse</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">ApplyHttpChaos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ApplyHttpChaosRequest</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> opts </span><span class="token operator" style="color:#393A34">...</span><span class="token plain">grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CallOption</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ApplyHttpChaosResponse</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">SetDNSServer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">SetDNSServerRequest</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> opts </span><span class="token operator" style="color:#393A34">...</span><span class="token plain">grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CallOption</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">empty</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Empty</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="network-failure-injection">Network failure injection<a href="https://chaos-mesh.org/blog/implement-chaos-engineering-in-k8s/#network-failure-injection" class="hash-link" aria-label="Direct link to Network failure injection" title="Direct link to Network failure injection" translate="no">​</a></h3>
<p>From <a href="https://github.com/chaos-mesh/chaos-mesh/pull/41" target="_blank" rel="noopener noreferrer" class="">pull request #41</a>, we know that Chaos Mesh injects network failures this way: it calls <code>pbClient.SetNetem</code> to encapsulate parameters into a request and send the request to the Chaos Daemon on the node for processing.</p>
<p>The network failure injection code is shown below as it appeared in 2019. As the project developed, the functions were distributed among several files.</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">r </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">Reconciler</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">applyPod</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pod </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">v1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Pod</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> networkchaos </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NetworkChaos</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   pbClient </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewChaosDaemonClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">c</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   containerId </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Status</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ContainerStatuses</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ContainerID</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   netem</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ToNetem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token boolean" style="color:#36acaa">_</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pbClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetNetem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NetemRequest</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       ContainerId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> containerId</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       Netem</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">       netem</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>In the <code>pkg/chaosdaemon</code> package, we can see how Chaos Daemon processes requests.</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">Server</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SetNetem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NetemRequest</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">empty</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Empty</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Info</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Set netem"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Request"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   pid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> s</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">crClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetPidFromContainerID</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ContainerId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> status</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Errorf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">codes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Internal</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"get pid from containerID error: %v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Apply</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Netem</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> status</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Errorf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">codes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Internal</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"netem apply error: %v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">empty</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Empty</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Apply applies a netem on eth0 in pid related namespace</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Apply</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">netem </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Netem</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pid </span><span class="token builtin">uint32</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Info</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Apply netem on PID"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pid"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   ns</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> netns</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetFromPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">GenNetnsPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"failed to find network namespace"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pid"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> errors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Trace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">defer</span><span class="token plain"> ns</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Close</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   handle</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> netlink</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewHandleAt</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ns</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"failed to get handle at network namespace"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"network namespace"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ns</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   link</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> handle</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">LinkByName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"eth0"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// TODO: check whether interface name is eth0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"failed to find eth0 interface"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> errors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Trace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   netemQdisc </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> netlink</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewNetem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">netlink</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">QdiscAttrs</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       LinkIndex</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> link</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Attrs</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Index</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       Handle</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">    netlink</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">MakeHandle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       Parent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">    netlink</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">HANDLE_ROOT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ToNetlinkNetemAttrs</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">netem</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> handle</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">QdiscAdd</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">netemQdisc</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">strings</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Contains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"file exists"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"failed to add Qdisc"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> errors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Trace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Finally, the <a href="https://github.com/vishvananda/netlink" target="_blank" rel="noopener noreferrer" class=""><code>vishvananda/netlink</code> library</a> operates the Linux network interface to complete the job.</p>
<p>From here, <code>NetworkChaos</code> manipulates the Linux host network to create chaos. It includes tools such as iptables and ipset.</p>
<p>In Chaos Daemon's Dockerfile, you can see the Linux tool chain that it depends on:</p>
<div class="language-dockerfile codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">RUN apt-get update &amp;&amp; \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   apt-get install -y tzdata iptables ipset stress-ng iproute2 fuse util-linux procps curl &amp;&amp; \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   rm -rf /var/lib/apt/lists/*</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="stress-test">Stress test<a href="https://chaos-mesh.org/blog/implement-chaos-engineering-in-k8s/#stress-test" class="hash-link" aria-label="Direct link to Stress test" title="Direct link to Stress test" translate="no">​</a></h3>
<p>Chaos Daemon also implements <code>StressChaos</code>. After the Controller Manager calculates the rules, it sends the task to the specific <code>Daemon</code>. The assembled parameters are shown below. They are combined into command execution parameters and appended to the <code>stress-ng</code> command for execution.</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Normalize the stressors to comply with stress-ng</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">Stressors</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Normalize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   stressors </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MemoryStressor </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MemoryStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Workers </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       stressors </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">" --vm %d --vm-keep"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MemoryStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Workers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MemoryStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Size</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MemoryStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Size</span><span class="token punctuation" style="color:#393A34">[</span><span class="token function" style="color:#d73a49">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MemoryStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Size</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token char">'%'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               size</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> units</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FromHumanSize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MemoryStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Size</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               stressors </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">" --vm-bytes %d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> size</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               stressors </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">" --vm-bytes %s"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                   in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MemoryStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Size</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MemoryStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Options </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">_</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> v </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">range</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MemoryStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Options </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               stressors </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">" %v "</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> v</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CPUStressor </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CPUStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Workers </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       stressors </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">" --cpu %d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CPUStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Workers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CPUStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Load </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           stressors </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">" --cpu-load %d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CPUStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Load</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CPUStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Options </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">_</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> v </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">range</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CPUStressor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Options </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               stressors </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">" %v "</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> v</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> stressors</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The Chaos Daemon server side processes the function's execution command to call the official Go package <code>os/exec</code>. For details, see the <a href="https://github.com/chaos-mesh/chaos-mesh/blob/98af3a0e7832a4971d6b133a32069539d982ef0a/pkg/chaosdaemon/stress_server_linux.go#L33" target="_blank" rel="noopener noreferrer" class=""><code>pkg/chaosdaemon/stress_server_linux.go</code></a> file. There is also a file with the same name that ends with darwin. <code>*_darwin</code> files prevent possible errors when the program is running on macOS.</p>
<p>The code uses the <a href="https://github.com/shirou/gopsutil" target="_blank" rel="noopener noreferrer" class=""><code>shirou/gopsutil</code></a> package to obtain the PID process status and reads the stdout and stderr standard outputs. I've seen this processing mode in <a href="https://github.com/hashicorp/go-plugin" target="_blank" rel="noopener noreferrer" class=""><code>hashicorp/go-plugin</code></a>, and go-plugin does this better.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="io-fault-injection">I/O fault injection<a href="https://chaos-mesh.org/blog/implement-chaos-engineering-in-k8s/#io-fault-injection" class="hash-link" aria-label="Direct link to I/O fault injection" title="Direct link to I/O fault injection" translate="no">​</a></h3>
<p><a href="https://github.com/chaos-mesh/chaos-mesh/pull/826" target="_blank" rel="noopener noreferrer" class="">Pull request #826</a> introduces a new implementation of IOChaos, without the use of sidecar injection. It uses Chaos Daemon to directly manipulate the Linux namespace through the underlying commands of the <a href="https://github.com/opencontainers/runc" target="_blank" rel="noopener noreferrer" class="">runc</a> container and runs the <a href="https://github.com/chaos-mesh/toda" target="_blank" rel="noopener noreferrer" class="">chaos-mesh/toda</a> FUSE program developed by Rust to inject container I/O chaos. The <a href="https://pkg.go.dev/github.com/ethereum/go-ethereum/rpc" target="_blank" rel="noopener noreferrer" class="">JSON-RPC 2.0</a> protocol is used to communicate between toda and the control plane.</p>
<p>The new IOChaos implementation doesn't modify the Pod resources. When you define the IOChaos chaos experiment, for each Pod filtered by the selector field, a corresponding PodIOChaos resource is created. PodIoChaos' <a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/owners-dependents/" target="_blank" rel="noopener noreferrer" class="">owner reference</a> is the Pod. At the same time, a set of <a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/finalizers/" target="_blank" rel="noopener noreferrer" class="">finalizers</a> is added to PodIoChaos to release PodIoChaos resources before PodIoChaos is deleted.</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Apply implements the reconciler.InnerReconciler.Apply</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">r </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">Reconciler</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Apply</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> req ctrl</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Request</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> chaos v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">InnerObject</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   iochaos</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ok </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> chaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">IoChaos</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">ok </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> errors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"chaos is not IoChaos"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"chaos is not IoChaos"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"chaos"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> chaos</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   source </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> iochaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Namespace </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> iochaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   m </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> podiochaosmanager</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">source</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Log</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Client</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   pods</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> utils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SelectAndFilterPods</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Client</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Reader</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">iochaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"failed to select and filter pods"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Info</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"applying iochaos"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"iochaos"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> iochaos</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">_</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pod </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">range</span><span class="token plain"> pods </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       t </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> m</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithInit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">types</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NamespacedName</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           Name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">      pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           Namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Namespace</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token comment" style="color:#999988;font-style:italic">// TODO: support chaos on multiple volume</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       t</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetVolumePath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">iochaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">VolumePath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       t</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">IoChaosAction</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> iochaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Action</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           Filter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Filter</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               Path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">    iochaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Path</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               Percent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> iochaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Percent</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               Methods</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> iochaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Methods</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           Faults</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">IoFault</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                   Errno</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">  iochaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Errno</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                   Weight</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           Latency</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">          iochaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Delay</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           AttrOverrideSpec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> iochaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Attr</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           Source</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">           m</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Source</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       key</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> cache</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">MetaNamespaceKeyFunc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">pod</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       iochaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Finalizers </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> utils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">InsertFinalizer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">iochaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Finalizers</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> key</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Info</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"commiting updates of podiochaos"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   err </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> m</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Commit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"fail to commit"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Event</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">iochaos</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> v1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">EventTypeNormal</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> utils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">EventChaosInjected</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>In the controller of the PodIoChaos resource, Controller Manager encapsulates the resource into parameters and calls the Chaos Daemon interface to process the parameters.</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Apply flushes io configuration on pod</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">h </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">Handler</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Apply</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> chaos </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PodIoChaos</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   h</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Info</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"updating io chaos"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pod"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> chaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Namespace</span><span class="token operator" style="color:#393A34">+</span><span class="token string" style="color:#e3116c">"/"</span><span class="token operator" style="color:#393A34">+</span><span class="token plain">chaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"spec"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> chaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   res</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> pbClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ApplyIoChaos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ApplyIoChaosRequest</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       Actions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">     input</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       Volume</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">      chaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">VolumeMountPath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       ContainerId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> containerID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       Instance</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">  chaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Pid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       StartTime</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> chaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StartTime</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   chaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Pid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Instance</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   chaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Spec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StartTime </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StartTime</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   chaos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">OwnerReferences </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">metav1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">OwnerReference</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           APIVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">APIVersion</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           Kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">       pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Kind</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           Name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">       pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           UID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">        pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">UID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The <code>pkg/chaosdaemon/iochaos_server.go</code> file processes IOChaos. ​​In this file, a FUSE program needs to be injected into the container. As discussed in issue <a href="https://github.com/chaos-mesh/chaos-mesh/issues/2305" target="_blank" rel="noopener noreferrer" class="">#2305</a> on GitHub, the <code>/usr/local/bin/nsexec -l- p /proc/119186/ns/pid -m /proc/119186/ns/mnt - /usr/local/bin/toda --path /tmp --verbose info</code> command is executed to run the toda program under the same namespace as the Pod.</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">DaemonServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ApplyIOChaos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ApplyIOChaosRequest</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ApplyIOChaosResponse</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   pid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> s</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">crClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetPidFromContainerID</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ContainerId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"error while getting PID"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   args </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"--path %s --verbose info"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Volume</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Info</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"executing"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cmd"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> todaBin</span><span class="token operator" style="color:#393A34">+</span><span class="token string" style="color:#e3116c">" "</span><span class="token operator" style="color:#393A34">+</span><span class="token plain">args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   processBuilder </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> bpm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">DefaultProcessBuilder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">todaBin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> strings</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Split</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">args</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" "</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token function" style="color:#d73a49">EnableLocalMnt</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token function" style="color:#d73a49">SetIdentifier</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ContainerId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">EnterNS </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       processBuilder </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> processBuilder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetNS</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> bpm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MountNS</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetNS</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> bpm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PidNS</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">// Calls JSON RPC</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   client</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> jrpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">DialIO</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> receiver</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> caller</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   cmd </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> processBuilder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   procState</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> s</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">backgroundProcessManager</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">StartProcess</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The following code sample builds the running commands. These commands are the underlying namespace isolation implementation of runc:</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// GetNsPath returns corresponding namespace path</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetNsPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pid </span><span class="token builtin">uint32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> typ NsType</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"%s/%d/ns/%s"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> DefaultProcPrefix</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">typ</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// SetNS sets the namespace of the process</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">b </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ProcessBuilder</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SetNS</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pid </span><span class="token builtin">uint32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> typ NsType</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ProcessBuilder </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetNSOpt</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">nsOption</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       Typ</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">  typ</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       Path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetNsPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> typ</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Build builds the process</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">b </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ProcessBuilder</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ManagedProcess </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   args </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">args</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   cmd </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cmd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">b</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">nsOptions</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       args </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"--"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cmd</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> args</span><span class="token operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">_</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> option </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">range</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">nsOptions </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           args </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"-"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> nsArgMap</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">option</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Typ</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> option</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Path</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> args</span><span class="token operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">localMnt </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           args </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"-l"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> args</span><span class="token operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       cmd </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> nsexecPath</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="control-plane">Control plane<a href="https://chaos-mesh.org/blog/implement-chaos-engineering-in-k8s/#control-plane" class="hash-link" aria-label="Direct link to Control plane" title="Direct link to Control plane" translate="no">​</a></h2>
<p>Chaos Mesh is an open-source chaos engineering system under the Apache 2.0 protocol. As discussed above, it has rich capabilities and a good ecosystem. The maintenance team developed the <a href="https://github.com/chaos-mesh/toda" target="_blank" rel="noopener noreferrer" class=""><code>chaos-mesh/toda</code></a> FUSE based on the chaos system, the <a href="https://github.com/chaos-mesh/k8s_dns_chaos" target="_blank" rel="noopener noreferrer" class=""><code>chaos-mesh/k8s_dns_chaos</code></a> CoreDNS chaos plug-in, and Berkeley Packet Filter (BPF)-based kernel error injection <a href="https://github.com/chaos-mesh/bpfki" target="_blank" rel="noopener noreferrer" class=""><code>chaos-mesh/bpfki</code></a>.</p>
<p>Now, I'll describe the server side code required to build an end-user-oriented chaos engineering platform. This implementation is only an example—not necessarily the best example. If you want to see the development practice on a real world platform, you can refer to Chaos Mesh's <a href="https://github.com/chaos-mesh/chaos-mesh/tree/master/pkg/dashboard" target="_blank" rel="noopener noreferrer" class="">Dashboard</a>. It uses the <a href="https://github.com/uber-go/fx" target="_blank" rel="noopener noreferrer" class=""><code>uber-go/fx</code></a> dependency injection framework and the controller runtime's manager mode.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="key-chaos-mesh-features">Key Chaos Mesh features<a href="https://chaos-mesh.org/blog/implement-chaos-engineering-in-k8s/#key-chaos-mesh-features" class="hash-link" aria-label="Direct link to Key Chaos Mesh features" title="Direct link to Key Chaos Mesh features" translate="no">​</a></h3>
<p>As shown in the Chaos Mesh workflow below, we need to implement a server that sends YAML to the Kubernetes API. Chaos Controller Manager implements complex rule verification and rule delivery to Chaos Daemon. If you want to use Chaos Mesh with your own platform, you only need to connect to the process of creating CRD resources.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh&amp;#39;s basic workflow" src="https://chaos-mesh.org/assets/images/chaos-mesh-basic-workflow-a6bb873fee227b7c73859c4f6937c1a0.png" width="1080" height="498" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh's basic workflow</figcaption></figure><p></p>
<p>Let's take a look at the example on the Chaos Mesh website:</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string" style="color:#e3116c">"context"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string" style="color:#e3116c">"github.com/pingcap/chaos-mesh/api/v1alpha1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string" style="color:#e3116c">"sigs.k8s.io/controller-runtime/pkg/client"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   delay </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">chaosv1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NetworkChaos</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       Spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> chaosv1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NetworkChaosSpec</span><span class="token punctuation" style="color:#393A34">{</span><span class="token operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   k8sClient </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">conf</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Options</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Scheme</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> scheme</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Scheme </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   k8sClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">TODO</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> delay</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   k8sClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Delete</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">TODO</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> delay</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Chaos Mesh provides APIs corresponding to all CRDs. We use the <a href="https://github.com/kubernetes-sigs/controller-runtime" target="_blank" rel="noopener noreferrer" class="">controller-runtime</a> developed by Kubernetes <a href="https://github.com/kubernetes/community/tree/master/sig-api-machinery" target="_blank" rel="noopener noreferrer" class="">API Machinery SIG</a> to simplify the interaction with the Kubernetes API.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="inject-chaos">Inject chaos<a href="https://chaos-mesh.org/blog/implement-chaos-engineering-in-k8s/#inject-chaos" class="hash-link" aria-label="Direct link to Inject chaos" title="Direct link to Inject chaos" translate="no">​</a></h3>
<p>Suppose we want to create a <code>PodKill</code> resource by calling a program. After the resource is sent to the Kubernetes API server, it passes Chaos Controller Manager's <a href="https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/" target="_blank" rel="noopener noreferrer" class="">validating admission controller</a> to verify data. When we create a chaos experiment, if the admission controller fails to verify the input data, it returns an error to the client. For specific parameters, you can read <a href="https://chaos-mesh.org/docs/simulate-pod-chaos-on-kubernetes/#create-experiments-using-yaml-configuration-files" target="_blank" rel="noopener noreferrer" class="">Create experiments using YAML configuration files</a>.</p>
<p><code>NewClient</code> creates a Kubernetes API client. You can refer to this example:</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string" style="color:#e3116c">"context"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string" style="color:#e3116c">"controlpanel"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string" style="color:#e3116c">"log"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string" style="color:#e3116c">"github.com/chaos-mesh/chaos-mesh/api/v1alpha1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string" style="color:#e3116c">"github.com/pkg/errors"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   metav1 </span><span class="token string" style="color:#e3116c">"k8s.io/apimachinery/pkg/apis/meta/v1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">applyPodKill</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> namespace </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> labels </span><span class="token keyword" style="color:#00009f">map</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">]</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   cli</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> controlpanel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> errors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Wrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"create client"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   cr </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PodChaos</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       ObjectMeta</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> metav1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ObjectMeta</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           GenerateName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           Namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">    namespace</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       Spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PodChaosSpec</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           Action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PodKillAction</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           ContainerSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ContainerSelector</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               PodSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PodSelector</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                   Mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">OnePodMode</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                   Selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PodSelectorSpec</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                       Namespaces</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">     </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">namespace</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                       LabelSelectors</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> labels</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> cli</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cr</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> errors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Wrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"create podkill"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The log output of the running program is:</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">I1021 00:51:55.225502   </span><span class="token number" style="color:#36acaa">23781</span><span class="token plain"> request.go:665</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Waited </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain">.033116256s due to client-side throttling, not priority and fairness, request: GET:https://***</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2021</span><span class="token plain">/10/21 00:51:56 apply podkill</span><br></div></code></pre></div></div>
<p>Use kubectl to check the status of the <code>PodKill</code> resource:</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">$ k describe podchaos.chaos-mesh.org </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> dev podkillvjn77</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Name:         podkillvjn77</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Namespace:    dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Labels:       </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">none</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Annotations:  </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">none</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">API Version:  chaos-mesh.org/v1alpha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Kind:         PodChaos</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Metadata:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Creation Timestamp:  </span><span class="token number" style="color:#36acaa">2021</span><span class="token plain">-10-20T16:51:56Z</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Finalizers:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   chaos-mesh/records</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Generate Name:     podkill</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Generation:        </span><span class="token number" style="color:#36acaa">7</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Resource Version:  </span><span class="token number" style="color:#36acaa">938921488</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Self Link:         /apis/chaos-mesh.org/v1alpha1/namespaces/dev/podchaos/podkillvjn77</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token environment constant" style="color:#36acaa">UID</span><span class="token builtin class-name">:</span><span class="token plain">               afbb40b3-ade8-48ba-89db-04918d89fd0b</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Spec:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Action:        pod-kill</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Grace Period:  </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Mode:          one</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Selector:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Label Selectors:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     app:  nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Namespaces:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Status:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Conditions:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Reason:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Status:  False</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Type:    Paused</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Reason:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Status:  True</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Type:    Selected</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Reason:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Status:  True</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Type:    AllInjected</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Reason:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Status:  False</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Type:    AllRecovered</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Experiment:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Container Records:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     Id:            dev/nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     Phase:         Injected</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     Selector Key:  </span><span class="token builtin class-name">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Desired Phase:   Run</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Events:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Type    Reason           Age    From          Message</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ----    ------           ----   ----          -------</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Normal  FinalizerInited  6m35s  finalizer     Finalizer has been inited</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Normal  Updated          6m35s  finalizer     Successfully update finalizer of resource</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Normal  Updated          6m35s  records       Successfully update records of resource</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Normal  Updated          6m35s  desiredphase  Successfully update desiredPhase of resource</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Normal  Applied          6m35s  records       Successfully apply chaos </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> dev/nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Normal  Updated          6m35s  records       Successfully update records of resource</span><br></div></code></pre></div></div>
<p>The control plane also needs to query and acquire Chaos resources, so that platform users can view all chaos experiments' implementation status and manage them. To achieve this, we can call the <code>REST</code> API to send the <code>Get</code> or <code>List</code> request. But in practice, we need to pay attention to the details. At our company, we've noticed that each time the controller requests the full amount of resource data, the load of the Kubernetes API server increases.</p>
<p>I recommend that you read the <a href="https://zoetrope.github.io/kubebuilder-training/controller-runtime/client.html" target="_blank" rel="noopener noreferrer" class="">How to use the controller-runtime client</a> (in Japanese) controller runtime tutorial. If you don't understand Japanese, you can still learn a lot from the tutorial by reading the source code. It covers many details. For example, by default, the controller runtime reads kubeconfig, flags, environment variables, and the service account automatically mounted in the Pod from multiple locations. <a href="https://github.com/armosec/kubescape/pull/21" target="_blank" rel="noopener noreferrer" class="">Pull request #21</a> for <a href="https://github.com/armosec/kubescape" target="_blank" rel="noopener noreferrer" class=""><code>armosec/kubescape</code></a> uses this feature. This tutorial also includes common operations, such as how to paginate, update, and overwrite objects. I haven't seen any English tutorials that are so detailed.</p>
<p>Here are examples of <code>Get</code> and <code>List</code> requests:</p>
<div class="language-go codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-go codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> controlpanel</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string" style="color:#e3116c">"context"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string" style="color:#e3116c">"github.com/chaos-mesh/chaos-mesh/api/v1alpha1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string" style="color:#e3116c">"github.com/pkg/errors"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string" style="color:#e3116c">"sigs.k8s.io/controller-runtime/pkg/client"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetPodChaos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> namespace </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PodChaos</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   cli </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> mgr</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   item </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PodChaos</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> cli</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ObjectKey</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">Name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> namespace</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> item</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> errors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Wrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"get cr"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> item</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ListPodChaos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">namespace </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> labels </span><span class="token keyword" style="color:#00009f">map</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">]</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PodChaos</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   cli </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> mgr</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   list </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">v1alpha1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PodChaosList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> cli</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">List</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> list</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">InNamespace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">namespace</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">MatchingLabels</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">labels</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> list</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Items</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>This example uses the manager. This mode prevents the cache mechanism from repetitively fetching large amounts of data. The following <a href="https://zoetrope.github.io/kubebuilder-training/controller-runtime/client.html" target="_blank" rel="noopener noreferrer" class="">figure</a> shows the workflow:</p>
<ol>
<li class="">
<p>Get the Pod.</p>
</li>
<li class="">
<p>Get the <code>List</code> request's full data for the first time.</p>
</li>
<li class="">
<p>Update the cache when the watch data changes.</p>
</li>
</ol>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="List request" src="https://chaos-mesh.org/assets/images/list-request-b298567f9c086451aadb8af9ee13c438.png" width="1080" height="608" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">List request</figcaption></figure><p></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="orchestrate-chaos">Orchestrate chaos<a href="https://chaos-mesh.org/blog/implement-chaos-engineering-in-k8s/#orchestrate-chaos" class="hash-link" aria-label="Direct link to Orchestrate chaos" title="Direct link to Orchestrate chaos" translate="no">​</a></h3>
<p>The container runtime interface (CRI) container runtime provides strong underlying isolation capabilities that can support the stable operation of the container. But for more complex and scalable scenarios, container orchestration is required. Chaos Mesh also provides <a href="https://chaos-mesh.org/docs/define-scheduling-rules/" target="_blank" rel="noopener noreferrer" class=""><code>Schedule</code></a> and <a href="https://chaos-mesh.org/docs/create-chaos-mesh-workflow/" target="_blank" rel="noopener noreferrer" class=""><code>Workflow</code></a> features. Based on the set <code>Cron</code> time, <code>Schedule</code> can trigger faults regularly and at intervals. <code>Workflow</code> can schedule multiple fault tests like Argo Workflows.</p>
<p>Chaos Controller Manager does most of the work for us. The control plane mainly manages these YAML resources. You only need to consider the features you want to provide to end users.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="platform-features">Platform features<a href="https://chaos-mesh.org/blog/implement-chaos-engineering-in-k8s/#platform-features" class="hash-link" aria-label="Direct link to Platform features" title="Direct link to Platform features" translate="no">​</a></h3>
<p>The following figure shows Chaos Mesh Dashboard. We need to consider what features the platform should provide to end users.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh Dashboard" src="https://chaos-mesh.org/assets/images/chaos-mesh-dashboard-k8s-9a6b7addd60fb08838e1f223c6760ef5.png" width="3802" height="1930" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh Dashboard</figcaption></figure><p></p>
<p>From the Dashboard, we know that the platform may have these features:</p>
<ul>
<li class="">Chaos injection</li>
<li class="">Pod crash</li>
<li class="">Network failure</li>
<li class="">Load test</li>
<li class="">I/O failure</li>
<li class="">Event tracking</li>
<li class="">Associated alarm</li>
<li class="">Timing telemetry</li>
</ul>
<p>If you are interested in Chaos Mesh and would like to improve it, join its <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">Slack channel</a> (#project-chaos-mesh) or submit your pull requests or issues to its <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
        </item>
        <item>
            <title><![CDATA[Hacktoberfest 2021: hack with Chaos Mesh!]]></title>
            <link>https://chaos-mesh.org/blog/chaos-mesh-hacktoberfest-2021/</link>
            <guid>https://chaos-mesh.org/blog/chaos-mesh-hacktoberfest-2021/</guid>
            <pubDate>Tue, 28 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Chaos Mesh x Hacktoberfest 2021]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh x Hacktoberfest 2021" src="https://chaos-mesh.org/assets/images/chaos-mesh-hacktoberfest-2021-134ce78502c4189aa98edb62e7b3a4cf.png" width="1800" height="600" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh x Hacktoberfest 2021</figcaption></figure><p></p>
<p>Happy <a href="https://hacktoberfest.digitalocean.com/" target="_blank" rel="noopener noreferrer" class="">Hacktoberfest</a> 2021! We are excited to announce that <a href="https://github.com/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> will be participating in the 8th annual Hacktoberfest hosted by DigitalOcean. During the month of October, anyone is welcome to join in on this global celebration of open-source by contributing changes, and earn one of 55,000 custom-made Hacktoberfest T-shirts!</p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="what-is-chaos-mesh">What is Chaos Mesh?<a href="https://chaos-mesh.org/blog/chaos-mesh-hacktoberfest-2021/#what-is-chaos-mesh" class="hash-link" aria-label="Direct link to What is Chaos Mesh?" title="Direct link to What is Chaos Mesh?" translate="no">​</a></h2>
<p>Chaos Mesh is a cloud-native Chaos Engineering platform that orchestrates chaos in Kubernetes environments. With Chaos Mesh, you can test your system's resilience and robustness on Kubernetes by injecting all types of faults into Pods, network, file system, and even the kernel. Chaos Mesh is currently a CNCF Sandbox project.</p>
<p>More importantly, Chaos Mesh fully embraces open source: ever since open sourced 1.5 years ago, the project has gained more than 4k stars with over 1.2k commits from 140+ contributors all over the world. It is through the open-source world that we are able to collaborate with an amazing community. Simply put, Chaos Mesh grew alongside its community and would not be where it is today without the dedication and commitment to open source, which is why we are more than proud to be back again in Hacktoberfest!</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="why-hacktoberfest">Why Hacktoberfest?<a href="https://chaos-mesh.org/blog/chaos-mesh-hacktoberfest-2021/#why-hacktoberfest" class="hash-link" aria-label="Direct link to Why Hacktoberfest?" title="Direct link to Why Hacktoberfest?" translate="no">​</a></h2>
<p>If you are interested in chaos engineering, open-source, trying to come up with a project for school, or looking into a potential career path as an SRE/DevOps engineer, then this is your golden opportunity: throughout Hacktoberfest, anyone, regardless of background and experience, can join and contribute changes - big or small. So grab the chance and learn about how to make a system more resilient! The Chaos Mesh community welcomes you with open arms and is more than willing to work and share feedback with you. Your contributions can make a big difference!</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="quick-start">Quick start<a href="https://chaos-mesh.org/blog/chaos-mesh-hacktoberfest-2021/#quick-start" class="hash-link" aria-label="Direct link to Quick start" title="Direct link to Quick start" translate="no">​</a></h2>
<p>Here’s a quick run-through of how to be part of Hacktoberfest 2021, and you can check out a detailed how to be part of Hacktoberfest on the <a href="https://hacktoberfest.digitalocean.com/participation" target="_blank" rel="noopener noreferrer" class="">official website</a>:</p>
<ol>
<li class="">Sign up for <a href="https://hacktoberfest.digitalocean.com/" target="_blank" rel="noopener noreferrer" class="">Hacktoberfest</a> anytime between Oct 1 and Oct 31.</li>
<li class="">Join the #project-chaos-mesh channel under <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">CNCF Slack</a>, just in case you have any questions, or need help.</li>
<li class="">Start creating and submitting your PRs! Here are some top tips:<!-- -->
<ol>
<li class="">Check out the <a href="https://github.com/chaos-mesh/chaos-mesh/blob/master/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh Contribution guide</a> before making contributions.</li>
<li class="">Have a go at any <a href="https://github.com/chaos-mesh/chaos-mesh/issues" target="_blank" rel="noopener noreferrer" class="">issue</a> labeled with "Hacktoberfest", note that these are the ones that we think might be good for those new to open source or Chaos Mesh, so it only serves as a starting point!</li>
</ol>
</li>
</ol>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="some-notes">Some notes<a href="https://chaos-mesh.org/blog/chaos-mesh-hacktoberfest-2021/#some-notes" class="hash-link" aria-label="Direct link to Some notes" title="Direct link to Some notes" translate="no">​</a></h2>
<ul>
<li class="">To get a shirt, you must make 4 approved PRs on opted-in projects between October 1-31 in any time zone. If a repository has no “Hacktoberfest” topic set, please reach out to us or mention Hacktoberfest in your PR so we can set repository topics.</li>
<li class="">No spams please (e.g. creating a PR just for the sake of it and not adding any value in any way)! Our maintainer will mark a PR as invalid if it’s determined to be spam, which does NOT count towards your PR total.</li>
<li class="">Note that if our maintainer reports behavior that’s not in line with the <a href="https://github.com/chaos-mesh/chaos-mesh/blob/master/CODE_OF_CONDUCT.md" target="_blank" rel="noopener noreferrer" class="">code of conduct</a>, you will be ineligible to participate.</li>
</ul>
<p>Lastly, good luck, on your marks, get set, and hack away!</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
            <category>Open Source</category>
        </item>
        <item>
            <title><![CDATA[How to run chaos experiments on your physical machine]]></title>
            <link>https://chaos-mesh.org/blog/run-chaos-experiments-on-physical-machines/</link>
            <guid>https://chaos-mesh.org/blog/run-chaos-experiments-on-physical-machines/</guid>
            <pubDate>Wed, 15 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[How to run chaos experiments on your physical machine]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="How to run chaos experiments on your physical machine" src="https://chaos-mesh.org/assets/images/chaosd-banner-6413d02bac6388c2e814e3555020d8cd.png" width="1501" height="501" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">How to run chaos experiments on your physical machine</figcaption></figure><p></p>
<p><a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> is a cloud-native Chaos Engineering platform that orchestrates chaos in Kubernetes environments. With Chaos Mesh, you can simulate a variety of failures, and use Chaos Dashboard, a web UI, to manage chaos experiments directly. Since it was open-sourced, Chaos Mesh has been adopted by many companies to ensure their systems’ resilience and robustness. But over the past year, we have frequently heard requests from the community asking how to run chaos experiments when the services are not deployed on Kubernetes.</p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="what-is-chaosd">What is chaosd<a href="https://chaos-mesh.org/blog/run-chaos-experiments-on-physical-machines/#what-is-chaosd" class="hash-link" aria-label="Direct link to What is chaosd" title="Direct link to What is chaosd" translate="no">​</a></h2>
<p>To meet the growing needs of chaos testing on physical machines, we are excited to present an enhanced toolkit called chaosd. You might find the name familiar. That’s because it evolved from <code>chaos-daemon</code>, a key component in Chaos Mesh. At TiDB Hackathon 2020, we <a href="https://pingcap.com/blog/chaos-mesh-remake-one-step-closer-toward-chaos-as-a-service#refactor-chaosd" target="_blank" rel="noopener noreferrer" class="">refactored chaosd to make it more than a command-line tool</a>. Now with <a href="https://github.com/chaos-mesh/chaosd/releases/tag/v1.0.1" target="_blank" rel="noopener noreferrer" class="">chaosd v1.0.1</a>, you can simulate specific errors that target physical machines, and then, undo the chaos experiments like nothing had happened.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="benefits-of-chaosd">Benefits of chaosd<a href="https://chaos-mesh.org/blog/run-chaos-experiments-on-physical-machines/#benefits-of-chaosd" class="hash-link" aria-label="Direct link to Benefits of chaosd" title="Direct link to Benefits of chaosd" translate="no">​</a></h2>
<p>chaosd has the following advantages:</p>
<ul>
<li class=""><strong>Easy-to-use</strong>: You can easily create and manage chaos experiments with chaosd commands.</li>
<li class=""><strong>Various fault types</strong>: You can simulate faults to be injected on physical machines at different levels, including process faults, network faults, Java Virtual Machine (JVM) application faults, stress scenarios, disk faults, and host faults.</li>
<li class=""><strong>Multiple work modes</strong>: You can use chaosd as a command-line tool or as a service.</li>
</ul>
<p>Without further ado, let’s give it a try.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="how-to-use-chaosd">How to use chaosd<a href="https://chaos-mesh.org/blog/run-chaos-experiments-on-physical-machines/#how-to-use-chaosd" class="hash-link" aria-label="Direct link to How to use chaosd" title="Direct link to How to use chaosd" translate="no">​</a></h2>
<p>In this section, I will walk you through how to inject a network fault with chaosd. Your glibc version must be v2.17 or later versions.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="1-download-and-unzip-chaosd">1. Download and unzip chaosd<a href="https://chaos-mesh.org/blog/run-chaos-experiments-on-physical-machines/#1-download-and-unzip-chaosd" class="hash-link" aria-label="Direct link to 1. Download and unzip chaosd" title="Direct link to 1. Download and unzip chaosd" translate="no">​</a></h3>
<p>To download chaosd, run the following command:</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-fsSL</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> chaosd-v1.0.1-linux-amd64.tar.gz https://mirrors.chaos-mesh.org/chaosd-v1.0.1-linux-amd64.tar.gz</span><br></div></code></pre></div></div>
<p>Unzip the file. It contains two file folders:</p>
<ul>
<li class=""><code>chaosd</code> contains the tool entry of chaosd.</li>
<li class=""><code>tools</code> contains the tools needed to perform the chaos experiment, including <a href="https://wiki.ubuntu.com/Kernel/Reference/stress-ng" target="_blank" rel="noopener noreferrer" class="">stress-ng</a> (to simulate stress scenarios), <a href="https://github.com/chaos-mesh/byteman" target="_blank" rel="noopener noreferrer" class="">Byteman</a> (to simulate JVM application faults), and PortOccupyTool (to simulate network faults).</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="2-create-a-chaos-experiment">2. Create a chaos experiment<a href="https://chaos-mesh.org/blog/run-chaos-experiments-on-physical-machines/#2-create-a-chaos-experiment" class="hash-link" aria-label="Direct link to 2. Create a chaos experiment" title="Direct link to 2. Create a chaos experiment" translate="no">​</a></h3>
<p>In this chaos experiment, the server will be unable to access chaos-mesh.org.</p>
<p>Run the following command:</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> ./chaosd attack network loss </span><span class="token parameter variable" style="color:#36acaa">--percent</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--hostname</span><span class="token plain"> chaos-mesh.org </span><span class="token parameter variable" style="color:#36acaa">--device</span><span class="token plain"> ens33</span><br></div></code></pre></div></div>
<p>Example output:</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">Attack network successfully, uid: c55a84c5-c181-426b-ae31-99c8d4615dbe</span><br></div></code></pre></div></div>
<p>In this simulation, the ens33 network interface card cannot send network packets to or receive packets from <a href="http://chaos-mesh.org/" target="_blank" rel="noopener noreferrer" class="">chaos-mesh.org</a>. The reason why you have to use <code>sudo</code> commands is that the chaos experiment modifies network rules, which require root privileges.</p>
<p>Also, don’t forget to save the <code>uid</code> of the chaos experiment. You’ll be entering that later as part of the recovery process.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="3-verify-the-results">3. Verify the results<a href="https://chaos-mesh.org/blog/run-chaos-experiments-on-physical-machines/#3-verify-the-results" class="hash-link" aria-label="Direct link to 3. Verify the results" title="Direct link to 3. Verify the results" translate="no">​</a></h3>
<p>Use the <code>ping</code> command to see if the server can access chaos-mesh.org:</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">ping</span><span class="token plain"> chaos-mesh.org</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">PING chaos-mesh.org </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">185.199</span><span class="token plain">.109.153</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">56</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">84</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> bytes of data.</span><br></div></code></pre></div></div>
<p>When you execute the command, it’s very likely that the site won’t respond. Press <code>CTRL</code>+<code>C</code> to stop the ping process. You should be able to see the statistics of the <code>ping</code> command: <code>100% packet loss</code>.</p>
<p>Example output:</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token number" style="color:#36acaa">2</span><span class="token plain"> packets transmitted, </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> received, </span><span class="token number" style="color:#36acaa">100</span><span class="token plain">% packet loss, </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> 1021ms</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="4-recover-the-experiment">4. Recover the experiment<a href="https://chaos-mesh.org/blog/run-chaos-experiments-on-physical-machines/#4-recover-the-experiment" class="hash-link" aria-label="Direct link to 4. Recover the experiment" title="Direct link to 4. Recover the experiment" translate="no">​</a></h3>
<p>To recover the experiment, run the following command:</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> ./chaosd recover c55a84c5-c181-426b-ae31-99c8d4615dbe</span><br></div></code></pre></div></div>
<p>Example output:</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">Recover c55a84c5-c181-426b-ae31-99c8d4615dbe successfully</span><br></div></code></pre></div></div>
<p>In this step, you also need to use <code>sudo</code> commands because root privileges are required. When you finish recovering the experiment, try to ping chaos-mesh.org again to verify the connection.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="next-steps">Next steps<a href="https://chaos-mesh.org/blog/run-chaos-experiments-on-physical-machines/#next-steps" class="hash-link" aria-label="Direct link to Next steps" title="Direct link to Next steps" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="support-dashboard-web">Support dashboard web<a href="https://chaos-mesh.org/blog/run-chaos-experiments-on-physical-machines/#support-dashboard-web" class="hash-link" aria-label="Direct link to Support dashboard web" title="Direct link to Support dashboard web" translate="no">​</a></h3>
<p>As you can see, chaosd is fairly easy to use. But we can make it easier—a dashboard web for chaosd is currently under extensive development.</p>
<p>We will continue to enhance its usability and implement more functionalities such as managing chaos experiments run with chaosd as well as those run with Chaos Mesh. This will provide a consistent and unified user experience for chaos testing on Kubernetes and physical machines. The architecture below is just a simple example:</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh&amp;#39;s optimized architecture" src="https://chaos-mesh.org/assets/images/chaos-mesh-optimized-architecture-2d9e6f288bb22da9da229dd5f6d63630.png" width="1999" height="1073" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh's optimized architecture</figcaption></figure><p></p>
<p>For more, check out <a href="https://pingcap.com/blog/chaos-mesh-remake-one-step-closer-toward-chaos-as-a-service#developing-chaos-mesh-towards-caas" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh's optimized architecture</a>.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="add-more-fault-injection-types">Add more fault injection types<a href="https://chaos-mesh.org/blog/run-chaos-experiments-on-physical-machines/#add-more-fault-injection-types" class="hash-link" aria-label="Direct link to Add more fault injection types" title="Direct link to Add more fault injection types" translate="no">​</a></h3>
<p>Currently, chaosd provides six fault injection types. We plan to develop more types that have been supported by Chaos Mesh, including HTTPChaos and IOChaos.</p>
<p>If you are interested in helping us improve chaosd, you are welcome to <a href="https://github.com/chaos-mesh/chaosd/labels/help%20wanted" target="_blank" rel="noopener noreferrer" class="">pick an issue</a> and get started!</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="try-it-out">Try it out!<a href="https://chaos-mesh.org/blog/run-chaos-experiments-on-physical-machines/#try-it-out" class="hash-link" aria-label="Direct link to Try it out!" title="Direct link to Try it out!" translate="no">​</a></h2>
<p>If you are interested in using chaosd and want to explore more, check out the <a href="https://chaos-mesh.org/docs/chaosd-overview" target="_blank" rel="noopener noreferrer" class="">documentation</a>. If you come across an issue when you run chaosd, or if you have a feature request, feel free to <a href="https://github.com/chaos-mesh/chaosd/issues" target="_blank" rel="noopener noreferrer" class="">create an issue</a>. We would love to hear your voice!</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
            <category>Chaosd</category>
        </item>
        <item>
            <title><![CDATA[Securing Online Gaming: Combine Chaos Engineering with DevOps Practices]]></title>
            <link>https://chaos-mesh.org/blog/Securing-Online-Gaming-Combine-Chaos-Engineering-with-DevOps-Practices/</link>
            <guid>https://chaos-mesh.org/blog/Securing-Online-Gaming-Combine-Chaos-Engineering-with-DevOps-Practices/</guid>
            <pubDate>Thu, 26 Aug 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Securing Online Gaming: Combine Chaos Engineering with DevOps Practices]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Securing Online Gaming: Combine Chaos Engineering with DevOps Practices" src="https://chaos-mesh.org/assets/images/chaos-mesh-tencent-ieg-3119a610ddb42163cb244e562167f680.jpeg" width="1200" height="400" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Securing Online Gaming: Combine Chaos Engineering with DevOps Practices</figcaption></figure><p></p>
<p>Interactive Entertainment Group (IEG) is a division of Tencent Holdings that focuses on the development of online video games and other digital content such as live broadcasts. It is well-known for being the publisher of some of the most popular video games.</p>
<!-- -->
<p>In this article, I will explain why and how we introduce chaos engineering into our DevOps process.</p>
<p>For each day, we handle over 10,000,000 total visits, and, during peak hours, we process over 1,000,000 queries per second (QPS). To guarantee players a fun and engaging experience, we launch various daily or seasonal game events. Sometimes, that means we must update the event code over 500 times per day. As our user base grows, the total amount of data quickly multiplies. Currently, the figure stands at 200 terabytes. We have to manage the massive user queries and rapid release iterations, and we managed it well.</p>
<p>A cloud-native DevOps solution frees our events operator from the growing number of online events. We developed a pipeline that takes care of everything they need, from writing code to launching events in production environments: once new event codes are detected, the operation platform automatically builds images from them and deploys the image to Tencent Kubernetes Engine (TKE). You might be wondering how long this entire automated process takes: only 5 minutes.</p>
<p>Currently, almost all IEG operation services run in TKE. Elastic scaling promises faster capacity expansion and reduction of cloud services thanks to cloud-native technology.</p>
<p>In addition, we expect the iterations to be easier. A best practice is to break down the large, hard-to-maintain service into many “smaller” services that we can maintain independently. “Small” services have less code and simpler logic, with lower handover and training costs. We as developers continue to practice this kind of microservices architecture as part of DevOps initiatives. Yet similar issues persist. As the number of services increases, so does the complexity of making calls between them. <strong>Worse, if one “small” service fails, it could set off a chain reaction that brings all the services down—a microservice dependency hell.</strong></p>
<p>The thing is, fault tolerance varies by service. Some support downgrading, while others don’t. Not to mention that some services are unable to provide timely alerts or lack an effective debugging tool. As a result, debugging services has become a tricky and increasingly pressing issue in our day-to-day work.</p>
<p>But we can’t just let it be. What if the unstable performance constantly chases our players away? What if there is a catastrophic failure?</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="let-there-be-faults">Let there be faults<a href="https://chaos-mesh.org/blog/Securing-Online-Gaming-Combine-Chaos-Engineering-with-DevOps-Practices/#let-there-be-faults" class="hash-link" aria-label="Direct link to Let there be faults" title="Direct link to Let there be faults" translate="no">​</a></h2>
<p>Netflix introduced the idea of chaos engineering. This approach tests the resilience of the system against all kinds of edgy cases by injecting faults in a non-production environment to achieve ideal system reliability. According to one Gartner article, by 2023, 40% of organizations will use chaos engineering to meet their top DevOps objectives, reducing unplanned downtime by 20%.</p>
<p>This is exactly how we avoid the worst-case scenario. Fault injection, in my opinion, is now a must-do in every technical team. In our early test cases, developers would bring down a node before launching a service to see if the primary node automatically switched to the secondary node and if disaster recovery worked.</p>
<p><strong>But chaos engineering is more than fault injection.</strong> It is a field that constantly drives new techniques, professional testing tools, and solid theories. That’s why we continue to explore it.</p>
<p>IEG officially launched its chaos engineering project over a year ago. We wanted to do this right the first time. The key is to select a chaos engineering tool that supports running experiments in the Kubernetes environment. <strong>After a careful comparison, we believe <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> is our best option</strong> because:</p>
<ul>
<li class="">It is a Cloud Native Computing Foundation (CNCF) Sandbox project with a friendly and productive community.</li>
<li class="">It does not intrude on existing applications.</li>
<li class="">It provides a web UI and a variety of fault injection types, as shown in the image below.</li>
</ul>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="A comparison of chaos engineering tools" src="https://chaos-mesh.org/assets/images/comparison-of-chaos-engineering-tools-7dba9d470020b2a7250e50e1413aec74.png" width="1080" height="712" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">A comparison of chaos engineering tools</figcaption></figure><p></p>
<blockquote>
<p>Note: This comparison is outdated and is intended simply to compare fault injection features supported by Chaos Mesh with other well-known chaos engineering platforms. It is not intended to favor or position one project over another. Any corrections are welcome.</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="build-a-chaos-testing-platform">Build a chaos testing platform<a href="https://chaos-mesh.org/blog/Securing-Online-Gaming-Combine-Chaos-Engineering-with-DevOps-Practices/#build-a-chaos-testing-platform" class="hash-link" aria-label="Direct link to Build a chaos testing platform" title="Direct link to Build a chaos testing platform" translate="no">​</a></h2>
<p>Our chaos engineering team embedded Chaos Mesh into our continuous integration and continuous delivery pipelines. As shown in the diagram below, Chaos Mesh now plays an important role in our operation platform. We use Chaos Mesh's dashboard API to create, run, and delete chaos experiments and monitor them on our own platform. We can simulate basic system-level faults in Pods, container, network, and IO.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh embedded in IEG&amp;#39;s operation platform" src="https://chaos-mesh.org/assets/images/chaos-mesh-embedded-in-IEG's-operation-platform-afaf1b549e9a7d2b6103a16dfb6eb4c6.png" width="1999" height="915" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh embedded in IEG's operation platform</figcaption></figure><p></p>
<p>In IEG, <strong>chaos engineering is generally summarized as a closed loop with several key phases</strong>:</p>
<ul>
<li class="">
<p>Improve overall system resilience.</p>
<p>Build a chaos testing platform that we can modify as our needs change.</p>
</li>
<li class="">
<p>Design a testing plan.</p>
<p>The testing plan must specify the target, scope, fault to be injected, monitoring metrics, etc. Make sure the testing is well-controlled.</p>
</li>
<li class="">
<p>Execute chaos experiments and review the results.</p>
<p>Compare the system’s performance before and after the chaos experiment.</p>
</li>
<li class="">
<p>Resolve any issues that may arise.</p>
<p>Fix found issues and upgrade the system for the follow-up experiment.</p>
</li>
<li class="">
<p>Repeat chaos experiments and verify performance.</p>
<p>Repeat chaos experiments to see if the system’s performance meets expectations. If it does, design another testing plan.</p>
</li>
</ul>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Five phases of chaos engineering in IEG" src="https://chaos-mesh.org/assets/images/five-phases-of-chaos-engineering-in-IEG-ecfa298a68587aa59ba778bb563e30fd.png" width="1999" height="1721" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Five phases of chaos engineering in IEG</figcaption></figure><p></p>
<p>We frequently <strong>test the performance of services under high CPU usage</strong>, for example. We begin by orchestrating and scheduling experiments. Following that, we run experiments and monitor the performance of related services. Multiple monitoring metrics, such as QPS, latency, response success, are immediately visible through the operation platform. The platform then generates reports for us to review, so we can check whether these experiments met our expectations.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="use-cases">Use cases<a href="https://chaos-mesh.org/blog/Securing-Online-Gaming-Combine-Chaos-Engineering-with-DevOps-Practices/#use-cases" class="hash-link" aria-label="Direct link to Use cases" title="Direct link to Use cases" translate="no">​</a></h2>
<p>The following are a few examples of how we use chaos engineering in our DevOps workflow.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="finer-granularity-of-fault-injection">Finer granularity of fault injection<a href="https://chaos-mesh.org/blog/Securing-Online-Gaming-Combine-Chaos-Engineering-with-DevOps-Practices/#finer-granularity-of-fault-injection" class="hash-link" aria-label="Direct link to Finer granularity of fault injection" title="Direct link to Finer granularity of fault injection" translate="no">​</a></h3>
<p>There is no need to shut down the entire system to see if our games are still available to players. Sometimes we only want to inject faults, say, network latency, into a single game account, and observe how it responds. We are now able to achieve this finer granularity by hijacking traffic and running experiments at the gateway.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="red-teaming">Red teaming<a href="https://chaos-mesh.org/blog/Securing-Online-Gaming-Combine-Chaos-Engineering-with-DevOps-Practices/#red-teaming" class="hash-link" aria-label="Direct link to Red teaming" title="Direct link to Red teaming" translate="no">​</a></h3>
<p>Understandably, our team members grew bored of regular chaos experiments. After all, it’s something like telling your left hand to fight against your right hand. Here at IEG, <strong>we integrate a testing practice called red teaming into chaos engineering to ensure that our system resiliency improves in an organic way.</strong> Red teaming is similar to penetration testing, but more targeted. It requires a group of testers to emulate real-world attacks from an outsider’s perspective. If I were in charge of IT operations, I would simulate faults to specific services, and check to see whether my developer colleges were doing a good job. If I found any potential faults, well, be prepared for some “hard talk.” On the other hand, developers would actively perform chaos experiments and make sure no risk was left behind to avoid being blamed.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="The red teaming process in IEG" src="https://chaos-mesh.org/assets/images/red-teaming-process-in-IEG-9c4e15b2baa0791bb078de705ec915fe.png" width="1999" height="1957" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">The red teaming process in IEG</figcaption></figure><p></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="dependency-analysis">Dependency analysis<a href="https://chaos-mesh.org/blog/Securing-Online-Gaming-Combine-Chaos-Engineering-with-DevOps-Practices/#dependency-analysis" class="hash-link" aria-label="Direct link to Dependency analysis" title="Direct link to Dependency analysis" translate="no">​</a></h3>
<p>It’s important to manage dependencies for microservices. In our case, non-core services cannot be the bottleneck for core services. Fortunately, with chaos engineering, we can run dependency analysis simply by injecting faults into called services and observing how badly the main service is affected. Based on the results, we can optimize the service calling chain in a specific scenario.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="automated-fault-detection-and-diagnosis">Automated fault detection and diagnosis<a href="https://chaos-mesh.org/blog/Securing-Online-Gaming-Combine-Chaos-Engineering-with-DevOps-Practices/#automated-fault-detection-and-diagnosis" class="hash-link" aria-label="Direct link to Automated fault detection and diagnosis" title="Direct link to Automated fault detection and diagnosis" translate="no">​</a></h3>
<p>We are also exploring AI bots to help us detect and diagnose faults. As services become more complex, the likelihood of failure increases. <strong>Our goal is to train a fault detection model through large-scale chaos experiments in production or other controlled environments.</strong></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="chaos-engineering-empowers-devops-practices">Chaos engineering empowers DevOps practices<a href="https://chaos-mesh.org/blog/Securing-Online-Gaming-Combine-Chaos-Engineering-with-DevOps-Practices/#chaos-engineering-empowers-devops-practices" class="hash-link" aria-label="Direct link to Chaos engineering empowers DevOps practices" title="Direct link to Chaos engineering empowers DevOps practices" translate="no">​</a></h2>
<p>Currently, on average, more than 50 people run chaos experiments each week, running more than 150 tests, and detecting more than 100 problems in total.</p>
<p>Gone are the days when performing fault injection requires a handwritten script, which can be a tough thing to do for those who are unfamiliar with it. <strong>The benefits of combining chaos engineering with DevOps practices are obvious: within a few minutes, you can orchestrate various fault types by simply dragging and dropping, execute them with a single click, and monitor the results in real-time—all in one platform.</strong></p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos engineering with DevOps ensures efficient fault injection" src="https://chaos-mesh.org/assets/images/chaos-engineering-with-devops-5f6fab8a9cb2ab88dd0915d536f5de6f.png" width="1999" height="568" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos engineering with DevOps ensures efficient fault injection</figcaption></figure><p></p>
<p>Thanks to full-featured chaos engineering tools and streamlined DevOps processes, we estimate that the efficiency of fault injection and chaos-based optimization at IEG has been improved at least by 10 times in the last six months. If you were unsure about implementing chaos engineering in your business, I hope our experience can be of some help.</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
            <category>Use Cases</category>
        </item>
        <item>
            <title><![CDATA[How Chaos Mesh Helps Apache APISIX Improve System Stability]]></title>
            <link>https://chaos-mesh.org/blog/How-Chaos-Mesh-Helps-Apache-APISIX-Improve-System-Stability/</link>
            <guid>https://chaos-mesh.org/blog/How-Chaos-Mesh-Helps-Apache-APISIX-Improve-System-Stability/</guid>
            <pubDate>Fri, 20 Aug 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Chaos Mesh helps Apache APISIX improve system stability]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh helps Apache APISIX improve system stability" src="https://chaos-mesh.org/assets/images/chaos-mesh-apisix-f1e9d2b36bf99249ad8fff26d94e0009.jpeg" width="3126" height="1043" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh helps Apache APISIX improve system stability</figcaption></figure><p></p>
<p><a href="https://github.com/apache/apisix" target="_blank" rel="noopener noreferrer" class="">Apache APISIX</a> is a cloud-native, high-performance, scaling microservices API gateway. It is one of the Apache Software Foundation's top-level projects and serves hundreds of companies around the world, processing their mission-critical traffic, including finance, the Internet, manufacturing, retail, and operators. Our customers include NASA, the European Union's digital factory, China Mobile, and Tencent.</p>
<!-- -->
<p>As our community grows, Apache APISIX's features more frequently interact with external components, making our system more complex and increasing the possibility of errors. To identify potential system failures and build confidence in the production environment, we introduced the concept of Chaos Engineering.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Apache APISIX architecture" src="https://chaos-mesh.org/assets/images/apache-apisix-architecture-16026d6248e9c7ea47943b6105163d84.jpg" width="1080" height="510" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Apache APISIX architecture</figcaption></figure><p></p>
<p>In this post, we'll share how we use <a href="https://chaos-mesh.org/" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> to improve our system stability.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="our-pain-points">Our pain points<a href="https://chaos-mesh.org/blog/How-Chaos-Mesh-Helps-Apache-APISIX-Improve-System-Stability/#our-pain-points" class="hash-link" aria-label="Direct link to Our pain points" title="Direct link to Our pain points" translate="no">​</a></h2>
<p>Apache APISIX processes tens of billions of requests a day. At that volume level, our users have noticed a couple of issues:</p>
<ul>
<li class=""><strong>Scenario #1:</strong> In Apache APISIX's configuration center, when unexpectedly high network latency occurs between etcd and Apache APISIX, can Apache APISIX still filter and forward traffic normally?</li>
<li class=""><strong>Scenario #2:</strong> When a node in the etcd cluster fails and the cluster can still run normally, an error is reported for the node's interaction with the Apache APISIX admin API.</li>
</ul>
<p>Although Apache APISIX has covered many scenarios through unit, end-to-end (E2E), and fuzz tests in continuous integration (CI), it has not covered the interaction scenario with external components. If the system behaves abnormally, for example, if the network jitters, a hard disk fails, or a process is killed, can Apache APISIX give appropriate error messages? Can it keep running or restore itself to normal operation?</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="why-we-chose-chaos-mesh">Why we chose Chaos Mesh<a href="https://chaos-mesh.org/blog/How-Chaos-Mesh-Helps-Apache-APISIX-Improve-System-Stability/#why-we-chose-chaos-mesh" class="hash-link" aria-label="Direct link to Why we chose Chaos Mesh" title="Direct link to Why we chose Chaos Mesh" translate="no">​</a></h2>
<p>To test these user scenarios and to discover similar problems before our product goes into production, our community decided to use Chaos Mesh for chaos testing.</p>
<p>Chaos Mesh is a cloud-native Chaos Engineering platform that features all-around fault injection methods for complex systems on Kubernetes, covering faults in Pod, the network, file system, and even the kernel. It helps users find weaknesses in the system and ensures that the system can resist out-of-control situations in the production environment.</p>
<p>Like Apache APISIX, Chaos Mesh has an active open source community. We know that an active community can ensure stable software use and rapid iteration. This makes Chaos Mesh more attractive.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="how-we-use-chaos-mesh-in-apisix">How we use Chaos Mesh in APISIX<a href="https://chaos-mesh.org/blog/How-Chaos-Mesh-Helps-Apache-APISIX-Improve-System-Stability/#how-we-use-chaos-mesh-in-apisix" class="hash-link" aria-label="Direct link to How we use Chaos Mesh in APISIX" title="Direct link to How we use Chaos Mesh in APISIX" translate="no">​</a></h2>
<p>Chaos Engineering has grown beyond simple fault injection and now forms a complete methodology. To create a chaos experiment, we determined what the normal operation or "steady state" of our application should be. We then introduced potential problems to see how the system responded. If the problems knocked the application out of its steady state, we fixed them.</p>
<p>Now, we'll take the two scenarios we mentioned to show you how we use Chaos Mesh in Apache APISIX.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="scenario-1">Scenario #1<a href="https://chaos-mesh.org/blog/How-Chaos-Mesh-Helps-Apache-APISIX-Improve-System-Stability/#scenario-1" class="hash-link" aria-label="Direct link to Scenario #1" title="Direct link to Scenario #1" translate="no">​</a></h3>
<p>We deployed a Chaos Engineering experiment using the following steps:</p>
<ol>
<li class="">
<p>We found metrics to measure whether Apache APISIX is running normally. In the test, the most important method is to use Grafana to monitor the Apache APISIX's running metrics. We extracted data from Prometheus in CI for comparison. Here, we used the routing and forwarding requests per second (RPS) and etcd connectivity as evaluation metrics. We analyzed the log. For Apache APISIX, we checked Nginx's error log to determine whether there was an error and whether the error was in line with our expectations.</p>
</li>
<li class="">
<p>We performed a test in the control group. We found that both <code>create route</code> and <code>access route</code> were successful, and we could connect to etcd. We recorded the RPS.</p>
</li>
<li class="">
<p>We used network chaos to add a five second network latency and then retested. This time, <code>set route</code> failed, <code>get route</code> succeeded, etcd could be connected to, and RPS had no significant change compared to the previous experiment. The experiment met our expectations.</p>
</li>
</ol>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="High network latency occurs between etcd and Apache APISIX" src="https://chaos-mesh.org/assets/images/high-network-latency-between-etcd-and-apache-apisix-9d036984f06e3f53e2f030428ccf917e.jpg" width="1080" height="1016" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">High network latency occurs between etcd and Apache APISIX</figcaption></figure><p></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="scenario-2">Scenario #2<a href="https://chaos-mesh.org/blog/How-Chaos-Mesh-Helps-Apache-APISIX-Improve-System-Stability/#scenario-2" class="hash-link" aria-label="Direct link to Scenario #2" title="Direct link to Scenario #2" translate="no">​</a></h3>
<p>After we conducted the same experiment as above in the control group, we introduced pod-kill chaos and reproduced the expected error. When we randomly deleted a small number of etcd nodes in the cluster, sometimes APISIX could connect to etcd and sometimes not, and the log printed a large number of connection rejection errors.</p>
<p>When we deleted the first or third node in the etcd endpoint list, the <code>set route</code> returned a result normally. However, when we deleted the second node in the list, the <code>set route</code> returned the error "connection refused."</p>
<p>Our troubleshooting revealed that the etcd Lua API used by Apache APISIX selected the endpoint sequentially, not randomly. Therefore, when we created an etcd client, we bound to only one etcd endpoint. This led to continuous failure.</p>
<p>After we fixed this problem, we added a health check to the etcd Lua API to ensure that a large number of requests would not be sent to the disconnected etcd node. To avoid flooding the log with errors, we added a fallback mechanism when the etcd cluster was completely disconnected.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Error Reported from etcd Node Interaction" src="https://chaos-mesh.org/assets/images/error-reported-from-etcd-node-interaction-529a2e15e86ca5b3cb347db0f13a751b.jpg" width="1080" height="1149" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Error Reported from etcd Node Interaction</figcaption></figure><p></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="our-future-plans">Our future plans<a href="https://chaos-mesh.org/blog/How-Chaos-Mesh-Helps-Apache-APISIX-Improve-System-Stability/#our-future-plans" class="hash-link" aria-label="Direct link to Our future plans" title="Direct link to Our future plans" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="run-a-chaos-test-in-e2e-simulation-scenarios">Run a chaos test in E2E simulation scenarios<a href="https://chaos-mesh.org/blog/How-Chaos-Mesh-Helps-Apache-APISIX-Improve-System-Stability/#run-a-chaos-test-in-e2e-simulation-scenarios" class="hash-link" aria-label="Direct link to Run a chaos test in E2E simulation scenarios" title="Direct link to Run a chaos test in E2E simulation scenarios" translate="no">​</a></h3>
<p>In Apache APISIX, we manually identify system weaknesses for testing and repair. As in the open source community, we test in CI, so we don't need to worry about the impact of Chaos Engineering's failure radius on the production environment. But the test cannot cover complicated and comprehensive application scenarios in the production environment.</p>
<p>To cover more scenarios, the community plans to use the existing E2E test to simulate more complete scenarios and conduct chaos tests that are more random and cover a larger range.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="add-chaos-tests-to-more-apache-apisix-projects">Add chaos tests to more Apache APISIX projects<a href="https://chaos-mesh.org/blog/How-Chaos-Mesh-Helps-Apache-APISIX-Improve-System-Stability/#add-chaos-tests-to-more-apache-apisix-projects" class="hash-link" aria-label="Direct link to Add chaos tests to more Apache APISIX projects" title="Direct link to Add chaos tests to more Apache APISIX projects" translate="no">​</a></h3>
<p>In addition to finding more vulnerabilities for Apache APISIX, the community plans to add chaos tests to more projects such as Apache APISIX Dashboard and Apache APISIX Ingress Controller.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="add-features-to-chaos-mesh">Add features to Chaos Mesh<a href="https://chaos-mesh.org/blog/How-Chaos-Mesh-Helps-Apache-APISIX-Improve-System-Stability/#add-features-to-chaos-mesh" class="hash-link" aria-label="Direct link to Add features to Chaos Mesh" title="Direct link to Add features to Chaos Mesh" translate="no">​</a></h3>
<p>When we deployed Chaos Mesh, some features were temporarily unsupported. For example, we couldn't select a service as a network latency target or specify container port injection as network chaos. In the future, the Apache APISIX community will assist Chaos Mesh to add related features.</p>
<p>You're welcome to contribute to the <a href="https://github.com/apache/apisix" target="_blank" rel="noopener noreferrer" class="">Apache APISIX project</a> on GitHub. If you are interested in Chaos Mesh and would like to improve it, join our <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">Slack channel</a> (#project-chaos-mesh) or submit your pull requests or issues to our <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
        </item>
        <item>
            <title><![CDATA[Chaos Mesh 2.0: To a Chaos Engineering Ecology]]></title>
            <link>https://chaos-mesh.org/blog/chaos-mesh-2.0-to-a-chaos-engineering-ecology/</link>
            <guid>https://chaos-mesh.org/blog/chaos-mesh-2.0-to-a-chaos-engineering-ecology/</guid>
            <pubDate>Fri, 13 Aug 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Chaos Mesh 2.0: To a Chaos Engineering Ecology]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh 2.0: To a Chaos Engineering Ecology" src="https://chaos-mesh.org/assets/images/chaos-mesh-2.0-ga-0dd019af0c94838abca9d11015cd0157.png" width="1501" height="501" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh 2.0: To a Chaos Engineering Ecology</figcaption></figure><p></p>
<p>On July 23, 2021, Chaos Mesh 2.0 was made generally available! It’s an exciting release, marking a solid milestone towards the chaos engineering ecology that we hope to build.</p>
<!-- -->
<p>Making chaos engineering easier has always been Chaos Mesh’s unswerving goal, and this release is a key step. After almost a year of continuous efforts, we have made major improvements in three main areas: ease of use, native experiment orchestration &amp; scheduling, along with the richness of fault injection types.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="ease-of-use">Ease of use<a href="https://chaos-mesh.org/blog/chaos-mesh-2.0-to-a-chaos-engineering-ecology/#ease-of-use" class="hash-link" aria-label="Direct link to Ease of use" title="Direct link to Ease of use" translate="no">​</a></h2>
<p>We are committed to improving the usability of Chaos Mesh, and a key path to this is Chaos Dashboard, a web interface for users to orchestrate chaos experiments. For Chaos Mesh 2.0, we have improved the Chaos Dashboard in the following ways, further simplifying the complexity of chaos experiments:</p>
<ul>
<li class="">It now supports the creation, viewing, and updating of AWSChaos and GCPChaos, so that conducting chaos experiments in a cloud environment can provide a consistent experience as in Kubernetes;</li>
<li class="">It can display more detailed records of each experiment, further enhancing its visibility.</li>
</ul>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh 2.0 - Experiment scheduling" src="https://chaos-mesh.org/assets/images/chaos-mesh-scheduling-2.0-eb39143d5b731437e817ad869d81e2b3.png" width="1999" height="1142" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh 2.0 - Experiment scheduling</figcaption></figure><p></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="native-experiment-orchestration--scheduling">Native experiment orchestration &amp; scheduling<a href="https://chaos-mesh.org/blog/chaos-mesh-2.0-to-a-chaos-engineering-ecology/#native-experiment-orchestration--scheduling" class="hash-link" aria-label="Direct link to Native experiment orchestration &amp; scheduling" title="Direct link to Native experiment orchestration &amp; scheduling" translate="no">​</a></h2>
<p>When conducting chaos experiments, a single experiment is often not enough to simulate a complete testing scenario, and manually starting or stopping the experiment would be a tedious and dangerous thing to do. Previously, we <a href="https://chaos-mesh.org/blog/building_automated_testing_framework" target="_blank" rel="noopener noreferrer" class="">combined Argo with Chaos Mesh</a> to inject faults automatically as a workflow. However, we later realized that Argo workflow is not the best way to describe declarative chaos experiments, and decided to write another workflow engine. Chaos Mesh 2.0 features native Workflow to support experiment orchestration, which means you can serially or parallely execute multiple experiments. You can even weave in notifications and health checks to simulate more complex experimental scenarios.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh 2.0 - Workflow" src="https://chaos-mesh.org/assets/images/chaos-mesh-workflow-2.0-be58bae24386d8eeb703c34ddef2ff93.png" width="1999" height="1142" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh 2.0 - Workflow</figcaption></figure><p></p>
<p>In previous versions, we used the <code>cron</code> and <code>duration</code> fields to define chaos experiments that were executed periodically. It didn’t take us long to realize that describing behavior this way was not fitting. For example, a single execution often takes longer than an execution cycle. This definition works fine, but lacks a suitable description for the study of expected behavior. We referred to CronJob and introduced Schedule, a new custom object, to Chaos Mesh. It adds more explicit properties to periodically executed tasks, such as whether multiple experiments are allowed to be executed at the same time, thereby restricting behavior.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh 2.0 - Schedule" src="https://chaos-mesh.org/assets/images/chaos-dashboard-schedule-2.0-2bf9d7f92e8d254bd979a28f47ae9ef9.png" width="1999" height="1142" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh 2.0 - Schedule</figcaption></figure><p></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="richer-fault-injection-types">Richer fault injection types<a href="https://chaos-mesh.org/blog/chaos-mesh-2.0-to-a-chaos-engineering-ecology/#richer-fault-injection-types" class="hash-link" aria-label="Direct link to Richer fault injection types" title="Direct link to Richer fault injection types" translate="no">​</a></h2>
<p>Chaos Mesh already supports system-level fault injection types, as well as fault injections into cloud environments such as AWSChaos and GCPChaos. Starting from 2.0, injecting chaos into the application layer has been made possible with the introduction of JVMChaos and HTTPChaos.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="jvmchaos">JVMChaos<a href="https://chaos-mesh.org/blog/chaos-mesh-2.0-to-a-chaos-engineering-ecology/#jvmchaos" class="hash-link" aria-label="Direct link to JVMChaos" title="Direct link to JVMChaos" translate="no">​</a></h3>
<p>JVM languages such as Java and Kotlin are widely used in the industry. A JVMChaos can be easily simulated through methods like JVM bytecode enhancement and Java Agent. Currently, JVMChaos uses <a href="https://github.com/chaosblade-io/chaosblade-exec-jvm" target="_blank" rel="noopener noreferrer" class="">chaosblade-exec-jvm</a>, and supports injecting various application-level fault types including method delay, specify return value, OOM and throw custom exception. For more info, you can refer to the document: <a href="https://chaos-mesh.org/docs/simulate-jvm-application-chaos" target="_blank" rel="noopener noreferrer" class="">Simulate JVM Application Faults</a>.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="httpchaos">HTTPChaos<a href="https://chaos-mesh.org/blog/chaos-mesh-2.0-to-a-chaos-engineering-ecology/#httpchaos" class="hash-link" aria-label="Direct link to HTTPChaos" title="Direct link to HTTPChaos" translate="no">​</a></h3>
<p>HTTPChaos is a brand new Chaos type supported in the 2.0 version. It can hijack HTTP service requests and responses from the server side, as well as interrupt links, delay injection, or modify Header/Body. It is suitable for all scenarios that use HTTP as the communication protocol. For more information, refer to <a href="https://chaos-mesh.org/docs/simulate-http-chaos-on-kubernetes" target="_blank" rel="noopener noreferrer" class="">Simulate HTTP Faults</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="chaosd-an-fault-injection-tool-for-physical-nodes">Chaosd: an fault injection tool for physical nodes<a href="https://chaos-mesh.org/blog/chaos-mesh-2.0-to-a-chaos-engineering-ecology/#chaosd-an-fault-injection-tool-for-physical-nodes" class="hash-link" aria-label="Direct link to Chaosd: an fault injection tool for physical nodes" title="Direct link to Chaosd: an fault injection tool for physical nodes" translate="no">​</a></h2>
<p>Chaos Mesh is designed for Kubernetes. For physical machine environments, we present <a href="https://github.com/chaos-mesh/chaosd" target="_blank" rel="noopener noreferrer" class="">Chaosd</a>. It evolved from chaos-daemon, a key component in Chaos Mesh, and we have added specific chaos experiments based on the characteristics of physical machines. Currently, Chaosd supports process kill, network, JVM, pressure, disk and a few other types of fault injection onto the physical machine.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="looking-ahead">Looking ahead<a href="https://chaos-mesh.org/blog/chaos-mesh-2.0-to-a-chaos-engineering-ecology/#looking-ahead" class="hash-link" aria-label="Direct link to Looking ahead" title="Direct link to Looking ahead" translate="no">​</a></h2>
<p>Chaos Mesh is still under active development, and we have some more powerful features in the works, including:</p>
<ul>
<li class="">To inject JVMChaos at runtime, lowering the cost of JVMChaos and making it more easy-to-use.</li>
<li class="">To introduce a plug-in mechanism to build custom chaos experiments, while the Scheduling function remains unimpaired.</li>
</ul>
<p>In addition, we noticed that chaos experiments can be reused in a number of scenarios, hence we plan to launch a platform, where customized experiments can be turned into templates. This will enable our users to share and reuse not only specific chaos experiments, but also Workflows for different scenarios.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="try-it-out">Try it out!<a href="https://chaos-mesh.org/blog/chaos-mesh-2.0-to-a-chaos-engineering-ecology/#try-it-out" class="hash-link" aria-label="Direct link to Try it out!" title="Direct link to Try it out!" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-note admonition_zECE alert alert--secondary"><div class="admonitionHeading_p7pM"><span class="admonitionIcon_RWck"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_DNgP"><p>2022-10-24: Because of <a href="https://www.oreilly.com/online-learning/leveraging-katacoda-technology.html" target="_blank" rel="noopener noreferrer" class="">https://www.oreilly.com/online-learning/leveraging-katacoda-technology.html</a>, and refer to <a href="https://github.com/chaos-mesh/website/pull/356" target="_blank" rel="noopener noreferrer" class="">#356</a>, the interactive tutorial is temporarily unavailable.</p></div></div>
<p>Try out the <code>Chaos Mesh 2.0 interactive scenarios</code> from your browser! There’s no need to install or configure, as the complete development environment has been preconfigured with everything you need. Otherwise, you can visit <a href="https://chaos-mesh.org/docs" target="_blank" rel="noopener noreferrer" class="">the Chaos Mesh docs</a> for more info.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="a-big-thank-you">A big thank you<a href="https://chaos-mesh.org/blog/chaos-mesh-2.0-to-a-chaos-engineering-ecology/#a-big-thank-you" class="hash-link" aria-label="Direct link to A big thank you" title="Direct link to A big thank you" translate="no">​</a></h2>
<p>Thanks to all <a href="https://github.com/chaos-mesh/chaos-mesh/graphs/contributors" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh contributors</a>, Chaos Mesh couldn’t have come from 1.0 to 2.0 without all of your efforts!</p>
<p>If you are interested in Chaos Mesh and would like to help us improve it, you’re welcome to join <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">our Slack channel</a> or submit your pull requests or issues to our <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>. Chaos Mesh looks forward to your participation and feedback!</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[Chaos Mesh Celebrates 100th Contributor]]></title>
            <link>https://chaos-mesh.org/blog/chaos-mesh-celebrates-100th-contributor/</link>
            <guid>https://chaos-mesh.org/blog/chaos-mesh-celebrates-100th-contributor/</guid>
            <pubDate>Thu, 05 Aug 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Chaos Mesh Celebrates 100th Contributor]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh Celebrates 100th Contributor" src="https://chaos-mesh.org/assets/images/chaos-mesh-celebrates-100-contributors-da4096a69f4dc2814d4ce03db43aec18.png" width="4501" height="1500" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh Celebrates 100th Contributor</figcaption></figure><p></p>
<p>The <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh project</a> just hit two major milestones: the community recently welcomed our <a href="https://github.com/chaos-mesh/chaos-mesh/graphs/contributors" target="_blank" rel="noopener noreferrer" class="">100th contributor</a> to the chaos-mesh repo and 1,000 followers on <a href="https://twitter.com/chaos_mesh" target="_blank" rel="noopener noreferrer" class="">Twitter</a>!</p>
<!-- -->
<p>Chaos Mesh is a Chaos Engineering platform that orchestrates chaos experiments on Kubernetes environments. Ever since first open-sourced on GitHub on Dec 31st, 2019, it has not stopped: in July 2020, Chaos Mesh joined CNCF <a href="https://chaos-mesh.org/blog/chaos-mesh-join-cncf-sandbox-project" target="_blank" rel="noopener noreferrer" class="">as a Sandbox project</a>; a few months later in September, Chaos Mesh 1.0 was <a href="https://chaos-mesh.org/blog/chaos-mesh-1.0-chaos-engineering-on-kubernetes-made-easier" target="_blank" rel="noopener noreferrer" class="">officially released</a>. In July 2021, after a few beta versions, <a href="https://github.com/chaos-mesh/chaos-mesh/releases/tag/v2.0.0" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh 2.0 was announced generally available</a>!</p>
<p>So far, Chaos Mesh has brought out 35 releases, received 1,500+ commits from 100+ contributors, won over 3.8k+ stargazers and 420+ forks. All these achievements would not have been possible without the wonderful community.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh contributors" src="https://chaos-mesh.org/assets/images/chaos-mesh-all-contributors-3ad3281e2aecb8de0c1fca8cbf591dbb.jpeg" width="2501" height="4987" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh contributors</figcaption></figure><p></p>
<p>Here are a few of our favourite contributions to highlight:</p>
<ul>
<li class=""><a href="https://github.com/YangKeao" target="_blank" rel="noopener noreferrer" class="">@YangKeao</a> introduced <code>kubebuilder</code> to Chaos Mesh, an SDK for building Kubernetes APIs using CRD, which simplified the steps to implement the Controller.</li>
<li class=""><a href="https://github.com/g1eny0ung" target="_blank" rel="noopener noreferrer" class="">@g1eny0ung</a> brought in the Chaos Dashboard, a Web UI for manipulating and observing chaos experiments.</li>
<li class=""><a href="https://github.com/Yiyiyimu" target="_blank" rel="noopener noreferrer" class="">@Yiyiyimu</a> contributed <code>chaosctl</code>, a tool that simplifies chaos development and debugging.</li>
<li class=""><a href="https://github.com/Gallardot" target="_blank" rel="noopener noreferrer" class="">@Gallardot</a> helped implement JVMChaos, making it possible for Chaos Mesh to simulate JVM application faults.</li>
<li class=""><a href="https://github.com/STRRL" target="_blank" rel="noopener noreferrer" class="">@STRRL</a> started the work on Chaos Mesh Workflow, a built-in workflow engine which enables running different chaos experiments in a serial or parallel manner to simulate production-level errors.</li>
</ul>
<p>For those who enjoy chaos engineering and open source equally, our mission is to make sure that this is where you belong by enriching the contribution journey, and here’s where we are at so far:</p>
<ul>
<li class="">We published the Chaos Mesh <a href="https://github.com/chaos-mesh/chaos-mesh/blob/master/GOVERNANCE.md" target="_blank" rel="noopener noreferrer" class="">Governance</a> in the beginning of 2021, making clear the roles and responsibilities of each community member as well as the decision-making process, and has since promoted 9 Committers.</li>
<li class="">We have mentored 4 mentees through the LFX mentorship programs so far. Our mentees have written blogs and hosted talks sharing their LFX experience.</li>
<li class="">We have participated in 3 KubeCons, where we participated in the bug bash contest and hosted Office Hours to meet and chat with old faces and welcome new members to our community. We even posted a <a href="https://chaos-mesh.org/blog/chaos-mesh-q&amp;a" target="_blank" rel="noopener noreferrer" class="">Q&amp;A</a> after the KubeCon EU 2021 since we received so many questions!</li>
<li class="">We are currently applying to propose Chaos Mesh to be promoted to the CNCF <a href="https://github.com/cncf/toc/pull/683" target="_blank" rel="noopener noreferrer" class="">incubating stage</a>, hoping that being promoted to the next stage of maturity brings the project new chances and more exposure.</li>
</ul>
<p>Although this is an achievement worth celebrating, we know that there is still a lot of work ahead:</p>
<ul>
<li class="">We have also been working with the community to refine the Chaos Mesh <a href="https://chaos-mesh.org/docs/" target="_blank" rel="noopener noreferrer" class="">documentation</a>: updating English versions as per each release and adding Chinese versions for our growing number of Chinese adopters and contributors.</li>
<li class="">We hope to continue to contribute to the Cloud-Native ecosystem: for example, by developing and amplifying chaos engineering related content, and collaborating with other communities for meetups and projects.</li>
</ul>
<p>Another goal of ours is to continue building a more diverse and engaging community— there is no barrier to being part of the Chaos Mesh community and becoming a Chaos Mesh contributor, as contributions are not limited to coding: writing documentation, offering ideas for features, posting issues, writing blogs, answering community questions, or sharing cases are all part of the contribution journey.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="to-sum-up">To sum up<a href="https://chaos-mesh.org/blog/chaos-mesh-celebrates-100th-contributor/#to-sum-up" class="hash-link" aria-label="Direct link to To sum up" title="Direct link to To sum up" translate="no">​</a></h2>
<p>From the bottom of our hearts, thank you! We hope that we can keep up the good work and continue to build up this not-so-little community of ours, and continue to contribute to the CNCF and the chaos engineering ecology.</p>
<p>If this is the first time you are hearing of Chaos Mesh, and would like to learn more, find the #project-chaos-mesh channel in <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">CNCF slack workspace</a>, submit your pull requests or issues to our <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>, or sign up to join in on our next <a href="https://community.cncf.io/chaos-mesh-community/" target="_blank" rel="noopener noreferrer" class="">monthly community meeting</a>!</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
            <category>Community</category>
        </item>
        <item>
            <title><![CDATA[Chaos Mesh Q&A]]></title>
            <link>https://chaos-mesh.org/blog/chaos-mesh-q&amp;a/</link>
            <guid>https://chaos-mesh.org/blog/chaos-mesh-q&amp;a/</guid>
            <pubDate>Fri, 09 Jul 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Chaos Mesh Q&A]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh Q&amp;amp;A" src="https://chaos-mesh.org/assets/images/chaos-mesh-q&amp;a-5ee3460631a40ccb4ab675860e9bddd7.jpeg" width="3126" height="1043" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh Q&amp;A</figcaption></figure><p></p>
<p>At KubeCon EU 2021, the <a href="https://chaos-mesh.org/" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> team hosted two “office hours sessions” where newcomers, community members, and project maintainers had a chance to chat, get to know each other, and learn more about the project.</p>
<!-- -->
<p>Big thanks to the more than 200 of you who joined us! We received so many great questions during the session, we thought we’d do a round up Q&amp;A.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="your-questions-answered">Your questions answered<a href="https://chaos-mesh.org/blog/chaos-mesh-q&amp;a/#your-questions-answered" class="hash-link" aria-label="Direct link to Your questions answered" title="Direct link to Your questions answered" translate="no">​</a></h2>
<p><strong>Q: Is Chaos Mesh compatible with Service Meshes, such as Istio?</strong></p>
<p><strong>A:</strong> Yes, you can use Chaos Mesh in the Service Mesh environment. At one of our <a href="https://www.youtube.com/watch?v=paIgJYOhdGw" target="_blank" rel="noopener noreferrer" class="">previous community meetings</a>, Sergio Méndez and Jossie Castrillo from the University of San Carlos of Guatemala shared how they used Linkerd and Chaos Mesh to conduct chaos experiments for their project, “<a href="https://github.com/sergioarmgpl/operating-systems-usac-course/blob/master/lang/en/projects/project1v3/project1.md" target="_blank" rel="noopener noreferrer" class="">COVID-19 Realtime Vaccinated People Visualizer</a>”.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Project Architecture" src="https://chaos-mesh.org/assets/images/chaos-mesh-linkerd-architecture-5fca7bb217df34ff1bc30abc5502bdd4.png" width="2554" height="1434" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Project Architecture</figcaption></figure><p></p>
<p><strong>Q: Can I use Chaos Mesh on-premises or do I need Amazon Web Services (AWS) or Google Cloud Platform (GCP)?</strong></p>
<p><strong>A:</strong> You can do either! You can deploy Chaos Mesh on your Kubernetes cluster, so it does not matter whether you manage it yourself or have it hosted on AWS or GCP. However, if you would like to use it in a Kubernetes environment, you need to <a href="https://chaos-mesh-website-archived.netlify.app/docs/1.2.4/user_guides/installation" target="_blank" rel="noopener noreferrer" class="">set relevant parameters</a> during installation.</p>
<p><strong>Q: How do "chaos actions" work?</strong></p>
<p><strong>A:</strong> Chaos Mesh uses Kubernetes CustomResourceDefinitions (CRDs) to manage chaos experiments. Different fault injection behaviors are implemented in different ways, but the overall idea is the same: Chaos Mesh uses an application's execution link to inject chaos into the application. For example, when we inject chaos into the overall link of network interaction, the network interaction card is passed through. Because Linux uses traffic control to increase interference to the specific network interaction card, we can directly use traffic control for network fault injection.</p>
<p><strong>Q: Are you going to add probe support to Chaos Mesh for steady state detection and experiment validation?</strong></p>
<p><strong>A:</strong> Currently, there is no plan to add this support. Steady state detection and experiment validation are necessary if an application is ready for production. Chaos Mesh itself does not monitor related work, but provides an interface to access existing monitoring systems or the status interface of the application to monitor and detect the application’s steady state.</p>
<p><strong>Q: What elevated privileges do the Chaos Mesh pods need?</strong></p>
<p><strong>A:</strong> By default, the Chaos Daemon components in Chaos Mesh run in the <code>privileged</code> mode. If your Kubernetes cluster version is v3.11 or higher, you can replace <code>privileged</code> mode by configuring <code>capabilities</code>.</p>
<p><strong>Q: Can I implement Chaos Mesh inside build pipelines to log specific test results?</strong></p>
<p><strong>A:</strong> Yes, that’s easy to do. You can integrate Chaos Mesh with pipeline systems such as Argo, Jenkins, GitHub Action, and Spanner. Chaos Mesh uses Kubernetes CRDs to manage chaos experiments. To inject chaos, you only need to create the chaos CRD object you want in the pipeline. You can obtain the running status of an experiment through its status structure and event.</p>
<p><strong>Q: What can we expect from the 2.0 release? Can you share some updates on HTTPChaos?</strong></p>
<p><strong>A:</strong> Chaos Mesh 2.0 will provide native workflow support, and users can arrange chaos experiments in Chaos Mesh. In addition, for Chaos Mesh 2.0, we have reconstructed the existing chaos controller so that users can more easily add new fault injection types. As for HTTPChaos, we’re adding network failure simulation to the HTTP application layer!</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="join-the-chaos-mesh-community">Join the Chaos Mesh community<a href="https://chaos-mesh.org/blog/chaos-mesh-q&amp;a/#join-the-chaos-mesh-community" class="hash-link" aria-label="Direct link to Join the Chaos Mesh community" title="Direct link to Join the Chaos Mesh community" translate="no">​</a></h2>
<p>If you are interested in Chaos Mesh and would like to help us improve it, you're welcome to join <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">our Slack channel</a> or submit your pull requests or issues to our <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
        </item>
        <item>
            <title><![CDATA[Securing tenant namespaces using restrict authorization feature in Chaos Mesh]]></title>
            <link>https://chaos-mesh.org/blog/securing-tenant-namespaces-using-restrict-authorization-feature/</link>
            <guid>https://chaos-mesh.org/blog/securing-tenant-namespaces-using-restrict-authorization-feature/</guid>
            <pubDate>Wed, 07 Jul 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Chaos engineering tools]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos engineering tools" src="https://chaos-mesh.org/assets/images/chaos-mesh-restrict-authorization-83f3faf086be2029938cd1923256b5a2.jpeg" width="3126" height="1043" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos engineering tools</figcaption></figure><p></p>
<p>A <a href="https://cloud.google.com/kubernetes-engine/docs/concepts/multitenancy-overview" target="_blank" rel="noopener noreferrer" class="">multi-tenant</a> cluster is shared by multiple users and/or workloads which are referred to as "tenants".The operators of multi-tenant clusters must isolate tenants from each other to minimize the damage that a compromised or malicious tenant can do to the cluster and other tenants.</p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="cluster-multi-tenancy">Cluster multi-tenancy<a href="https://chaos-mesh.org/blog/securing-tenant-namespaces-using-restrict-authorization-feature/#cluster-multi-tenancy" class="hash-link" aria-label="Direct link to Cluster multi-tenancy" title="Direct link to Cluster multi-tenancy" translate="no">​</a></h2>
<p>When you plan a multi-tenant architecture, you should consider the layers of resource isolation in Kubernetes: cluster, namespace, node, Pod, and container.</p>
<p>Although Kubernetes cannot guarantee perfectly secure isolation between tenants, it does offer features that may be sufficient for specific use cases. You can separate each tenant and their Kubernetes resources into their own <a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" target="_blank" rel="noopener noreferrer" class="">namespaces</a>. Kubernetes supports multiple virtual clusters backed by the same physical cluster. These virtual clusters are called namespaces. <a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" target="_blank" rel="noopener noreferrer" class="">Namespaces</a> are intended for use in environments with many users spread across multiple teams, or projects.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="cluster-having-chaos-mesh">Cluster having Chaos Mesh<a href="https://chaos-mesh.org/blog/securing-tenant-namespaces-using-restrict-authorization-feature/#cluster-having-chaos-mesh" class="hash-link" aria-label="Direct link to Cluster having Chaos Mesh" title="Direct link to Cluster having Chaos Mesh" translate="no">​</a></h2>
<p>You designed your Kubernetes cluster to have multiple tenant services. You followed the best security practices for Kubernetes: each tenant service is running in its own namespaces, users of these tenant services have appropriate access that also only for their respective namespaces, etc.</p>
<!-- -->
<p>You enabled Chaos Mesh (<a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> is a cloud-native Chaos Engineering platform that orchestrates chaos on Kubernetes environments) on the cluster so that your tenant services can perform different chaos activities to make sure their application/system is resilient. You have also given Chaos Mesh specific rights to those tenant service users so that they can manage Chaos Mesh resources using <a href="https://kubernetes.io/docs/reference/access-authn-authz/rbac/" target="_blank" rel="noopener noreferrer" class="">RBAC</a>.</p>
<!-- -->
<p>Suppose one of the tenant users wants to perform pod kill operations in his/her namespace i.e. chaos-mesh. To achieve the same, the user created the below Chaos Mesh YAML file:</p>
<div class="language-yml codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-yml codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> chaos</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">mesh.org/v1alpha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PodChaos</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">kill</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> chaos</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">mesh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">kill</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> one</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespaces</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> tidb</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labelSelectors</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">'app.kubernetes.io/component'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'tikv'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">scheduler</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cron</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@every 1m'</span><br></div></code></pre></div></div>
<p>The user has required rights to namespace chaos-mesh, but does not have rights on tidb-cluster-demo namespace. When the user applies the above YAML file using kubectl, it will create the pod-kill Chaos Mesh resource in chaos-mesh namespace. As we can see in the selector section, the user has specified some other namespace (tidb-cluster-demo), which means the pods which will be selected for this chaos operation will be from tidb-cluster-demo namespace, and not from the one for which the user has access i.e. chaos-mesh. This means that this user is able to impact the other namespace for which (s)he does not have the rights. <strong>Problem!!!</strong></p>
<!-- -->
<p>Since the release of Chaos Mesh 1.1.3, this security issue has been fixed with a restricted authorization feature. Now when user applies the above YAML file, the system shows the error similar to:</p>
<div class="language-yml codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-yml codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">Error when creating "pod/pod-kill.yaml"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">admission webhook "vauth.kb.io" denied the request</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"> is forbidden on namespace</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tidb</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo</span><br></div></code></pre></div></div>
<p><strong>Problem solved!</strong></p>
<p>Please note, if the user has required rights on tidb-cluster-demo namespace as well, then there will be no such error.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="for-more-tutorials">For more tutorials<a href="https://chaos-mesh.org/blog/securing-tenant-namespaces-using-restrict-authorization-feature/#for-more-tutorials" class="hash-link" aria-label="Direct link to For more tutorials" title="Direct link to For more tutorials" translate="no">​</a></h2>
<p>In case you want to enforce that no user should be allowed to create chaos across namespaces, you can check out my previous blog: <a href="https://anuragpaliwal-93749.medium.com/securing-tenant-services-while-using-chaos-mesh-using-opa-3ae80c7f4b85" target="_blank" rel="noopener noreferrer" class="">Securing tenant services while using chaos mesh using OPA</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="last-but-not-least">Last but not least<a href="https://chaos-mesh.org/blog/securing-tenant-namespaces-using-restrict-authorization-feature/#last-but-not-least" class="hash-link" aria-label="Direct link to Last but not least" title="Direct link to Last but not least" translate="no">​</a></h2>
<p>If you are interested in Chaos Mesh and would like to learn more, you're welcome to join the <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">Slack channel</a> or submit your pull requests or issues to its <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
        </item>
        <item>
            <title><![CDATA[How to efficiently stress test Pod memory]]></title>
            <link>https://chaos-mesh.org/blog/how-to-efficiently-stress-test-pod-memory/</link>
            <guid>https://chaos-mesh.org/blog/how-to-efficiently-stress-test-pod-memory/</guid>
            <pubDate>Thu, 01 Jul 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[banner]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="banner" src="https://chaos-mesh.org/assets/images/how-to-efficiently-stress-test-pod-memory-banner-3dd86c1ed5645a75c8cd7c2236a7c41a.jpg" width="1600" height="534" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">banner</figcaption></figure><p></p>
<p><a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> includes the StressChaos tool, which allows you to inject CPU and memory stress into your Pod. This tool can be very useful when you test or benchmark a CPU-sensitive or memory-sensitive program and want to know its behavior under pressure.</p>
<p>However, as we tested and used StressChaos, we found some issues with usability and performance. For example, why does StressChaos use far less memory than we configured? To correct these issues, we developed a new set of tests. In this article, I'll describe how we troubleshooted these issues and corrected them. This information will enable you to get the most out of StressChaos.</p>
<!-- -->
<p>Before you continue, you need to install Chaos Mesh in your cluster. You can find detailed instructions on our <a href="https://chaos-mesh.org/docs/quick-start" target="_blank" rel="noopener noreferrer" class="">website</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="injecting-stress-into-a-target">Injecting stress into a target<a href="https://chaos-mesh.org/blog/how-to-efficiently-stress-test-pod-memory/#injecting-stress-into-a-target" class="hash-link" aria-label="Direct link to Injecting stress into a target" title="Direct link to Injecting stress into a target" translate="no">​</a></h2>
<p>I’d like to demonstrate how to inject StressChaos into a target. In this example, I’ll use <a href="https://github.com/paulbouwer/hello-kubernetes" target="_blank" rel="noopener noreferrer" class=""><code>hello-kubernetes</code></a>, which is managed by <a href="https://helm.sh/" target="_blank" rel="noopener noreferrer" class="">helm charts</a>. The first step is to clone the <a href="https://github.com/paulbouwer/hello-kubernetes" target="_blank" rel="noopener noreferrer" class=""><code>hello-kubernetes</code></a> repo and modify the chart to give it a resource limit.</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone https://github.com/paulbouwer/hello-kubernetes.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">code deploy/helm/hello-kubernetes/values.yaml </span><span class="token comment" style="color:#999988;font-style:italic"># or whichever editor you prefer</span><br></div></code></pre></div></div>
<p>Find the resources line, and change it into:</p>
<div class="language-yaml codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-yaml codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'200Mi'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'500Mi'</span><br></div></code></pre></div></div>
<p>However, before we inject anything, let's see how much memory the target is consuming. Go into the Pod and start a shell. Enter the following, substituting the name of your Pod for the one in the example:</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">kubectl </span><span class="token builtin class-name">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-it</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> hello-kubernetes hello-kubernetes-hello-world-b55bfcf68-8mln6 -- /bin/sh</span><br></div></code></pre></div></div>
<p>Display a summary of memory usage. Enter:</p>
<div class="language-sh codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-sh codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">/usr/src/app $ </span><span class="token function" style="color:#d73a49">free</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/usr/src/app $ </span><span class="token function" style="color:#d73a49">top</span><br></div></code></pre></div></div>
<p>As you can see from the output below, the Pod is consuming 4,269 MB of memory.</p>
<div class="language-sh codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-sh codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">/usr/src/app $ </span><span class="token function" style="color:#d73a49">free</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              used</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Mem:          </span><span class="token number" style="color:#36acaa">4269</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Swap:            </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/usr/src/app $ </span><span class="token function" style="color:#d73a49">top</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Mem: 12742432K used</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  PID  </span><span class="token environment constant" style="color:#36acaa">PPID</span><span class="token plain"> </span><span class="token environment constant" style="color:#36acaa">USER</span><span class="token plain">     STAT   VSZ %VSZ CPU %CPU COMMAND</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token number" style="color:#36acaa">1</span><span class="token plain">     </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain">     S     285m   </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">% </span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> start</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">18</span><span class="token plain">     </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain">     S     284m   </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">3</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">% </span><span class="token function" style="color:#d73a49">node</span><span class="token plain"> server.js</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">29</span><span class="token plain">     </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain">     S     </span><span class="token number" style="color:#36acaa">1636</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">% /bin/sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">36</span><span class="token plain">    </span><span class="token number" style="color:#36acaa">29</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain">     R     </span><span class="token number" style="color:#36acaa">1568</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">3</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">% </span><span class="token function" style="color:#d73a49">top</span><br></div></code></pre></div></div>
<p>That doesn’t seem right. We’ve limited its memory usage to 500 MiBs, and now the Pod seems to be using several GBs of memory. If we total the amount of process memory being used, it doesn’t equal 500 MiB. However, top and free at least give similar answers.</p>
<p>We will run a StressChaos on the Pod and see what happens. Here's the yaml we’ll use:</p>
<div class="language-yaml codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-yaml codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> chaos</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">mesh.org/v1alpha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> StressChaos</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mem</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">stress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> chaos</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">mesh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> all</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespaces</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> hello</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">kubernetes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">stressors</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">workers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">size</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 50MiB</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">options</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">''</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">duration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1h'</span><br></div></code></pre></div></div>
<p>Save the yaml to a file. I named it <code>memory.yaml</code>. To apply the chaos, run</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">~ kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> memory.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">stresschaos.chaos-mesh.org/mem-stress created</span><br></div></code></pre></div></div>
<p>Now, let's check the memory usage again.</p>
<div class="language-sh codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-sh codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">              used</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Mem:          </span><span class="token number" style="color:#36acaa">4332</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Swap:            </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Mem: 12805568K used</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  PID  </span><span class="token environment constant" style="color:#36acaa">PPID</span><span class="token plain"> </span><span class="token environment constant" style="color:#36acaa">USER</span><span class="token plain">     STAT   VSZ %VSZ CPU %CPU COMMAND</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">54</span><span class="token plain">    </span><span class="token number" style="color:#36acaa">50</span><span class="token plain"> root     R    </span><span class="token number" style="color:#36acaa">53252</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">1</span><span class="token plain">  </span><span class="token number" style="color:#36acaa">24</span><span class="token plain">% </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">stress-ng-vm</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> stress-ng </span><span class="token parameter variable" style="color:#36acaa">--vm</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> --vm-keep --vm-bytes </span><span class="token number" style="color:#36acaa">50000000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">57</span><span class="token plain">    </span><span class="token number" style="color:#36acaa">52</span><span class="token plain"> root     R    </span><span class="token number" style="color:#36acaa">53252</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">  </span><span class="token number" style="color:#36acaa">22</span><span class="token plain">% </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">stress-ng-vm</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> stress-ng </span><span class="token parameter variable" style="color:#36acaa">--vm</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> --vm-keep --vm-bytes </span><span class="token number" style="color:#36acaa">50000000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">55</span><span class="token plain">    </span><span class="token number" style="color:#36acaa">53</span><span class="token plain"> root     R    </span><span class="token number" style="color:#36acaa">53252</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">  </span><span class="token number" style="color:#36acaa">21</span><span class="token plain">% </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">stress-ng-vm</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> stress-ng </span><span class="token parameter variable" style="color:#36acaa">--vm</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> --vm-keep --vm-bytes </span><span class="token number" style="color:#36acaa">50000000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">56</span><span class="token plain">    </span><span class="token number" style="color:#36acaa">51</span><span class="token plain"> root     R    </span><span class="token number" style="color:#36acaa">53252</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">3</span><span class="token plain">  </span><span class="token number" style="color:#36acaa">21</span><span class="token plain">% </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">stress-ng-vm</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> stress-ng </span><span class="token parameter variable" style="color:#36acaa">--vm</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> --vm-keep --vm-bytes </span><span class="token number" style="color:#36acaa">50000000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">18</span><span class="token plain">     </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain">     S     289m   </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">% </span><span class="token function" style="color:#d73a49">node</span><span class="token plain"> server.js</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token number" style="color:#36acaa">1</span><span class="token plain">     </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain">     S     285m   </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">% </span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> start</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">51</span><span class="token plain">    </span><span class="token number" style="color:#36acaa">49</span><span class="token plain"> root     S    </span><span class="token number" style="color:#36acaa">41048</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">% </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">stress-ng-vm</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> stress-ng </span><span class="token parameter variable" style="color:#36acaa">--vm</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> --vm-keep --vm-bytes </span><span class="token number" style="color:#36acaa">50000000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">50</span><span class="token plain">    </span><span class="token number" style="color:#36acaa">49</span><span class="token plain"> root     S    </span><span class="token number" style="color:#36acaa">41048</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">% </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">stress-ng-vm</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> stress-ng </span><span class="token parameter variable" style="color:#36acaa">--vm</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> --vm-keep --vm-bytes </span><span class="token number" style="color:#36acaa">50000000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">52</span><span class="token plain">    </span><span class="token number" style="color:#36acaa">49</span><span class="token plain"> root     S    </span><span class="token number" style="color:#36acaa">41048</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">% </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">stress-ng-vm</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> stress-ng </span><span class="token parameter variable" style="color:#36acaa">--vm</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> --vm-keep --vm-bytes </span><span class="token number" style="color:#36acaa">50000000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">53</span><span class="token plain">    </span><span class="token number" style="color:#36acaa">49</span><span class="token plain"> root     S    </span><span class="token number" style="color:#36acaa">41048</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">3</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">% </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">stress-ng-vm</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> stress-ng </span><span class="token parameter variable" style="color:#36acaa">--vm</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> --vm-keep --vm-bytes </span><span class="token number" style="color:#36acaa">50000000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">49</span><span class="token plain">     </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> root     S    </span><span class="token number" style="color:#36acaa">41044</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">% stress-ng </span><span class="token parameter variable" style="color:#36acaa">--vm</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> --vm-keep --vm-bytes </span><span class="token number" style="color:#36acaa">50000000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">29</span><span class="token plain">     </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain">     S     </span><span class="token number" style="color:#36acaa">1636</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">3</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">% /bin/sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token number" style="color:#36acaa">48</span><span class="token plain">    </span><span class="token number" style="color:#36acaa">29</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain">     R     </span><span class="token number" style="color:#36acaa">1568</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">%   </span><span class="token number" style="color:#36acaa">1</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">% </span><span class="token function" style="color:#d73a49">top</span><br></div></code></pre></div></div>
<p>You can see that stress-ng instances are being injected into the Pod. There is a 60 MiB rise in the Pod, which we didn’t expect. The <a href="https://manpages.ubuntu.com/manpages/focal/en/man1/stress-ng.1.html" target="_blank" rel="noopener noreferrer" class="">documentation</a> indicates that the increase should 200 MiB (4 * 50 MiB).</p>
<p>Let's increase the stress by changing the memory stress from 50 MiB to 3,000 MiB. This should break the Pod’s memory limit. I’ll delete the chaos, modify the size, and reapply it.</p>
<p>And then, boom! The shell exits with code 137. A moment later, I reconnect to the container, and the memory usage returns to normal. No stress-ng instances are found! What happened?</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="why-does-stresschaos-disappear">Why does StressChaos disappear?<a href="https://chaos-mesh.org/blog/how-to-efficiently-stress-test-pod-memory/#why-does-stresschaos-disappear" class="hash-link" aria-label="Direct link to Why does StressChaos disappear?" title="Direct link to Why does StressChaos disappear?" translate="no">​</a></h2>
<p>Kubernetes limits your container memory usage through a mechanism named <a href="https://man7.org/linux/man-pages/man7/cgroups.7.html" target="_blank" rel="noopener noreferrer" class="">cgroup</a>. To see the 500 MiB limit in our Pod, go to the container and enter:</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">/usr/src/app $ </span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> /sys/fs/cgroup/memory/memory.limit_in_bytes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">524288000</span><br></div></code></pre></div></div>
<p>The output is displayed in bytes and translates to <code>500 * 1024 * 1024</code>.</p>
<p>Requests are used only for scheduling where to place the Pod. The Pod does not have a memory limit or request, but it can be seen as the sum of all its containers.</p>
<p>We've been making a mistake since the very beginning. free and top are not "cgrouped." They rely on <code>/proc/meminfo</code> (procfs) for data. Unfortunately, <code>/proc/meminfo</code> is old, so old it predates cgroup. It will provide you with <strong>host</strong> memory information instead of your container. Let's start from the beginning and see what memory usage we get this time.</p>
<p>To get the cgrouped memory usage, enter:</p>
<div class="language-sh codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-sh codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">/usr/src/app $ </span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> /sys/fs/cgroup/memory/memory.usage_in_bytes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">39821312</span><br></div></code></pre></div></div>
<p>Applying the 50 MiB StressChaos, yields the following:</p>
<div class="language-sh codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-sh codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">/usr/src/app $ </span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> /sys/fs/cgroup/memory/memory.usage_in_bytes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">93577216</span><br></div></code></pre></div></div>
<p>That is about 51 MiB more memory usage than without StressChaos.</p>
<p>Next, why did our shell exit? Exit code 137 indicates "failure as container received SIGKILL." That leads us to check the Pod. Pay attention to the Pod state and events.</p>
<div class="language-bash codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-bash codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">~ kubectl describe pods </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> hello-kubernetes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Last State:     Terminated</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Reason:       Error</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Exit Code:    </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Events:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Type     Reason     Age                  From               Message</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ----     ------     ----                 ----               -------</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Warning  Unhealthy  10m </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x4 over 16m</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">    kubelet            Readiness probe failed: Get </span><span class="token string" style="color:#e3116c">"http://10.244.1.19:8080/"</span><span class="token builtin class-name">:</span><span class="token plain"> context deadline exceeded </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Client.Timeout exceeded </span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> awaiting headers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Normal   Killing    10m </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x2 over 16m</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">    kubelet            Container hello-kubernetes failed liveness probe, will be restarted</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><br></div></code></pre></div></div>
<p>The events tell us why the shell crashed. <code>hello-kubernetes</code> has a liveness probe, and when the container memory is reaching the limit, the application starts to fail, and Kubernetes decides to terminate and restart it. When the Pod restarts, StressChaos stops. In that case, you can say that the chaos works fine. It finds vulnerability in your Pod. You could now fix it, and reapply the chaos. Everything seems perfect now—except for one thing. Why do four 50 MiB vm workers result in 51 MiB in total? The answer will not reveal itself unless we go into the stress-ng source code <a href="https://github.com/ColinIanKing/stress-ng/blob/819f7966666dafea5264cf1a2a0939fd344fcf08/stress-vm.c#L2074" target="_blank" rel="noopener noreferrer" class="">here</a> :</p>
<div class="language-c codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-c codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">vm_bytes </span><span class="token operator" style="color:#393A34">/=</span><span class="token plain"> args</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain">num_instances</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Oops! So the document is wrong. The multiple vm workers will take up the total size specified, rather than <code>mmap</code> that much memory per worker. Now, finally, we get an answer for everything. In the following sections, we’ll discuss some other situations involving memory stress.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="what-if-there-was-no-liveness-probe">What if there was no liveness probe?<a href="https://chaos-mesh.org/blog/how-to-efficiently-stress-test-pod-memory/#what-if-there-was-no-liveness-probe" class="hash-link" aria-label="Direct link to What if there was no liveness probe?" title="Direct link to What if there was no liveness probe?" translate="no">​</a></h2>
<p>Let's delete the probes and try again. Find the following lines in <code>deploy/helm/hello-kubernetes/templates/deployment.yaml</code> and delete them.</p>
<div class="language-yaml codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-yaml codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">livenessProbe</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">httpGet</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">readinessProbe</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">httpGet</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><br></div></code></pre></div></div>
<p>After that, upgrade the deployment.</p>
<p>What is interesting in this scenario is that the memory usage goes up continuously, and then drops sharply; it goes back and forth. What is happening now? Let's check the kernel log. Pay attention to the last two lines.</p>
<div class="language-sh codeBlockContainer_pGZf theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_S_WQ"><pre tabindex="0" class="prism-code language-sh codeBlock_Pb2F thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pJnY"><div class="token-line" style="color:#393A34"><span class="token plain">/usr/src/app $ </span><span class="token function" style="color:#d73a49">dmesg</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">189937.362908</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> pid </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">189937.363092</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">441060</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">  </span><span class="token number" style="color:#36acaa">1000</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">441060</span><span class="token plain">    </span><span class="token number" style="color:#36acaa">63955</span><span class="token plain">     </span><span class="token number" style="color:#36acaa">3791</span><span class="token plain">      </span><span class="token number" style="color:#36acaa">80</span><span class="token plain">     </span><span class="token number" style="color:#36acaa">3030</span><span class="token plain">           </span><span class="token number" style="color:#36acaa">988</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">189937.363110</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">441688</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">     </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">441688</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">193367</span><span class="token plain">     </span><span class="token number" style="color:#36acaa">2136</span><span class="token plain">     </span><span class="token number" style="color:#36acaa">372</span><span class="token plain">   </span><span class="token number" style="color:#36acaa">181097</span><span class="token plain">          </span><span class="token number" style="color:#36acaa">1000</span><span class="token plain"> stress-ng-vm</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">189937.363148</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Memory cgroup out of memory: Kill process </span><span class="token number" style="color:#36acaa">443160</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">stress-ng-vm</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> score </span><span class="token number" style="color:#36acaa">1272</span><span class="token plain"> or sacrifice child</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">189937.363186</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Killed process </span><span class="token number" style="color:#36acaa">443160</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">stress-ng-vm</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">, </span><span class="token environment constant" style="color:#36acaa">UID</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">, total-vm:773468kB, anon-rss:152704kB, file-rss:164kB, shmem-rss:0kB</span><br></div></code></pre></div></div>
<p>It’s clear from the output that the <code>stress-ng-vm</code> processes are being killed because there are out of memory (OOM) errors.</p>
<p>If processes can’t get the memory they want, things get tricky. They are very likely to fail. Rather than wait for processes to crash, it’s better if you kill some of them to get more memory. The OOM killer stops processes by an order and tries to recover the most memory while causing the least trouble. For detailed information on this process, see <a href="https://lwn.net/Articles/391222/" target="_blank" rel="noopener noreferrer" class="">this introduction</a> to OOM killer.</p>
<p>Looking at the output above, you can see that <code>node</code>, which is our application process that should never be terminated, has an <code>oom_score_adj</code> of 988. That is quite dangerous since it is the process with the highest score to get killed. But there is a simple way to stop the OOM killer from killing a specific process. When you create a Pod, it is assigned a Quality of Service (QoS) class. For detailed information, see <a href="https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/" target="_blank" rel="noopener noreferrer" class="">Configure Quality of Service for Pods</a>.</p>
<p>Generally, if you create a Pod with precisely-specified resource requests, it is classified as a <code>Guaranteed</code> Pod. OOM killers do not kill containers in a <code>Guaranteed</code> Pod if there are other things to kill. These entities include non-<code>Guaranteed</code> Pods and stress-ng workers. A Pod with no resource requests is marked as <code>BestEffort</code>, and the OOM killer stops it first.</p>
<p>So that's all for the tour. Our suggestion is that <code>free</code> and <code>top</code> should not be used to assess memory in containers. Be careful when you assign resource limits to your Pod and select the right QoS. In the future, we’ll create a more detailed StressChaos document.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="deeper-dive-into-kubernetes-memory-management">Deeper dive into Kubernetes memory management<a href="https://chaos-mesh.org/blog/how-to-efficiently-stress-test-pod-memory/#deeper-dive-into-kubernetes-memory-management" class="hash-link" aria-label="Direct link to Deeper dive into Kubernetes memory management" title="Direct link to Deeper dive into Kubernetes memory management" translate="no">​</a></h2>
<p>Kubernetes tries to evict Pods that use too much memory (but not more memory than their limits). Kubernetes gets your Pod memory usage from <code>/sys/fs/cgroup/memory/memory.usage_in_bytes</code> and subtracts it by the <code>total_inactive_file</code> line in <code>memory.stat</code>.</p>
<p>Keep in mind that Kuberenetes <strong>does not</strong> support swap. Even if you have a node with swap enabled, Kubernetes creates containers with <code>swappiness=0</code>, which means swap is eventually disabled. That is mainly for performance concerns.</p>
<p><code>memory.usage_in_bytes</code> equals <code>resident set</code> plus <code>cache</code>, and <code>total_inactive_file</code> is memory in cache that the OS can retrieve if the memory is running out. <code>memory.usage_in_bytes - total_inactive_file</code> is called <code>working_set</code>. You will get this <code>working_set</code> value by <code>kubectl top pod &lt;your pod&gt; --containers</code>. Kubernetes uses this value to decide whether or not to evict your Pods.</p>
<p>Kubernetes periodically inspects memory usage. If a container's memory usage increases too quickly or the container cannot be evicted, the OOM killer is invoked. Kubernetes has its way of protecting its own process, so it always picks the container. When a container is killed, it may or may not be restarted, depending on your restart policy. If it is killed, when you execute <code>kubectl describe pod &lt;your pod&gt;</code> you will see it is restarted and the reason is <code>OOMKilled</code>.</p>
<p>Another thing worth mentioning is the kernel memory. Since <code>v1.9</code>, Kubernetes’ kernel memory support is enabled by default. It is also a feature of cgroup memory subsystems. You can limit container kernel memory usage. Unfortunately, this causes a cgroup leak on kernel versions up to <code>v4.2</code>. You can either upgrade your kernel to <code>v4.3</code> or disable it.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="how-we-implement-stresschaos">How we implement StressChaos<a href="https://chaos-mesh.org/blog/how-to-efficiently-stress-test-pod-memory/#how-we-implement-stresschaos" class="hash-link" aria-label="Direct link to How we implement StressChaos" title="Direct link to How we implement StressChaos" translate="no">​</a></h2>
<p>StressChaos is a simple way to test your container's behavior when it is low on memory. StressChaos utilizes a powerful tool named <code>stress-ng</code> to allocate memory and continue writing to the allocated memory. Because containers have memory limits and container limits are bound to a cgroup, we must find a way to run <code>stress-ng</code> in a specific cgroup. Luckily, this part is easy. With enough privileges, we can assign any process to any cgroup by writing to files in <code>/sys/fs/cgroup/</code>.</p>
<p>If you are interested in Chaos Mesh and would like to help us improve it, you're welcome to join our <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">Slack channel</a> (#project-chaos-mesh)! Or submit your pull requests or issues to our <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
            <category>StressChaos</category>
            <category>Stress Testing</category>
        </item>
        <item>
            <title><![CDATA[Chaos Mesh Remake: One Step Closer toward Chaos as a Service]]></title>
            <link>https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/</link>
            <guid>https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/</guid>
            <pubDate>Fri, 25 Jun 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Chaos engineering tools]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos engineering tools" src="https://chaos-mesh.org/assets/images/chaos-engineering-tools-as-a-service-018f1130dab4f321b60a8eccd366c0e1.jpeg" width="3126" height="1043" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos engineering tools</figcaption></figure><p></p>
<p><a href="https://chaos-mesh.org/" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> is a cloud-native Chaos Engineering platform that orchestrates chaos in Kubernetes environments. With Chaos Mesh, you can test your system's resilience and robustness on Kubernetes by injecting all types of faults into Pods, network, file system, and even the kernel.</p>
<!-- -->
<p>Since it was open-sourced and accepted by the Cloud Native Computing Foundation (CNCF) as a sandbox project, Chaos Mesh has attracted contributors worldwide and helped users test their systems. Yet it still has a lot of room for improvement:</p>
<ul>
<li class="">It needs to improve usability. Some features are complicated to use. For example, when you apply a chaos experiment, you often have to manually check whether the experiment has started.</li>
<li class="">It is mostly for Kubernetes environments. Because Chaos Mesh can't manage multiple Kubernetes clusters, you need to deploy Chaos Mesh for each Kubernetes cluster. Though <a href="https://github.com/chaos-mesh/chaosd" target="_blank" rel="noopener noreferrer" class="">chaosd</a> supports running chaos experiments on physical machines, the features are quite limited, and command line usage is not user friendly.</li>
<li class="">It doesn't allow plugins. To apply a customized chaos experiment, you have to alter the source code. Moreover, Chaos Mesh only supports Golang.</li>
</ul>
<p>Admittedly, Chaos Mesh is a first-rate Chaos Engineering platform, but is still a long way from offering Chaos as a Service (CaaS). Therefore, at <a href="https://pingcap.com/community-activity/tidb-hackathon-2020/" target="_blank" rel="noopener noreferrer" class="">TiDB Hackathon 2020</a>, <strong>we made changes to Chaos Mesh's architecture, moving it one step closer toward CaaS</strong>.</p>
<p>In this article, I'll talk about what CaaS is, how we achieve it with Chaos Mesh, and our plans and lessons learned. I hope you find our experience helpful in building your own Chaos Engineering system.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="what-is-chaos-as-a-service">What is Chaos as a Service?<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#what-is-chaos-as-a-service" class="hash-link" aria-label="Direct link to What is Chaos as a Service?" title="Direct link to What is Chaos as a Service?" translate="no">​</a></h2>
<p>As Matt Fornaciari, co-founder of Gremlin, <a href="https://jaxenter.com/chaos-engineering-service-144113.html" target="_blank" rel="noopener noreferrer" class="">puts it</a>, CaaS "means you will get an intuitive UI, customer support, out-of-the-box integrations, and everything else you need to get experimenting in a matter of minutes."</p>
<p>From our perspective, CaaS should offer:</p>
<ul>
<li class="">A unified console for management, where you can edit the configuration and create chaos experiments.</li>
<li class="">Visualized metrics for you to see the experiment status.</li>
<li class="">Operations to pause or archive experiments.</li>
<li class="">Simple interaction. You can easily drag and drop the objects to orchestrate your experiments.</li>
</ul>
<p>Some companies already adapted Chaos Mesh to meet their own needs, such as <a href="https://pingcap.com/blog/how-a-top-game-company-uses-chaos-engineering-to-improve-testing" target="_blank" rel="noopener noreferrer" class="">NetEase Fuxi AI Lab</a> and FreeWheel, making it a mock-up for CaaS.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="developing-chaos-mesh-towards-caas">Developing Chaos Mesh towards CaaS<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#developing-chaos-mesh-towards-caas" class="hash-link" aria-label="Direct link to Developing Chaos Mesh towards CaaS" title="Direct link to Developing Chaos Mesh towards CaaS" translate="no">​</a></h2>
<p>Based on our understanding of CaaS, we refined the architecture of Chaos Mesh during Hackathon, including improved support for different systems and better observability. You can check out our code in <a href="https://github.com/wuntun/chaos-mesh/tree/caas" target="_blank" rel="noopener noreferrer" class="">wuntun/chaos-mesh</a> and <a href="https://github.com/wuntun/chaosd/tree/caas" target="_blank" rel="noopener noreferrer" class="">wuntun/chaosd</a>.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="refactor-chaos-dashboard">Refactor Chaos Dashboard<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#refactor-chaos-dashboard" class="hash-link" aria-label="Direct link to Refactor Chaos Dashboard" title="Direct link to Refactor Chaos Dashboard" translate="no">​</a></h3>
<p>The current Chaos Mesh architecture is suited for individual Kubernetes clusters. Chaos Dashboard, the web UI, is bound to a specified Kubernetes environment:</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh architecture" src="https://chaos-mesh.org/assets/images/chaos-mesh-remake-architecture-11dd1c3b15d9508739904ec7571972fb.jpeg" width="1635" height="739" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh architecture</figcaption></figure><p></p>
<p>During this refactor, <strong>to allow Chaos Dashboard to manage multiple Kubernetes clusters, we separate Chaos Dashboard from the main architecture</strong>. Now, if you deploy Chaos Dashboard outside of the Kubernetes cluster, you can add the cluster to Chaos Dashboard via the web UI. If you deploy Chaos Dashboard inside the cluster, it automatically obtains the cluster information through environment variables.</p>
<p>You can register Chaos Mesh (technically, the Kubernetes configuration) in Chaos Dashboard or ask <code>chaos-controller-manager</code> to report to Chaos Dashboard via configuration. Chaos Dashboard and <code>chaos-controller-manager</code> interact via CustomResourceDefinitions (CRDs). When <code>chaos-controller-manager</code> finds a Chaos Mesh CRD event, it invokes <code>chaos-daemon</code> to carry out the related chaos experiment. Therefore, Chaos Dashboard can manage experiments by operating on CRDs.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="refactor-chaosd">Refactor chaosd<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#refactor-chaosd" class="hash-link" aria-label="Direct link to Refactor chaosd" title="Direct link to Refactor chaosd" translate="no">​</a></h3>
<p>chaosd is a toolkit for running chaos experiments on physical machines. Previously, it was only a command line tool and had limited features.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="chaosd, a Chaos Engineering command line tool" src="https://chaos-mesh.org/assets/images/chaosd-chaos-engineering-command-line-tool-b516d67d95f896a548a90492e516e870.jpeg" width="1331" height="561" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">chaosd, a Chaos Engineering command line tool</figcaption></figure><p></p>
<p>During the refactoring, <strong>we enabled chaosd to support the RESTful API and enhanced its services so that it can configure chaos experiments by parsing CRD-format JSON or YAML files</strong>.</p>
<p>Now, chaosd can register itself to Chaos Dashboard via configuration and send regular heartbeats to Chaos Dashboard. With the heartbeat signals, Chaos Dashboard can manage the chaosd node status. You can also add chaosd nodes to Chaos Dashboard via the web UI.</p>
<p>Moreover, <strong>chaosd can now schedule chaos experiments at specified time and manage experiment lifecycles, which unifies the user experience on Kubernetes and on physical machines</strong>.</p>
<p>With new Chaos Dashboard and chaosd, the optimized architecture of Chaos Mesh is as follows:</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Mesh&amp;#39;s optimized architecture" src="https://chaos-mesh.org/assets/images/chaos-mesh-optimized-architecture-8887bf8ec188ff72990a48dd1b2735f8.jpeg" width="1482" height="824" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Mesh's optimized architecture</figcaption></figure><p></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="improve-observability">Improve observability<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#improve-observability" class="hash-link" aria-label="Direct link to Improve observability" title="Direct link to Improve observability" translate="no">​</a></h3>
<p>Another improvement is observability, namely how to tell if an experiment is carried out successfully.</p>
<p>Before the improvement, you had to manually check the experiment metrics. If you injected <a href="https://chaos-mesh-website-archived.netlify.app/docs/1.2.4/chaos_experiments/stresschaos" target="_blank" rel="noopener noreferrer" class="">StressChaos</a> into a Pod, you had to enter the Pod to see if there was a <code>stress-ng</code> process and then use <code>top</code> commands to check CPU and memory utilization. These metrics told you whether your StressChaos experiment was created successfully.</p>
<p>To streamline the process, we now integrate <code>node_exporter</code> into <code>chaos-daemon</code> and chaosd to collect node metrics. We also deploy <code>kube-state-metrics</code> in the Kubernetes cluster, combined with cadvisor, to collect Kubernetes metrics. The collected metrics are saved and visualized by Prometheus and Grafana, which provide a simple method for you to check the experiment status.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="further-improvements-needed">Further improvements needed<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#further-improvements-needed" class="hash-link" aria-label="Direct link to Further improvements needed" title="Direct link to Further improvements needed" translate="no">​</a></h4>
<p>Overall, metrics aim to help you:</p>
<ul>
<li class="">Confirm that chaos is injected.</li>
<li class="">Observe the chaos impact on the service and make periodic analysis.</li>
<li class="">Respond to exceptional chaos events.</li>
</ul>
<p>To achieve these goals, the system needs to monitor the experiment data metrics, the ordinary metrics, and the experiment events. Chaos Mesh still needs to improve:</p>
<ul>
<li class="">Experiment data metrics, such as the exact latency duration of the injected network latency and the specific load of the simulated workload.</li>
<li class="">Experiment events; that is, the Kubernetes events of creating, deleting, and running experiments.</li>
</ul>
<p>Here is a good example of metrics from <a href="https://github.com/litmuschaos/chaos-exporter#example-metrics" target="_blank" rel="noopener noreferrer" class="">Litmus</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="other-proposals-for-chaos-mesh">Other proposals for Chaos Mesh<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#other-proposals-for-chaos-mesh" class="hash-link" aria-label="Direct link to Other proposals for Chaos Mesh" title="Direct link to Other proposals for Chaos Mesh" translate="no">​</a></h2>
<p>Because of the limited time at Hackathon, we didn't finish all our plans. Here are some of our proposals for the Chaos Mesh community to consider in the future.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="orchestration">Orchestration<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#orchestration" class="hash-link" aria-label="Direct link to Orchestration" title="Direct link to Orchestration" translate="no">​</a></h3>
<p>A closed loop of Chaos Engineering includes four steps: exploring chaos, discovering deficiencies in the system, analyzing root causes, and sending feedback for improvement.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="A closed loop of Chaos Engineering" src="https://chaos-mesh.org/assets/images/closed-loop-of-chaos-engineering-3dc83a5a0d542f1cb6a873130b48bd22.jpeg" width="1338" height="484" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">A closed loop of Chaos Engineering</figcaption></figure><p></p>
<p>However, <strong>most of the current open source Chaos Engineering tools only focus on exploration and do not provide pragmatic feedback.</strong> Based on the improved observability component, we can monitor chaos experiments in real time and compare and analyze the experiment results.</p>
<p>With these results, we will be able to realize a closed loop by adding another important component: orchestration. The Chaos Mesh community already proposed a <a href="https://github.com/chaos-mesh/rfcs/pull/10/files" target="_blank" rel="noopener noreferrer" class="">Workflow</a> feature, which enables you to easily orchestrate and call back chaos experiments or conveniently integrate Chaos Mesh with other systems. You can run chaos experiments in the CI/CD phase or after a canary release.</p>
<p><strong>Combining observability and orchestration makes a closed feedback loop for Chaos Engineering.</strong> If you were to launch a 100 ms network latency test on a Pod, you could observe the latency change using the observability component and check if the Pod service is still available using PromQL or other DSL based on orchestration. If the service was unavailable, you may conclude that the service is unavailable when the latency is &gt;= 100 ms.</p>
<p>But 100 ms is not the threshold of your service; you need to know what is the largest latency your service can handle. By orchestrating the value of the chaos experiment, you'll know what is the threshold value you must ensure to meet your service-level objectives. Also, you'll find out the service performance under different network conditions and whether they meet your expectations.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="data-format">Data format<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#data-format" class="hash-link" aria-label="Direct link to Data format" title="Direct link to Data format" translate="no">​</a></h3>
<p>Chaos Mesh uses CRDs to define its chaos objects. If we can convert CRDs to JSON files, we can achieve communication between components.</p>
<p>In terms of data format, chaosd just consumes and registers CRD data in JSON format. If a chaos tool can consume CRD data and register itself, it can run chaos experiments in different scenarios.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="plugins">Plugins<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#plugins" class="hash-link" aria-label="Direct link to Plugins" title="Direct link to Plugins" translate="no">​</a></h3>
<p>Chaos Mesh has limited support for plugins. You can only <a href="https://chaos-mesh-website-archived.netlify.app/docs/1.2.4/development_guides/develop_a_new_chaos/" target="_blank" rel="noopener noreferrer" class="">add a new Chaos</a> by registering a CRD in Kubernetes API. This brings about two problems:</p>
<ul>
<li class="">You must develop the plugin using Golang, the same language in which Chaos Mesh is written.</li>
<li class="">You must merge the extended code into the Chaos Mesh project. Because Chaos Mesh doesn't have a security mechanism like Berkeley Packet Filter (BPF), merging plugin code may introduce extra risks.</li>
</ul>
<p>To enable full plugin support, we need to explore a new method to add plugins. As Chaos Mesh essentially carries out chaos experiments based on CRD, a chaos experiment only requires generating, listening to, and deleting CRDs. In this regard, we have several ideas worth trying:</p>
<ul>
<li class="">Develop a controller or operator to manage CRDs.</li>
<li class="">Handle CRD events uniformly and operate on CRDs via HTTP callback. This method only uses HTTP APIs, with no requirement on Golang. For an example, see <a href="https://github.com/summerwind/whitebox-controller" target="_blank" rel="noopener noreferrer" class="">Whitebox Controller</a>.</li>
<li class="">Use WebAssembly (Wasm). When you need to call chaos experiment logic, just call the Wasm program.</li>
<li class="">Use SQL to query the chaos experiment status. Because Chaos Mesh is based on CRDs, you can use SQL to operate on Kubernetes. Examples include <a href="https://github.com/xuxinkun/kubesql" target="_blank" rel="noopener noreferrer" class="">Presto connector</a> and <a href="https://github.com/aquasecurity/kube-query" target="_blank" rel="noopener noreferrer" class="">osquery extension</a>.</li>
<li class="">Use SDK-based extensions, such as <a href="https://docs.chaostoolkit.org/reference/api/experiment/" target="_blank" rel="noopener noreferrer" class="">Chaos Toolkit</a>.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="integration-with-other-chaos-tools">Integration with other Chaos tools<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#integration-with-other-chaos-tools" class="hash-link" aria-label="Direct link to Integration with other Chaos tools" title="Direct link to Integration with other Chaos tools" translate="no">​</a></h3>
<p>For real-world systems, a single Chaos Engineering tool can hardly exhaust all possible use cases. That's why integrating with other chaos tools can make the Chaos Engineering ecosystem more powerful.</p>
<p>There are numerous Chaos Engineering tools on the market. Litmus's <a href="https://github.com/litmuschaos/litmus-go/tree/2.14.1/chaoslib/powerfulseal" target="_blank" rel="noopener noreferrer" class="">Kubernetes implementation</a> is based on <a href="https://github.com/powerfulseal/powerfulseal" target="_blank" rel="noopener noreferrer" class="">PowerfulSeal</a>, while its <a href="https://github.com/litmuschaos/litmus-go/tree/2.14.1/chaoslib/pumba" target="_blank" rel="noopener noreferrer" class="">container implementation</a> is based on <a href="https://github.com/alexei-led/pumba" target="_blank" rel="noopener noreferrer" class="">Pumba</a>. <a href="https://github.com/cloud-bulldozer/kraken" target="_blank" rel="noopener noreferrer" class="">Kraken</a> focuses on Kubernetes, <a href="https://github.com/amzn/awsssmchaosrunner" target="_blank" rel="noopener noreferrer" class="">AWSSSMChaosRunner</a> focuses on AWS, and <a href="https://github.com/shopify/toxiproxy" target="_blank" rel="noopener noreferrer" class="">Toxiproxy</a> targets TCP. There are also merging projects based on <a href="https://docs.google.com/presentation/d/1gMlmXqH6ufnb8eNO10WqVjqrPRGAO5-1S1zjcGo1Zr4/edit#slide=id.g58453c664c_2_75" target="_blank" rel="noopener noreferrer" class="">Envoy</a> and Istio.</p>
<p>To manage the various chaos tools, we may need a uniform pattern, such as <a href="https://hub.litmuschaos.io/" target="_blank" rel="noopener noreferrer" class="">Chaos Hub</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="voices-from-the-community">Voices from the community<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#voices-from-the-community" class="hash-link" aria-label="Direct link to Voices from the community" title="Direct link to Voices from the community" translate="no">​</a></h2>
<p>Here, we'd like to share how a leading cyber security company in China as well as a Chaos Mesh user, adapts Chaos Mesh to meet their needs. Their adaptation has three aspects: physical node, container, and application.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="physical-node">Physical node<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#physical-node" class="hash-link" aria-label="Direct link to Physical node" title="Direct link to Physical node" translate="no">​</a></h3>
<ul>
<li class="">Support executing scripts on physical servers. You can configure the script directory in CRDs and run your scripts using <code>chaos-daemon</code>.</li>
<li class="">Simulate reboot, shutdown, and kernel panic using the customized script.</li>
<li class="">Shut down the node's NIC using the customized script.</li>
<li class="">Create frequent context switching using sysbench to simulate the "noisy neighbor" effect.</li>
<li class="">Intercept the container's system call using BPF's <code>seccomp</code>. This is achieved by passing and filtering PIDs.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="container">Container<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#container" class="hash-link" aria-label="Direct link to Container" title="Direct link to Container" translate="no">​</a></h3>
<ul>
<li class="">Randomly change the number of Deployment replicas to test if the application's traffic is abnormal.</li>
<li class="">Embed based on CRD objects: fill Ingress objects in chaos CRDs to simulate the speed limit of the interface.</li>
<li class="">Embed based on CRD objects: fill Cilium network policy objects in chaos CRDs to simulate fluctuating network conditions.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="application">Application<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#application" class="hash-link" aria-label="Direct link to Application" title="Direct link to Application" translate="no">​</a></h3>
<ul>
<li class="">Support running customized jobs. Currently, Chaos Mesh injects chaos using <code>chaos-daemon</code>, which doesn't guarantee fairness and affinity of scheduling. To address this issue, we can use <code>chaos-controller-manager</code> to directly create jobs for different CRDs.</li>
<li class="">Support running <a href="https://github.com/postmanlabs/newman" target="_blank" rel="noopener noreferrer" class="">Newman</a> in customized jobs to randomly change HTTP parameters. This is to implement chaos experiments on the HTTP interface, which happens when a user performs exceptional behaviors.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="summary">Summary<a href="https://chaos-mesh.org/blog/chaos-mesh-remake-one-step-closer-towards-chaos-as-a-service/#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<p>Traditional fault testing targets specific points in the system that are anticipated to be vulnerable. It is often an assertion: a specific condition produces a specific result.</p>
<p><strong>Chaos Engineering is more powerful in that it helps you discover the "unknown unknowns."</strong> By exploring in the broader domain, Chaos Engineering deepens your knowledge of the system being tested and unearths new information.</p>
<p>To sum up, these are some of our personal thoughts and practice on Chaos Engineering and Chaos Mesh. Our Hackathon project is not ready for production yet, but we hope to shed some light on CaaS and draft a promising roadmap for Chaos Mesh. If you're interested in building Chaos as a Service, <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">join our Slack</a> (#project-chaos-mesh)!</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
        </item>
        <item>
            <title><![CDATA[From a Newbie in Software Engineering to a Graduated LFX-Mentee]]></title>
            <link>https://chaos-mesh.org/blog/lfx-mentorship-enriching-awschaos/</link>
            <guid>https://chaos-mesh.org/blog/lfx-mentorship-enriching-awschaos/</guid>
            <pubDate>Sun, 20 Jun 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[LFX Mentorship Experience]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="LFX Mentorship Experience" src="https://chaos-mesh.org/assets/images/mentorship_blog-0c9d6fd8d0cc68644782727e0d67baee.jpeg" width="3126" height="1042" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">LFX Mentorship Experience</figcaption></figure><p></p>
<p><a href="https://mentorship.lfx.linuxfoundation.org/mentee/6a0bf7de-9e18-4acb-9a66-f5fecdbeb42e" target="_blank" rel="noopener noreferrer" class="">I’m</a> a junior undergraduate majoring in Biomedical Engineering in the Department of Biotechnology and Medical Engineering at the <a href="https://nitrkl.ac.in/" target="_blank" rel="noopener noreferrer" class="">National Institute of Technology Rourkela</a>, India. For someone who started to code only because I was fascinated by it, it was all a journey of self-learning, filled with various adversities. But when I started with open-source contributions, it was all very beginner-friendly and I came across a lot of people who helped me learn the tech stack better.</p>
<!-- -->
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="img1" src="https://chaos-mesh.org/assets/images/mentroship_blog1-e96abe255f46c1dab61e7662a5a04e0e.png" width="353" height="419" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">img1</figcaption></figure><p></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="the-journey-through-the-application">The journey through the application<a href="https://chaos-mesh.org/blog/lfx-mentorship-enriching-awschaos/#the-journey-through-the-application" class="hash-link" aria-label="Direct link to The journey through the application" title="Direct link to The journey through the application" translate="no">​</a></h2>
<p>In the spring of 2021, I got to know about this LFX mentorship program and after browsing through all the <a href="https://github.com/cncf/mentoring/blob/master/lfx-mentorship/2021/01-Spring/README.md" target="_blank" rel="noopener noreferrer" class="">projects</a>, it felt quite intimidating to me as I wasn’t acquainted with most of the terms and was confused, and I thought it was not for newbies like me. Then I went through the program <a href="https://docs.linuxfoundation.org/lfx/mentorship" target="_blank" rel="noopener noreferrer" class="">docs</a>, the mentorship <a href="https://docs.linuxfoundation.org/lfx/mentorship/mentorship-faqs" target="_blank" rel="noopener noreferrer" class="">FAQ’s</a> followed the steps mentioned there and applied for a few projects that interested me, and used tech-stacks that I am familiar with, like Docker, AWS, Python, etc.</p>
<p>Then I applied to both projects offered by <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> and submitted my CV and cover letter as immediate tasks. After a few days, I received an email from my mentor regarding an additional task to be submitted.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="img2" src="https://chaos-mesh.org/assets/images/mentorship_blog2-5925a4b5126efae502340dfaf5d95064.png" width="700" height="590" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">img2</figcaption></figure><p></p>
<p>I completed the above-mentioned task, uploaded the files to GitHub, and shared the link with my mentor.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="the-selection-and-initial-days-as-a-mentee">The selection and Initial days as a mentee<a href="https://chaos-mesh.org/blog/lfx-mentorship-enriching-awschaos/#the-selection-and-initial-days-as-a-mentee" class="hash-link" aria-label="Direct link to The selection and Initial days as a mentee" title="Direct link to The selection and Initial days as a mentee" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-note admonition_zECE alert alert--secondary"><div class="admonitionHeading_p7pM"><span class="admonitionIcon_RWck"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_DNgP"><p>2022-10-24: Because of <a href="https://www.oreilly.com/online-learning/leveraging-katacoda-technology.html" target="_blank" rel="noopener noreferrer" class="">https://www.oreilly.com/online-learning/leveraging-katacoda-technology.html</a>, and refer to <a href="https://github.com/chaos-mesh/website/pull/356" target="_blank" rel="noopener noreferrer" class="">#356</a>, the interactive tutorial is temporarily unavailable.</p></div></div>
<p>I distinctly remember the day when I received an email from my mentor regarding my selection in the mentorship program. I was elated, as it was my first involvement in any open-source program. I was glad to be accepted as a mentee in the program, I even received an email from CNCF regarding my selection.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="img3" src="https://chaos-mesh.org/assets/images/mentorship_blog4-c9f0e57401ea29be852f9f62f8aba238.png" width="687" height="772" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">img3</figcaption></figure><p></p>
<p>Along with my mentor, we decided on our mode of communication: through Slack. He also enquired about my knowledge of Kubernetes and GOlang, as I didn’t have much knowledge about either of them. He suggested a few resources and gave me 2 weeks to go through them. In the meantime, he also planned a few experiments for me to get acquainted with all these technologies.</p>
<p>As I was getting more comfortable with Kubernetes, I started exploring Chaos Mesh and completed the <code>interactive tutorial</code>, which gave me a clearer idea about the usage of Chaos Mesh. I then implemented the <a href="https://chaos-mesh-website-archived.netlify.app/docs/1.2.4/development_guides/develop_a_new_chaos" target="_blank" rel="noopener noreferrer" class="">hello-world chaos</a>, which helped me to know more about controllers and CRDs, considered to be the most important part of Chaos Mesh. Also, I got to know about the boilerplate codes, the <a href="https://github.com/kubernetes-sigs/kubebuilder" target="_blank" rel="noopener noreferrer" class="">kube-builder client</a>, and how to use them for scaffolding, followed by writing our own controllers.</p>
<p>After the initial days of experimenting and getting to know the project better, I started with solving a few good first issues to get acquainted with upstream contributions to Chaos Mesh.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="img4" src="https://chaos-mesh.org/assets/images/mentorship_blog3-7e4fd166523fb553e3c254d2ba1390ae.png" width="1208" height="156" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">img4</figcaption></figure><p></p>
<p>In one of my contributions, I tried to add multi-container support to stress-chaos, which was not possible before. Though it was successfully implemented, it broke a few other features and couldn’t be merged for the upcoming release. What’s more, for the 2.0.0 release, this refactoring was already done, so this particular contribution was a learning experience for both me and my mentor. After that, we became careful and the next time we tried to implement any new features, we would first submit an <a href="https://github.com/chaos-mesh/rfcs" target="_blank" rel="noopener noreferrer" class="">RFC</a> and have discussions with the other contributors before starting.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="my-contribution-to-aws-chaos">My contribution to AWS Chaos<a href="https://chaos-mesh.org/blog/lfx-mentorship-enriching-awschaos/#my-contribution-to-aws-chaos" class="hash-link" aria-label="Direct link to My contribution to AWS Chaos" title="Direct link to My contribution to AWS Chaos" translate="no">​</a></h2>
<p>Initially, I was asked to implement one type of AWS Chaos as part of this project, but as I started exploring more about it, I found <a href="https://github.com/amzn/awsssmchaosrunner" target="_blank" rel="noopener noreferrer" class="">awsssmchaosrunner</a>, and given its functionality, we wanted to integrate it into Chaos Mesh.</p>
<p>We planned to do it in two parts, one part is the “<a href="https://github.com/STRRL/awsssmchaosrunner-cli" target="_blank" rel="noopener noreferrer" class="">runner thing</a>” project, which integrates with awsssmchaosrunner, that part should be written in kotlin, and a docker image is to be built out of it.</p>
<p>Another part is the definition of the AWS Chaos and its <a href="https://github.com/chaos-mesh/chaos-mesh/pull/1919" target="_blank" rel="noopener noreferrer" class="">controller</a>, which is to be written in go, the controller of AWS Chaos will create a pod with that “kotlin cli image”, and send commands to AWS.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="other-opportunities">Other opportunities<a href="https://chaos-mesh.org/blog/lfx-mentorship-enriching-awschaos/#other-opportunities" class="hash-link" aria-label="Direct link to Other opportunities" title="Direct link to Other opportunities" translate="no">​</a></h2>
<p>I was invited to one of the Chaos Mesh <a href="https://www.youtube.com/watch?v=ElG0pHRoXwI&amp;t=2s" target="_blank" rel="noopener noreferrer" class="">community meetings</a> towards the end of the mentorship where I showcased my project.</p>
<p>Afterwards, I applied for the CFP for <a href="https://community.cncf.io/events/details/cncf-kcd-bengaluru-presents-kubernetes-community-days-bengaluru/" target="_blank" rel="noopener noreferrer" class="">Kubernetes Community Days Bangalore</a>, scheduled virtually from June 25–26, 2021, and was selected as a speaker and now I’m all set to present my talk there.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="graduation-and-next-steps">Graduation and Next steps<a href="https://chaos-mesh.org/blog/lfx-mentorship-enriching-awschaos/#graduation-and-next-steps" class="hash-link" aria-label="Direct link to Graduation and Next steps" title="Direct link to Graduation and Next steps" translate="no">​</a></h2>
<p>Yayyyy!! After 12 weeks, I successfully graduated from the program, thanks to my mentor <a href="https://mentorship.lfx.linuxfoundation.org/mentor/e78b3177-160c-4566-9f3d-8fc9b2ec3cea" target="_blank" rel="noopener noreferrer" class="">Zhou Zhiqiang</a> and his guidance, because without whom, this wouldn’t have been possible.</p>
<p>I had an amazing time with the Chaos Mesh community, with the amazing members supporting and helping me throughout the journey. I look forward to contributing more to this project and being more active in the community.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="join-the-chaos-mesh-community">Join the Chaos Mesh community<a href="https://chaos-mesh.org/blog/lfx-mentorship-enriching-awschaos/#join-the-chaos-mesh-community" class="hash-link" aria-label="Direct link to Join the Chaos Mesh community" title="Direct link to Join the Chaos Mesh community" translate="no">​</a></h2>
<p>To join and learn more about Chaos Mesh, find the #project-chaos-mesh channel in <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">CNCF slack workspace</a> or their <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
            <category>LFX Mentorship</category>
            <category>AWS Chaos</category>
        </item>
        <item>
            <title><![CDATA[Celebrating One Year of Chaos Mesh: Looking Back and Ahead]]></title>
            <link>https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/</link>
            <guid>https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/</guid>
            <pubDate>Fri, 05 Feb 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Celebrating One Year of Chaos Mesh: Looking Back and Ahead]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Celebrating One Year of Chaos Mesh: Looking Back and Ahead" src="https://chaos-mesh.org/assets/images/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead-225fa7cb90dbea594d278bd75a6cbcba.jpg" width="3126" height="1042" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Celebrating One Year of Chaos Mesh: Looking Back and Ahead</figcaption></figure><p></p>
<p>It’s been a year since Chaos Mesh was first open-sourced on GitHub. Chaos Mesh started out as a mere fault injection tool and is now heading towards the goal of building a chaos engineering ecology. Meanwhile, the Chaos Mesh community was also built from scratch and has helped <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">Chaos Mesh</a> join CNCF as a Sandbox project.</p>
<!-- -->
<p>In this article, we will share with you how Chaos Mesh has grown and changed in the past year, and also discuss its future goals and plans.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="the-project-thrive-with-a-clear-goal-in-mind">The project: thrive with a clear goal in mind<a href="https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/#the-project-thrive-with-a-clear-goal-in-mind" class="hash-link" aria-label="Direct link to The project: thrive with a clear goal in mind" title="Direct link to The project: thrive with a clear goal in mind" translate="no">​</a></h2>
<p>In this past year, Chaos Mesh has grown at an impressive speed with the joint efforts of the community. From the very first version to the recently released <a href="https://github.com/chaos-mesh/chaos-mesh/releases/tag/v1.1.0" target="_blank" rel="noopener noreferrer" class="">v1.1.0</a>, Chaos Mesh has been greatly improved in terms of functionality, ease of use, and security.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="functionality">Functionality<a href="https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/#functionality" class="hash-link" aria-label="Direct link to Functionality" title="Direct link to Functionality" translate="no">​</a></h3>
<p>When first open-sourced, Chaos Mesh supported only three fault types: PodChaos, NetworkChaos, and IOChaos. Within only a year, Chaos Mesh can perform all around fault injections into the network, system clock, JVM applications, filesystems, operating systems, and so on.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Tests" src="https://chaos-mesh.org/assets/images/chaos-tests-53935636ee4f2a84eed8ae3e1c170ac0.png" width="904" height="256" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Tests</figcaption></figure><p></p>
<p>After continuous optimization, Chaos Mesh now provides a flexible scheduling mechanism, which enables users to better design their own chaos experiments. This laid the foundation for chaos orchestration.</p>
<p>In the meantime, we are happy to see that a number of users have started to <a href="https://github.com/chaos-mesh/chaos-mesh/issues/1182" target="_blank" rel="noopener noreferrer" class="">test Chaos Mesh on major cloud platforms</a>, such as Amazon Web Services (AWS), Google Kubernetes Engine (GKE), Alibaba Cloud, and Tencent Cloud. We have continuously conducted compatibility testing and adaptations, in order to support <a href="https://github.com/chaos-mesh/chaos-mesh/pull/1330" target="_blank" rel="noopener noreferrer" class="">fault injection for specific cloud platforms</a>.</p>
<p>To better support Kubernetes native components and node-level failures, we developed <a href="https://github.com/chaos-mesh/chaosd" target="_blank" rel="noopener noreferrer" class="">Chaosd</a>, which provides physical node-level fault injection. We're extensively testing and refining this feature for release within the next few months.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="ease-of-use">Ease of use<a href="https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/#ease-of-use" class="hash-link" aria-label="Direct link to Ease of use" title="Direct link to Ease of use" translate="no">​</a></h3>
<p>Ease of use has been one of the guiding principles of Chaos Mesh development since day one. You can deploy Chaos Mesh with a single command line. The V1.0 release brought the long-awaited Chaos Dashboard, a one-stop web interface for users to orchestrate chaos experiments. You can define the scope of the chaos experiment, specify the type of chaos injection, define scheduling rules, and observe the results of the chaos experiment—all in the same web interface with only a few clicks.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Dashboard" src="https://chaos-mesh.org/assets/images/chaos-dashboard1-f75f13ed59046d4d19717a1dc6900057.png" width="952" height="532" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Dashboard</figcaption></figure><p></p>
<p>Prior to V1.0, many users reported being blocked by various configuration problems when injecting IOChaos faults. After intense investigations and discussions, we gave up the original SideCar implementation. Instead, we used chaos-daemon to dynamically invade the target Pod, which significantly simplifies the logic. This optimization has made dynamic I/O fault injection possible with Chaos Mesh, and users can focus solely on their experiments without having to worry about additional configurations.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="security">Security<a href="https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h3>
<p>We have improved the security of Chaos Mesh. It now provides a comprehensive set of selectors to control the scope of the experiments, and supports setting specific namespaces to protect important applications. What’s more, the support of namespace permissions allows users to limit the “explosion radius” of a chaos experiment to a specific namespace.</p>
<p>In addition, Chaos Mesh directly reuses Kubernetes’ native permission mechanism and supports verification on the Chaos Dashboard. This protects you from other users’ errors, which can cause chaos experiments to fail or become uncontrollable.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="cloud-native-ecosystem-integrations-and-cooperations">Cloud native ecosystem: integrations and cooperations<a href="https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/#cloud-native-ecosystem-integrations-and-cooperations" class="hash-link" aria-label="Direct link to Cloud native ecosystem: integrations and cooperations" title="Direct link to Cloud native ecosystem: integrations and cooperations" translate="no">​</a></h2>
<p>In July 2020, Chaos Mesh was successfully <a href="https://chaos-mesh.org/blog/chaos-mesh-join-cncf-sandbox-project" target="_blank" rel="noopener noreferrer" class="">accepted as a CNCF Sandbox project</a>. This shows that Chaos Mesh has received initial recognition from the cloud native community. At the same time, it means that Chaos Mesh has a clear mission: to promote the application of chaos engineering in the cloud native field and to cooperate with other cloud native projects so we can grow together.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="grafana">Grafana<a href="https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/#grafana" class="hash-link" aria-label="Direct link to Grafana" title="Direct link to Grafana" translate="no">​</a></h3>
<p>To further improve the observability of chaos experiments, we have included a separate <a href="https://github.com/chaos-mesh/chaos-mesh-datasource" target="_blank" rel="noopener noreferrer" class="">Grafana plug-in</a> for Chaos Mesh, which allows users to directly display real-time chaos experiment information on the application monitoring panel. This way, users can simultaneously observe the running status of the application and the current chaos experiment information.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="github-action">GitHub Action<a href="https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/#github-action" class="hash-link" aria-label="Direct link to GitHub Action" title="Direct link to GitHub Action" translate="no">​</a></h3>
<p>To enable users to run chaos experiments even during the development phase, we developed the <a href="https://github.com/chaos-mesh/chaos-mesh-action" target="_blank" rel="noopener noreferrer" class="">chaos-mesh-action</a> project, allowing Chaos Mesh to run in the workflow of GitHub Actions. This way, Chaos Mesh can easily be integrated into daily system development and testing.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="tipocket">TiPocket<a href="https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/#tipocket" class="hash-link" aria-label="Direct link to TiPocket" title="Direct link to TiPocket" translate="no">​</a></h3>
<p><a href="https://github.com/pingcap/tipocket" target="_blank" rel="noopener noreferrer" class="">TiPocket</a> is an automated test platform that integrates Chaos Mesh and Argo, a workflow engine designed for Kubernetes. TiPocket is designed to be a fully automated chaos engineering testing loop for TiDB, a distributed database. There are a number of steps when we conduct chaos experiments, including deploying applications, running workloads, injecting exceptions, and business checks. To fully automate these steps, Argo was integrated into TiPocket. Chaos Mesh provides rich fault injection, while Argo provides flexible orchestration and scheduling.</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="TiPocket" src="https://chaos-mesh.org/assets/images/tipocket-b6c945ab26ef1437be6a383d95019f50.png" width="904" height="420" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">TiPocket</figcaption></figure><p></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="the-community-built-from-the-ground-up">The community: built from the ground up<a href="https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/#the-community-built-from-the-ground-up" class="hash-link" aria-label="Direct link to The community: built from the ground up" title="Direct link to The community: built from the ground up" translate="no">​</a></h2>
<p>Chaos Mesh is a community-driven project, and cannot progress without an active, friendly, and open community. Since it was open-sourced, Chaos Mesh has quickly become one of the most eye-catching open-source projects in the chaos engineering world. Within a year, it has accumulated more than 3k stars on GitHub and 70+ contributors. Adopters include Tencent Cloud, XPeng Motors, Dailymotion, NetEase Fuxi Lab, JuiceFS, APISIX, and Meituan. Looking back on the past year, the Chaos Mesh community was built from scratch, and has laid the foundation for a transparent, open, friendly, and autonomous open source community.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="becoming-part-of-the-cncf-family">Becoming part of the CNCF family<a href="https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/#becoming-part-of-the-cncf-family" class="hash-link" aria-label="Direct link to Becoming part of the CNCF family" title="Direct link to Becoming part of the CNCF family" translate="no">​</a></h3>
<p>Cloud native has been in the DNA of Chaos Mesh since the very beginning. Joining CNCF was a natural choice, which marks a critical step for Chaos Mesh to becoming a vendor-neutral, open and transparent open-source community. Aside from integration within the cloud native ecosystem, joining CNCF gives Chaos Mesh:</p>
<ul>
<li class="">
<p>More community and project exposure. Collaborations with other projects and various cloud native community activities such as Kubernetes Meetup and KubeCon have presented us great opportunities to communicate with the community. We are amazed how the high-quality content produced by the community has also played a positive and far-reaching role in promoting Chaos Mesh.</p>
</li>
<li class="">
<p>A more complete and open community framework. CNCF provides a rather mature framework for open-source community operations. Under CNCF’s guidance, we established our basic community framework, including a Code of Conduct, Contributing Guide, and Roadmap. We’ve also created our own channel, #project-chaos-mesh, under CNCF’s Slack.</p>
</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="a-friendly-and-supportive-community">A friendly and supportive community<a href="https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/#a-friendly-and-supportive-community" class="hash-link" aria-label="Direct link to A friendly and supportive community" title="Direct link to A friendly and supportive community" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-note admonition_zECE alert alert--secondary"><div class="admonitionHeading_p7pM"><span class="admonitionIcon_RWck"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_DNgP"><p>2022-10-24: Because of <a href="https://www.oreilly.com/online-learning/leveraging-katacoda-technology.html" target="_blank" rel="noopener noreferrer" class="">https://www.oreilly.com/online-learning/leveraging-katacoda-technology.html</a>, and refer to <a href="https://github.com/chaos-mesh/website/pull/356" target="_blank" rel="noopener noreferrer" class="">#356</a>, the interactive tutorial is temporarily unavailable.</p></div></div>
<p>The quality of the open source community determines whether our adopters and contributors are willing to stick around and get involved in the community for the long run. In this regard, we’ve been working hard on:</p>
<ul>
<li class="">
<p>Continuously enriching documentation and optimizing its structure. So far, we have developed a complete set of documentation for different groups of audiences, including <a href="https://chaos-mesh-website-archived.netlify.app/docs/1.2.4/user_guides/installation" target="_blank" rel="noopener noreferrer" class="">a user guide</a> and <a href="https://chaos-mesh-website-archived.netlify.app/docs/1.2.4/development_guides/development_overview" target="_blank" rel="noopener noreferrer" class="">developer guide</a>, <a href="https://chaos-mesh-website-archived.netlify.app/docs/1.2.4/get_started/get_started_on_kind" target="_blank" rel="noopener noreferrer" class="">quick start guides</a>, <a href="https://chaos-mesh-website-archived.netlify.app/docs/1.2.4/use_cases/multi_data_centers" target="_blank" rel="noopener noreferrer" class="">use cases</a>, and <a href="https://github.com/chaos-mesh/chaos-mesh/blob/master/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" class="">a contributing guide</a>. All are constantly updated per each release.</p>
</li>
<li class="">
<p>Working with the community to publish blog posts, tutorials, use cases, and chaos engineering practices. So far, we’ve produced 26 Chaos Mesh related articles. Among them is <code>an interactive tutorial</code>, published on O’Reilly’s Katakoda site. These materials make a great complement to the documentation.</p>
</li>
<li class="">
<p>Repurposing and amplifying videos and tutorials generated in community meetings, webinars, and meetups. Valuing and responding to community feedback and queries.</p>
</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="looking-ahead">Looking ahead<a href="https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/#looking-ahead" class="hash-link" aria-label="Direct link to Looking ahead" title="Direct link to Looking ahead" translate="no">​</a></h2>
<p>Google’s recent global outage reminded us of the importance of system reliability, and it highlighted the importance of chaos engineering. Liz Rice, CNCF TOC Chair, shared <a href="https://twitter.com/CloudNativeFdn/status/1329863326428499971" target="_blank" rel="noopener noreferrer" class="">The 5 technologies to watch in 2021</a>, and chaos engineering is on top of the list. We boldly predict that chaos engineering is about to enter a new stage in the near future. Chaos Mesh 2.0 is now in active development, and it includes community requirements such as an embedded workflow engine to support the definition and management of more flexible chaos scenarios, application state checking mechanisms, and more detailed experiments reports. Follow along through the project <a href="https://github.com/chaos-mesh/chaos-mesh/blob/master/ROADMAP.md" target="_blank" rel="noopener noreferrer" class="">roadmap</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="last-but-not-least">Last but not least<a href="https://chaos-mesh.org/blog/celebrating-one-year-of-chaos-mesh-looking-back-and-ahead/#last-but-not-least" class="hash-link" aria-label="Direct link to Last but not least" title="Direct link to Last but not least" translate="no">​</a></h2>
<p>Chaos Mesh has grown so much in the past year, yet it is still young, and we have just set sail towards our goal. In the meantime, we call for all of you to participate and help build the Chaos Engineering system ecology together!</p>
<p>If you are interested in Chaos Mesh and would like to help us improve it, you're welcome to join <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">our Slack channel</a> or submit your pull requests or issues to our <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
        </item>
        <item>
            <title><![CDATA[How to Simulate I/O Faults at Runtime]]></title>
            <link>https://chaos-mesh.org/blog/how-to-simulate-io-faults-at-runtime/</link>
            <guid>https://chaos-mesh.org/blog/how-to-simulate-io-faults-at-runtime/</guid>
            <pubDate>Fri, 08 Jan 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Chaos Engineering - How to simulate I/O faults at runtime]]></description>
            <content:encoded><![CDATA[<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Chaos Engineering - How to simulate I/O faults at runtime" src="https://chaos-mesh.org/assets/images/how-to-simulate-io-faults-at-runtime-39daaf89aa83a5be58402f763db0d5c5.jpg" width="3126" height="1043" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Chaos Engineering - How to simulate I/O faults at runtime</figcaption></figure><p></p>
<p>In a production environment, filesystem faults might occur due to various incidents such as disk failures and administrator errors. As a Chaos Engineering platform, Chaos Mesh has supported simulating I/O faults in a filesystem ever since its early versions. By simply adding an IOChaos CustomResourceDefinition (CRD), we can watch how the filesystem fails and returns errors.</p>
<!-- -->
<p>However, before Chaos Mesh 1.0, this experiment was not easy and may have consumed a lot of resources. We needed to inject sidecar containers to the Pod through the mutating admission webhooks and rewrite the <code>ENTRYPOINT</code> command. Even if no fault was injected, the injected sidecar container caused a substantial amount of overhead.</p>
<p>Chaos Mesh 1.0 has changed all this. Now, we can use IOChaos to inject faults to a filesystem at runtime. This simplifies the process and greatly reduces system overhead. This blog post introduces how we implement the IOChaos experiment without using a sidecar.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="io-fault-injection">I/O fault injection<a href="https://chaos-mesh.org/blog/how-to-simulate-io-faults-at-runtime/#io-fault-injection" class="hash-link" aria-label="Direct link to I/O fault injection" title="Direct link to I/O fault injection" translate="no">​</a></h2>
<p>To simulate I/O faults at runtime, we need to inject faults into a filesystem after the program starts <a href="https://man7.org/linux/man-pages/man2/syscall.2.html" target="_blank" rel="noopener noreferrer" class="">system calls</a> (such as reads and writes) but before the call requests arrive at the target filesystem. We can do that in one of two ways:</p>
<ul>
<li class="">Use Berkeley Packet Filter (BPF); however, it <a href="https://github.com/iovisor/bcc/issues/2336" target="_blank" rel="noopener noreferrer" class="">cannot be used to inject delay</a>.</li>
<li class="">Add a filesystem layer called ChaosFS before the target filesystem. ChaosFS uses the target filesystem as the backend and receives requests from the operating system. The entire call link is <strong>target program syscall</strong> -&gt; <strong>Linux kernel</strong> -&gt; <strong>ChaosFS</strong> -&gt; <strong>target filesystem</strong>. Because ChaosFS is customizable, we can inject delays and errors as we want. Therefore, ChaosFS is our choice.</li>
</ul>
<p>But ChaosFS has several problems:</p>
<ul>
<li class="">If ChaosFS reads and writes files in the target filesystem, we need to <a href="https://man7.org/linux/man-pages/man2/mount.2.html" target="_blank" rel="noopener noreferrer" class="">mount</a> ChaosFS to a different path than the target path specified in the Pod configuration. ChaosFS <strong>cannot</strong> be mounted to the path of the target directory.</li>
<li class="">We need to mount ChaosFS <strong>before</strong> the target program starts running. This is because the newly-mounted ChaosFS takes effect only on files that are newly opened by the program in the target filesystem.</li>
<li class="">We need to mount ChaosFS to the target containter's <code>mnt</code> namespace. For details, see <a href="https://man7.org/linux/man-pages/man7/mount_namespaces.7.html" target="_blank" rel="noopener noreferrer" class="">mount_namespaces(7) — Linux manual page</a>.</li>
</ul>
<p>Before Chaos Mesh 1.0, we used the <a href="https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/" target="_blank" rel="noopener noreferrer" class="">mutating admission webhook</a> to implement IOChaos. This technique addressed the three problems lists above and allowed us to:</p>
<ul>
<li class="">Run scripts in the target container. This action changed the target directory of the ChaosFS's backend filesystem (for example, from <code>/mnt/a</code> to <code>/mnt/a_bak</code>) so that we could mount ChaosFS to the target path (<code>/mnt/a</code>). Modify the command that starts the Pod. For example, we could modify the original command <code>/app</code> to <code>/waitfs.sh /app</code>.</li>
<li class="">The <code>waitfs.sh</code> script kept checking whether the filesystem was successfully mounted. If it was mounted, <code>/app</code> was started.</li>
<li class="">Add a new container in the Pod to run ChaosFS. This container needed to share a volume with the target container (for example, <code>/mnt</code>), and then we mounted this volume to the target directory (for example, <code>/mnt/a</code>). We also properly enabled <a href="https://kubernetes.io/docs/concepts/storage/volumes/#mount-propagation" target="_blank" rel="noopener noreferrer" class="">mount propagation</a> for this volume's mount to penetrate the share to host and then penetrate slave to the target.</li>
</ul>
<p>These three approaches allowed us to inject I/O faults while the program was running. However, the injection was far from convenient:</p>
<ul>
<li class="">We could only inject faults into a volume subdirectory, not into the entire volume. The workaround was to replace <code>mv</code> (rename) with <code>mount move</code> to move the mount point of the target volume.</li>
<li class="">We had to explicitly write commands in the Pod rather than implicitly use the image commands. Otherwise, the <code>/waitfs.sh</code> script could not properly start the program after the filesystem was mounted.</li>
<li class="">The corresponding container needed to have a proper configuration for mount propagation. Due to potential privacy and security issues, we <strong>could not</strong> modify the configuration via the mutating admission webhook.</li>
<li class="">The injection configuration was troublesome. Worse still, we had to create a new Pod after the configuration was able to inject faults.</li>
<li class="">We could not withdraw ChaosFS while the program was running. Even if no fault or error was injected, the performance was greatly affected.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="inject-io-faults-without-the-mutating-admission-webhook">Inject I/O faults without the mutating admission webhook<a href="https://chaos-mesh.org/blog/how-to-simulate-io-faults-at-runtime/#inject-io-faults-without-the-mutating-admission-webhook" class="hash-link" aria-label="Direct link to Inject I/O faults without the mutating admission webhook" title="Direct link to Inject I/O faults without the mutating admission webhook" translate="no">​</a></h2>
<p>What about cracking these tough nuts without the mutating admission webhook? Let's get back and think a bit about the reason why we used the mutating admission webhook to add a container in which ChaosFS runs. We do that to mount the filesystem to the target container.</p>
<p>In fact, there is another solution. Instead of adding containers to the Pod, we can first use the <code>setns</code> Linux system call to modify the namespace of the current process and then use the <code>mount</code> call to mount ChaosFS to the target container. Suppose that the filesystem to inject is <code>/mnt</code>. The new injection process is as follows:</p>
<ol>
<li class="">Use <code>setns</code> for the current process to enter the mnt namespace of the target container.</li>
<li class="">Execute <code>mount --move</code> to move <code>/mnt</code> to <code>/mnt_bak</code>.</li>
<li class="">Mount ChaosFS to <code>/mnt</code> and use <code>/mnt_bak</code> as the backend.</li>
</ol>
<p>After the process is finished, the target container will open, read, and write the files in <code>/mnt</code> through ChaosFS. In this way, delays or faults are injected much more easily. However, there are still two questions to answer:</p>
<ul>
<li class="">How do you handle the files that are already opened by the target process?</li>
<li class="">How do you recover the process given that we cannot unmount the filesystem when files are opened?</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="dynamically-replace-file-descriptors">Dynamically replace file descriptors<a href="https://chaos-mesh.org/blog/how-to-simulate-io-faults-at-runtime/#dynamically-replace-file-descriptors" class="hash-link" aria-label="Direct link to Dynamically replace file descriptors" title="Direct link to Dynamically replace file descriptors" translate="no">​</a></h3>
<p><strong>ptrace solves both of the two questions above.</strong> We can use ptrace to replace the opened file descriptors (FD) at runtime and replace the current working directory (CWD) and mmap.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="use-ptrace-to-allow-a-tracee-to-run-a-binary-program">Use ptrace to allow a tracee to run a binary program<a href="https://chaos-mesh.org/blog/how-to-simulate-io-faults-at-runtime/#use-ptrace-to-allow-a-tracee-to-run-a-binary-program" class="hash-link" aria-label="Direct link to Use ptrace to allow a tracee to run a binary program" title="Direct link to Use ptrace to allow a tracee to run a binary program" translate="no">​</a></h4>
<p><a href="https://man7.org/linux/man-pages/man2/ptrace.2.html" target="_blank" rel="noopener noreferrer" class="">ptrace</a> is a powerful tool that makes the target process (tracee) to run any system call or binary program. For a tracee to run the program, ptrace modifies the RIP-pointed address to the target process and adds an <code>int3</code> instruction to trigger a breakpoint. When the binary program stops, we need to restore the registers and memory.</p>
<blockquote>
<p><strong>Note:</strong></p>
<p>In the <a href="https://en.wikipedia.org/wiki/X86_assembly_language" target="_blank" rel="noopener noreferrer" class="">x86_64 architecture</a>, the RIP register (also called an instruction pointer) always points to the memory address at which the next directive is run. To load the program into the target process memory spaces:</p>
</blockquote>
<ol>
<li class="">Use ptrace to call mmap in the target program to allocate the needed memory.</li>
<li class="">Write the binary program to the newly allocated memory and make the RIP register point to it.</li>
<li class="">After the binary program stops, call munmap to clean up the memory section.</li>
</ol>
<p>As a best practice, we often replace ptrace <code>POKE_TEXT</code> writes with <code>process_vm_writev</code> because if there is a huge amount of data to write, <code>process_vm_writev</code> performs more efficiently.</p>
<p>Using ptrace, we are able to make a process to replace its own FD. Now we only need a method to make that replacement happen. This method is the <code>dup2</code> system call.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="use-dup2-to-replace-file-descriptor">Use <code>dup2</code> to replace file descriptor<a href="https://chaos-mesh.org/blog/how-to-simulate-io-faults-at-runtime/#use-dup2-to-replace-file-descriptor" class="hash-link" aria-label="Direct link to use-dup2-to-replace-file-descriptor" title="Direct link to use-dup2-to-replace-file-descriptor" translate="no">​</a></h4>
<p>The signature of the <code>dup2</code> function is <code>int dup2(int oldfd, int newfd);</code>. It is used to create a copy of the old FD (<code>oldfd</code>). This copy has an FD number of <code>newfd</code>. If <code>newfd</code> already corresponds to the FD of an opened file, the FD on the file that's already opened is automatically closed.</p>
<p>For example, the current process opens <code>/var/run/__chaosfs__test__/a</code> whose FD is <code>1</code>. To replace this opened file with <code>/var/run/test/a</code>, this process performs the following operations:</p>
<ol>
<li class="">Uses the <code>fcntl</code> system call to get the <code>OFlags</code> (the parameter used by the <code>open</code> system call, such as <code>O_WRONLY</code>) of <code>/var/run/__chaosfs__test__/a</code>.</li>
<li class="">Uses the <code>Iseek</code> system call to get the current location of <code>seek</code>.</li>
<li class="">Uses the <code>open</code> system call to open <code>/var/run/test/a</code> using the same <code>OFlags</code>. Assume that the FD is <code>2</code>.</li>
<li class="">Uses <code>Iseek</code> to change the <code>seek</code> location of the newly opened FD <code>2</code>.</li>
<li class="">Uses <code>dup2(2, 1)</code> to replace the FD <code>1</code> of <code>/var/run/__chaosfs__test__/a</code> with the newly opened FD <code>2</code>.</li>
<li class="">Closes FD <code>2</code>.</li>
</ol>
<p>After the process is finished, FD <code>1</code> of the current process points to <code>/var/run/test/a</code>. So that we can inject faults, any subsequent operations on the target file go through the <a href="https://en.wikipedia.org/wiki/Filesystem_in_Userspace" target="_blank" rel="noopener noreferrer" class="">Filesystem in Userspace</a> (FUSE). FUSE is a software interface for Unix and Unix-like computer operating systems that lets non-privileged users create their own file systems without editing kernel code.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="write-a-program-to-make-the-target-process-replace-its-own-file-descriptor">Write a program to make the target process replace its own file descriptor<a href="https://chaos-mesh.org/blog/how-to-simulate-io-faults-at-runtime/#write-a-program-to-make-the-target-process-replace-its-own-file-descriptor" class="hash-link" aria-label="Direct link to Write a program to make the target process replace its own file descriptor" title="Direct link to Write a program to make the target process replace its own file descriptor" translate="no">​</a></h4>
<p>The combined functionality of ptrace and dup2 makes it possible for the tracer to make the tracee replace the opened FD by itself. Now, we need to write a binary program and make the target process run it:</p>
<blockquote>
<p><strong>Note:</strong></p>
<p>In the implementation above, we assume that:</p>
<ul>
<li class="">The threads of the target process are POSIX threads and share the opened files.</li>
<li class="">When the target process creates threads using the <code>clone</code> function, the <code>CLONE_FILES</code> parameter is passed.</li>
</ul>
<p>Therefore, Chaos Mesh only replaces the FD of the first thread in the thread group.</p>
</blockquote>
<ol>
<li class="">Write a piece of assembly code according to the two sections above and the usage of syscall directives. <a href="https://github.com/chaos-mesh/toda/blob/1d73871d8ab72b8d1eace55f5222b01957193531/src/replacer/fd_replacer.rs#L133" target="_blank" rel="noopener noreferrer" class="">Here</a> is an example of the assembly code.</li>
<li class="">Use an assembler to translate the code into a binary program. We use <a href="https://github.com/CensoredUsername/dynasm-rs" target="_blank" rel="noopener noreferrer" class="">dynasm-rs</a> as the assembler.</li>
<li class="">Use ptrace to make the target process run this program. When the program runs, the FD is replaced at runtime.</li>
</ol>
<h3 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="overall-fault-injection-process">Overall fault injection process<a href="https://chaos-mesh.org/blog/how-to-simulate-io-faults-at-runtime/#overall-fault-injection-process" class="hash-link" aria-label="Direct link to Overall fault injection process" title="Direct link to Overall fault injection process" translate="no">​</a></h3>
<p>The following diagram illustrates the overall I/O fault injection process:</p>
<p></p><figure style="margin:0"><img decoding="async" loading="lazy" alt="Fault injection process" src="https://chaos-mesh.org/assets/images/fault-injection-process-581a3b4c6954f9ccb3fc9eb17f45f937.jpg" width="1600" height="778" class="img_hi9z"><figcaption class="text--italic text--center" style="color:var(--ifm-color-content-secondary);font-size:0.875rem">Fault injection process</figcaption></figure><p></p>
<div style="margin:1rem 0;font-style:italic;text-align:center"> Fault injection process </div>
<p>In this diagram, each horizontal line corresponds to a thread that runs in the direction of the arrows. The <strong>Mount/Umount Filesystem</strong> and <strong>Replace FD</strong> tasks are carefully arranged in sequence. Given the process above, this arrangement makes a lot of sense.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_fkcC" id="whats-next">What's next<a href="https://chaos-mesh.org/blog/how-to-simulate-io-faults-at-runtime/#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next" translate="no">​</a></h2>
<p>I've discussed how we implement fault injection to simulate I/O faults at runtime (see <a href="https://github.com/chaos-mesh/toda" target="_blank" rel="noopener noreferrer" class="">chaos-mesh/toda</a>). However, the current implementation is far from perfect:</p>
<ul>
<li class="">Generation numbers are not supported.</li>
<li class="">ioctl is not supported.</li>
<li class="">Chaos Mesh does not immediately determine whether a filesystem is successfully mounted. It does so only after one second.</li>
</ul>
<p>If you are interested in Chaos Mesh and would like to help us improve it, you're welcome to join <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">our Slack channel</a> or submit your pull requests or issues to our <a href="https://github.com/chaos-mesh/chaos-mesh" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>
<p>This is the first post in a series on Chaos Mesh implementation. If you want to see how other types of fault injection are implemented, stay tuned.</p>]]></content:encoded>
            <category>Chaos Mesh</category>
            <category>Chaos Engineering</category>
            <category>Fault Injection</category>
        </item>
    </channel>
</rss>