Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CNTUG Meetup #20 - End to End Testing for Kuber...

Avatar for Pohsien Shih Pohsien Shih
September 28, 2019

CNTUG Meetup #20 - End to End Testing for Kubernetes Cluster

現今 Kubernetes Cluster 部署方式越來越多種,部署門檻也越來越低,但是要如何確認自己佈出來的Cluster真的是可用、運作正常的呢?

此議程會帶大家探討 Kubernetes 的 E2E testing,介紹如何使用 Kubernetes
community 官方釋出的工具 kubetest 來對 Kubernetes Cluster 做測試,驗證各種功能是否正常,此外也會解釋 kubetest 的運作流程以及如何客製化自己的測試。

Outline:
* Kubernetes Testing
* kubetest
* E2E Testing
* Conformance Testing
* Node E2E Testing

# Cloud Native Taiwan User Group Meetup #20

Avatar for Pohsien Shih

Pohsien Shih

September 28, 2019
Tweet

More Decks by Pohsien Shih

Other Decks in Technology

Transcript

  1. Who am I 施柏賢 Pohsien Shih • Service Engineer •

    CNTUG社群打雜工 Blog: https://pohsienshih.github.io/ Github: https://github.com/pohsienshih Email: [email protected] 2
  2. Outline • Software Testing • Kubernetes Testing • Cluster E2E

    Testing • Conformance Testing • Node E2E Testing • Conclusion • References 3
  3. 1. Make sure your cluster is available. 2. Deploy a

    production ready Kubernetes cluster. 5 The Reasons you should test your cluster.
  4. Types of Testing • Unit Testing - Test an individual

    software component or module. • Integration Testing - Test all integrated modules to verify the combined functionality after integration. • End to End (E2E) Testing - Test end-to-end behavior of the system. Software Testing 7
  5. Special Interest Group A Special Interest Group (SIG) is a

    community within a larger organization with a shared interest in advancing a specific area of knowledge, learning or technology where members cooperate to affect or to produce solutions within their particular field, and may communicate, meet, and organize conferences. Ref: wikipedia - Special Interest Group 9 Kubernetes Testing
  6. Special Interest Group (cont.) Kubernetes SIGs • Kubernetes Community Governance

    Model • Kubernetes SIGs and Working Groups Subprojects Every part of the Kubernetes code and documentation must be owned by some subproject. These subprojects will be delivered to different SIGs. • Subprojects of each SIGs 10 Kubernetes Testing
  7. Special Interest Group (cont.) SIG-TESTING The SIG which is responsible

    for Kubernetes testing. Ref: https://github.com/kubernetes/community/tree/master/sig-testing#testing-special-interest-group 11 Kubernetes Testing
  8. SIG-Testing Subprojects: • prow • test-infra • testing-commons • boskos

    12 • gopherage • gubernator • repo-infra • kind Kubernetes Testing
  9. SIG-Testing (cont.) 13 test-infra Providing tools and configuration files for

    the testing and automation needs of the Kubernetes project. Ref: https://github.com/kubernetes/test-infra Kubernetes Testing
  10. 3Cluster E2E Testing • Introduction • Kubetest • Ginkgo &

    Gomega • Test Lists • Writing Test 14
  11. E2E Testing Cluster E2E testing ensures consistent and reliable behavior

    of Kubernetes API and catches hard-to-test bugs before user do. test-infra provides an official tool - Kubetest, which is the interface for launching and running e2e testing. Ref: • E2E testing • Kubetest 15 Cluster E2E Testing
  12. Kubetest Usage 17 Cluster E2E Testing $ kubetest --build --provider

    <yourprovider> --deployment <yourdeployer> --up --test --test_args="--ginkgo.skip(focus)=xxx" --dump <folder> --down Flag: --build Build binaries (e2e.test, e2e_node.test) for testing. --provider Specify an alternative provider (gce, local, gke, aks, etc.) for E2E testing, default value is gce. --deployment Deployment strategies of Kubernetes cluster. (gce, local, gke, aks, etc.) --up Turn up a new cluster. --test Run E2E testing. --test_args Test matching for ginkgo. --down Shutdown and delete the cluster --dump Export the result. ( junit xml format )
  13. Kubetest Usage (cont.) 18 Cluster E2E Testing Execute E2E testing

    on local cluster. # Build binaries for testing $ kubetest --build # Turn up new local cluster $ kubetest --deployment local --up # Run all tests $ kubetest --provider local --deployment local --test # Delete the cluster $ kubetest --deployment local --down # Exexute with one line $ kubetest --build --provider local --deployment local --up --test --down
  14. Kubetest Usage (cont.) 19 Cluster E2E Testing Notice: 1. Kubetest

    must run from Kubernetes directory. 2. Kubetest will build the Kubernetes binary, and use binary to create a new cluster for testing.
  15. Kubetest (cont.) 1. What is the workflow of kubetest? 2.

    Where are the test lists? 3. How to write my own test? 4. How to execute test on my cluster? 21 Cluster E2E Testing
  16. Kubetest Workflow What is difference (or relationship)? • kubetest •

    kubernetest/test • kubernetes/hack/e2e* 22 Cluster E2E Testing
  17. Kubetest Workflow 25 kubernetes/hack /e2e.go test-infra/kubetest kubernetes/test/e2e /e2e_test.go Start E2E

    testing. kubernetes/hack /ginkgo-e2e.sh kubernetes/test/e2e/f ramework/framework .go
  18. Kubetest Workflow 26 kubernetes/hack /e2e.go test-infra/kubetest kubernetes/test/e2e /e2e_test.go Start E2E

    testing. kubernetes/hack /ginkgo-e2e.sh kubernetes/test/e2e/f ramework/framework .go
  19. hack/e2e.go 28 Cluster E2E Testing hack/e2e.go program is a wrapper

    around updating kubetest before calling it.
  20. Kubetest Workflow 30 kubernetes/hack /e2e.go test-infra/kubetest kubernetes/test/e2e /e2e_test.go Start E2E

    testing. kubernetes/hack /ginkgo-e2e.sh kubernetes/test/e2e/f ramework/framework .go
  21. Ginkgo & Gomega The e2e tests in kubernetes are built

    atop of Ginkgo and Gomega. Ginkgo is a is Behavior-Driven Development (BDD) style Go testing framework, and the Gomega is a matcher library paired with Ginkgo. Ref: • Ginkgo • Gomega 32 Cluster E2E Testing
  22. Ginko & Gomega Example Ginkgo: A BDD-style Go testing framework.

    Gomega: A best matcher library paired with Ginkgo. Installation: 34 $ go get github.com/onsi/ginkgo/ginkgo $ go get github.com/onsi/gomega/... # Install Ginkgo CLI $ go install github.com/onsi/ginkgo/ginkgo Cluster E2E Testing
  23. Ginko & Gomega Example (cont.) Main Program myproject.go 35 package

    myproject func Greeting(name string) string{ return "Hello " + name + "." } func Calc(number int) int{ return number * 10 } Cluster E2E Testing
  24. Ginko & Gomega Example (cont.) 36 $ cd myproject $

    ls myproject.go $ ginkgo bootstrap $ ls myproject.go myproject_suite_test.go Bootstrap a Ginkgo test suite Test suite will search and exeute all testing specs. Cluster E2E Testing
  25. Ginko & Gomega Example (cont.) 37 myproject_suite_test.go package myproject_test import

    ( "testing" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) func TestMyproject(t *testing.T) { RegisterFailHandler(Fail) RunSpecs(t, "Myproject Suite") } Cluster E2E Testing
  26. Ginko & Gomega Example (cont.) 38 $ ginkgo generate mytest

    $ ls myproject.go myproject_suite_test.go mytest_test.go Create spec mytest_test.go Cluster E2E Testing package myproject_test import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" . "github.com/myproject" ) var _ = Describe("Mytest", func() { })
  27. Ginko & Gomega Example (cont.) 39 mytest_test.go (Example 1 )

    Cluster E2E Testing … var _ = Describe("Mytest", func() { var name string= "test" var number int= 99 Describe("Test Greeting function", func() { Context("Giva a name", func() { It("Should greeting", func() { Expect(Greeting(name)).To(Equal("Hello "+name+".")) }) }) }) Describe("Test Calc function", func() { Context("Give a number", func() { It("Should get the correct result", func() { Expect(Calc(number)).To(Equal(number*10)) }) }) }) }) Spec
  28. Ginko & Gomega Example (cont.) 40 mytest_test.go (Example 2) Use

    BeforeEach to ensure that the initial value of the variable is the same for all tests. Cluster E2E Testing … var _ = Describe("Mytest", func() { var number int BeforeEach(func(){ number = 99 }) Describe("Test Calc function again", func() { Context("Give a number 99", func() { It("Should return 990", func() { Expect(Calc(number)).To(Equal(990)) number = Calc(number2) }) It("Should return 990, too", func() { Expect(Calc(number)).To(Equal(990)) }) }) }) })
  29. Ginko & Gomega Example (cont.) 41 Launch testing Cluster E2E

    Testing $ ginkgo # Show all specs $ ginkgo -v Running Suite: Myproject Suite ============================== Random Seed: 1568041760 Will run 4 of 4 specs ••• Ran 4 of 4 Specs in 0.001 seconds SUCCESS! -- 4 Passed | 0 Failed | 0 Pending | 0 Skipped PASS Ginkgo ran 1 suite in 3.471827325s Test Suite Passed
  30. Kubetest Workflow 42 kubernetes/hack /e2e.go test-infra/kubetest kubernetes/test/e2e /e2e_test.go Start E2E

    testing. kubernetes/hack /ginkgo-e2e.sh kubernetes/test/e2e/f ramework/framework .go
  31. Ok, now I know the kubetest workflow. But what/where is

    the test lists? 43 Cluster E2E Testing
  32. Kinds of tests 48 Cluster E2E Testing • [Slow] •

    [Serial] • [Disruptive] • [Internet] • [Feature:.+] • [Conformance] • [LinuxOnly] • [Privileged] • [Alpha] • ... The label will be located at SIGDescribe or ginkgo.It
  33. Kinds of tests (cont.) 49 Cluster E2E Testing Execute specific

    kind of test. * skip/focus can match Describe or ginkgo.It. # Only execute tests with LinuxOnly label. $ kubetest --test --test_args="--ginkgo. focus=\[LinuxOnly\]" --provider local --deployment local # Skip the tests with LinuxOnly label. $ kubetest --test --test_args="--ginkgo. skip=\[LinuxOnly\]" --provider local --deployment local
  34. Kubetest Workflow Review 50 kubernetes/hack /e2e.go test-infra/kubetest kubernetes/test/e2e /e2e_test.go Start

    E2E testing. kubernetes/hack /ginkgo-e2e.sh kubernetes/test/e2e/f ramework/framework .go
  35. Kubetest Workflow Review (cont.) 51 kubernetes/hack/ e2e.go kubernetes/hack/ ginkgo-e2e.sh test-infra/kubetest

    kubernetes/test/e2e/ e2e.go kubernetes/_output/ bin/e2e.test kubernetes/test/e2e/framework /framework.go Begin E2E testing. Find the kubetest, and update to latest version. Deploy the Kubernetes cluster, build kubernetes/test/e2e/e2e_test.go to e2e.test file and execute ginkgo-e2e.sh. Running Ginkgo CLI to execute e2e.test. (e2e.test will load all testing list.) Ginkgo will first execute TestE2E() from e2e_test.go, then TestE2E() will called runE2Etest() which is in e2e.go. runE2Etest() will execute framework.go to begin e2e testing. Cluster E2E Testing
  36. Cluster E2E Testing Writing Test Specifications: 1. Debuggability - Provide

    as detailed as possible reasons for the failure in its output. 2. Ability to run in non-dedicated test clusters - Large numbers of tests can be executed in parallel against the same cluster to reduce delay and improve resource utilization. 3. Speed of execution - Reduce the execution time as possible of the test. 4. Resilience to relatively rare, temporary infrastructure glitches or delays - Provide the resilient of the testing. Ref: Writing Good E2E Tests 54
  37. Writing Test (cont.) 55 Cluster E2E Testing Add new test:

    1. Create a folder for your testing in kubernetes/test/e2e. 2. Place the testing files into the folder. 3. Add the BUILD file into the folder. ◦ kubernets/test/e2e/<yourfolder>/BUILD 4. Import your package in ◦ kubernets/test/e2e/e2e_test.go ◦ kubernets/test/e2e/BUILD 5. Rebuild the e2e.test ◦ kubetest --build * Don’t forget to mark the test with specific label( [Slow], [Serial], etc.) . You can consult #kinds-of-tests to determine how your test should be marked.
  38. 57 Okay, now I know the E2E testing. But how

    can I run the E2E testing on my already deployed cluster rather than create a new one?
  39. Conformance Testing The Kubernetes Conformance test suite is a subset

    of e2e tests that SIG architecture has approved to define the core set of interoperable features that all conformant Kubernetes clusters must support. You can use conformance testing to test your already deployed cluster. Ref: Conformance Testing in Kubernetes 59 Conformance Testing
  40. Execution 61 # Checking your kubernetes server version $ kubectl

    get version Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3" , GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:05:50Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"} # Change Kubernetes repository to the specific version $ cd $GOPATH/src/k8s.io/kubernetes $ git checkout v1.15.3 # Build e2e.test and kubectl $ make WHAT="test/e2e/e2e.test vendor/github.com/onsi/ginkgo/ginkgo cmd/kubectl" Conformance Testing
  41. Execution (cont.) 62 # Setup for conformance tests $ export

    KUBECONFIG=/path/to/kubeconfig $ export KUBERNETES_CONFORMANCE_TEST=y # Run testing $ kubetest --provider=skeleton --test --test_args="--ginkgo.focus=\[Conformance\]" *The testing time is depend on your environment. (it takes 4~6 hours in my homelab) * If you want to execute testing by using different client/server version, please use “--check-version-skew=false” flag. Conformance Testing
  42. Test Lists 64 Conformance Testing The tests with [Conformance] label.

    (kubernetes/test/conformance/testdata/conformance.txt) Ref: • Kubernetes Conformance Test Suite - v1.9 • Conformance.txt
  43. Writing Test (cont.) 68 Conformance Testing The process to add

    new conformance tests: 1. Write your tests. 2. Make sure your tests are proven to meet the conformance test requirements. 3. Promote your tests. Ref: Promoting Tests To Conformance
  44. Write Your Tests 70 Conformance Testing Test Format 1. Use

    framework.ConformanceIt() instead of framework.It() 2. adds a comment test comment metadata before the ConformanceIt() /* Release : v1.15.3 Testname: Kubelet: log output Description: By default the stdout and stderr from the process being executed in a pod MUST be sent to the pod's logs. */ framework.ConformanceIt ("it should print the output to logs", func() { ... })
  45. Write Your Tests (cont.) 71 Conformance Testing 1. Create a

    folder for your test in kubernets/test/e2e. 2. Place the test files into the folder. 3. Add the BUILD file into the folder. ◦ kubernets/test/e2e/<yourfolder>/BUILD 4. Import your package in ◦ kubernets/test/e2e/e2e_test.go ◦ kubernets/test/e2e/BUILD 5. go run test/conformance/walk.go test/e2e > test/conformance/testdata/conformance.txt 6. Rebuild the e2e.test ◦ kubetest --build * Don’t forget to configure the test with specific label( [Slow], [Serial], etc.).
  46. Conformance Test Requirements 72 Conformance Testing Make sure your tests

    are proven to meet the conformance test requirements.
  47. Promote Your Tests 73 Conformance Testing Open a PR: 1.

    Title: "Promote xxx e2e test to Conformance" 2. Includes information and metadata in the description • /area conformance • @kubernetes/sig-architecture-pr-reviews @kubernetes/sig-xxx-pr-reviews @kubernetes/cncf-conformance-wg • Any necessary information (e.g. explain why a test cannot run on Windows) 3. Add the PR to SIG Architecture's Conformance Test Review board in the To Triage column. 4. Schedule the additional Windows tests • /test pull-kubernetes-e2e-aks-engine-azure-windows
  48. Heptio Sonobuoy 75 Conformance Testing Sonobuoy is another conformance testing

    tool developed by VMware Tanzu (Heptio). It provides easier way to verify your Kubernetes Cluster. Ref: Sonobuoy
  49. Heptio Sonobuoy (cont.) 76 Conformance Testing Test lists: 1. Same

    as kubetest conformance testing. 2. Be placed in the Sonobuoy docker image. * Sonobuoy supports 3 Kubernetes minor versions: the current release and 2 minor versions before.
  50. Certified Kubernetes 77 Conformance Testing Sonobuoy is also the standard

    conformance tool of CNCF which is used to verify the Kubernetes deployment tools of the enterprise. How to get the certification: https://github.com/cncf/k8s-conformance#certified-kubernetes
  51. Execution 78 Conformance Testing $ export KUBECONFIG=/path/to/kubeconfig $ go get

    -u -v github.com/heptio/sonobuoy # Start testing and wait until they are finished run: $ sonobuoy run --wait # Get the result $ results=$(sonobuoy retrieve) $ sonobuoy e2e $results # Delete the objects deployed by sonobuoy $ sonobuoy delete
  52. Result 79 Conformance Testing • hosts • meta • plugins

    • podlogs • resources • serverversion.json • servergroup.json
  53. Comparation to Kubetest 80 Conformance Testing Sonobuoy • Easier to

    setup • Doesn’t guarantee to run the latest set of conformance tests. Kubetest • Require a bit more work to setup. • Ensure to run the latest set of conformance tests.
  54. Node E2E Testing Node E2E tests are component tests meant

    for testing the Kubelet code on a custom host environment. 1. Only support Linux host. 2. Only support local and GCE deployment. Ref: Node E2E Tests 82 Node E2E Testing
  55. Execution 83 Node E2E Testing $ kubetest --build $ kubetest

    --test --node-tests $ go get -u github.com/onsi/ginkgo/ginkgo $ go get -u github.com/onsi/gomega/... $ cp $GOPATH/bin/ginkgo /usr/local/bin # Install etcd $ sudo PATH=$PATH hack/install-etcd.sh $ export PATH="/root/go/src/k8s.io/kubernetes/third_party/etcd:${PATH}" # Run test(local) $ make test-e2e-node # Run test(remote) $ make test-e2e-node REMOTE=true Execution 1: Use kubetest (only support GCE) Execution 2: Use make
  56. Workflow (kubetest) 85 Node E2E Testing 85 kubetest --build test-infra/kubetest/

    e2e.go kubetest --test --node-tests Begin E2E testing. Build e2e_node.test. Execute nodeTest() from test-infra/kubetest/e2e.go. kubernetestest/e2e _node/runner/remo te/run_remote.go Execute run_remote.go
  57. Workflow (make) 86 Node E2E Testing 86 make test-e2e-node kubernetes/hack/

    make-rules/ test-e2e-node.sh kubernetestest/e2e_ node/runner/local/ru n_local.go Begin E2E testing. Build e2e_node.test. kubernetestest/e2e_ node/runner/remote/ run_remote.go Execute runner_remote.go or runner_local.go.
  58. References Software Testing • Types Of Software Testing: Different Testing

    Types With Details Kubernetes Testing • WIKIPEDIA - Special Interest Group • Kubernetes SIGs and Working Groups • Kubernetes Community Governance Model • Subprojects of each SIGs. • Sig-Testing • test-infra 90
  59. References E2E Testing • Kubernetes E2E Testing • Kubetest •

    Ginkgo • Gomega • End-To-End Testing in Kubernetes • Writing good e2e tests for Kubernetes Node E2E Testing • Node-End-To-End Tests 91
  60. References Conformance Testing • Conformance Testing in Kubernetes • Kubernetes

    Conformance Test Suite - v1.9 • Conformance.txt • Sonobuoy • CNCF - Certified Kubernetes 92