blob: 21980dd24cb25be3573f73817853d22e37a842e4 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Apache Cassandra | Apache Cassandra Documentation</title>
<link rel="stylesheet" href="../../assets/css/site.css">
<meta name="description" content="The Apache Cassandra Community">
<link rel="schema.dcterms" href="https://purl.org/dc/terms/">
<meta name="dcterms.subject" content="_">
<meta name="dcterms.identifier" content="master">
<meta name="generator" content="Antora 2.3.4">
<link rel="icon" href="../../assets/img/favicon.ico" type="image/x-icon">
<script>
const script = document.createElement("script");
const domain = window.location.hostname;
script.type = "text/javascript";
script.src = "https://plausible.cassandra.apache.org/js/plausible.js";
script.setAttribute("data-domain",domain);
script.setAttribute("defer",'true');
script.setAttribute("async",'true');
document.getElementsByTagName("head")[0].appendChild(script);
</script> </head>
<body class="single-post">
<div class="container mx-auto relative">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<meta property="og:type" content="website" />
<meta property="og:description" content="" />
<meta property="og:url" content="/" />
<meta property="og:site_name" content="Apache Cassandra" />
<header id="top-nav">
<div class="inner relative">
<div class="header-social-icons text-right">
<a href="https://twitter.com/cassandra?lang=en" target="_blank" styles="margin-left: 20px;"><img src="../../assets/img/twitter-icon-circle-white.svg" alt="twitter icon" width="24"></a>
<a href="https://www.linkedin.com/company/apache-cassandra/" target="_blank" styles="margin-left: 20px;"><img src="../../assets/img/LI-In-Bug.png" alt="linked-in icon" width="24"></a>
<a href="https://www.youtube.com/c/PlanetCassandra" target="_blank" styles="margin-left: 20px;"><img src="../../assets/img/youtube-icon.png" alt="youtube icon" width="24"></a>
</div>
<div class="cf">
<div class="logo left"><a href="/"><img src="../../assets/img/logo-white-r.png" alt="cassandra logo"></a></div>
<div class="mobile-nav-icon right">
<img class="toggle-icon" src="../../assets/img/hamburger-nav.svg">
</div>
<ul class="main-nav nav-links right flex flex-vert-center flex-space-between">
<li>
<a class="nav-link hide-mobile">Get Started</a>
<ul class="sub-menu bg-white">
<li class="pa-micro">
<a href="/_/cassandra-basics.html">
<div class="sub-nav-icon">
<img src="../../assets/img/sub-menu-basics.png" alt="cassandra basics icon">
</div>
<div class="sub-nav-text teal py-small">
Cassandra Basics
</div>
</a>
</li>
<li class="pa-micro">
<a href="/_/quickstart.html">
<div class="sub-nav-icon">
<img src="../../assets/img/sub-menu-rocket.png" alt="cassandra basics icon">
</div>
<div class="sub-nav-text teal py-small">
Quickstart
</div>
</a>
</li>
<li class="pa-micro">
<a href="/_/ecosystem.html">
<div class="sub-nav-icon">
<img src="../../assets/img/sub-menu-ecosystem.png" alt="cassandra basics icon">
</div>
<div class="sub-nav-text teal py-small">
Ecosystem
</div>
</a>
</li>
</ul>
</li>
<li><a class="nav-link" href="/doc/latest/">Documentation</a></li>
<li>
<a class="nav-link" href="/_/community.html">Community</a>
<ul class="sub-menu bg-white">
<li class="pa-micro">
<a href="/_/community.html#code-of-conduct">
<div class="sub-nav-icon">
<img src="../../assets/img/sub-menu-welcome.png" alt="welcome icon">
</div>
<div class="sub-nav-text teal py-small">
Welcome
</div>
</a>
</li>
<li class="pa-micro hide-mobile">
<a href="/_/community.html#discussions">
<div class="sub-nav-icon">
<img src="../../assets/img/sub-menu-discussions.png" alt="discussions icon">
</div>
<div class="sub-nav-text teal py-small">
Discussions
</div>
</a>
</li>
<li class="pa-micro hide-mobile">
<a href="/_/community.html#project-governance">
<div class="sub-nav-icon">
<img src="../../assets/img/sub-menu-governance.png" alt="Governance icon">
</div>
<div class="sub-nav-text teal py-small">
Governance
</div>
</a>
</li>
<li class="pa-micro hide-mobile">
<a href="/_/community.html#how-to-contribute">
<div class="sub-nav-icon">
<img src="../../assets/img/sub-menu-contribute.png" alt="Contribute icon">
</div>
<div class="sub-nav-text teal py-small">
Contribute
</div>
</a>
</li>
<li class="pa-micro hide-mobile">
<a href="/_/community.html#meet-the-community">
<div class="sub-nav-icon">
<img src="../../assets/img/sub-menu-community.png" alt="Meet the Community icon">
</div>
<div class="sub-nav-text teal py-small">
Meet the Community
</div>
</a>
</li>
<li class="pa-micro hide-mobile">
<a href="/_/cassandra-catalyst-program.html">
<div class="sub-nav-icon">
<img src="../../assets/img/sub-menu-catalyst.png" alt="Catalyst icon">
</div>
<div class="sub-nav-text teal py-small">
Catalyst Program
</div>
</a>
</li>
<li class="pa-micro hide-mobile">
<a href="/_/events.html">
<div class="sub-nav-icon">
<img src="../../assets/img/sub-menu-events.png" alt="Events icon">
</div>
<div class="sub-nav-text teal py-small">
Events
</div>
</a>
</li>
</ul>
</li>
<li>
<a class="nav-link hide-mobile">Learn</a>
<ul class="sub-menu bg-white">
<li class="pa-micro">
<a href="/_/Apache-Cassandra-5.0-Moving-Toward-an-AI-Driven-Future.html">
<div class="sub-nav-icon">
<img src="../../assets/img/sub-menu-basics.png" alt="Basics icon">
</div>
<div class="sub-nav-text teal py-small">
Cassandra 5.0
</div>
</a>
</li>
<li class="pa-micro">
<a href="/_/case-studies.html">
<div class="sub-nav-icon">
<img src="../../assets/img/sub-menu-case-study.png" alt="Case Studies icon">
</div>
<div class="sub-nav-text teal py-small">
Case Studies
</div>
</a>
</li>
<li class="pa-micro">
<a href="/_/resources.html">
<div class="sub-nav-icon">
<img src="../../assets/img/sub-menu-resources.png" alt="Resources icon">
</div>
<div class="sub-nav-text teal py-small">
Resources
</div>
</a>
</li>
<li class="pa-micro">
<a href="/_/blog.html">
<div class="sub-nav-icon">
<img src="../../assets/img/sub-menu-blog.png" alt="Blog icon">
</div>
<div class="sub-nav-text teal py-small">
Blog
</div>
</a>
</li>
</ul>
</li>
<li><a class="nav-link btn btn--filled" href="/_/download.html">Download Now</a></li>
</ul>
</div>
</div>
</header>
<div class="hero hero--home grad">
<div class="eye"></div>
<div id="home-content" class="text-center flex flex-center flex-column relative z2 ma-xlarge">
<h1>Cassandra and Kubernetes: SIG Update #2</h1>
<h3>June 9, 2021 | Rahul Singh, John Sanda</h3>
</div>
</div>
<div id="blog-post" class="flex-center py-large arrow">
<div class="blog-breadcrumb mb-medium">
<div class="inner inner--narrow">
<a href="/_/blog.html">« Back to the Apache Cassandra Blog</a>
</div>
</div>
<div class="post-content">
<div class="inner inner--narrow">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>The Cassandra Kubernetes SIG is excited to share that there has been coalescence around the <a href="https://github.com/datastax/cass-operator" target="_blank" rel="noopener">Cass Operator</a> project as the community-based operator.</p>
</div>
<div class="paragraph">
<p>It is no understatement to say that moving towards a single operator for the Apache Cassandra community has been a technical challenge. There are several <a href="Cassandra-and-Kubernetes-SIG-Update-and-Survey.html" class="page" target="_blank" rel="noopener">Kubernetes operator projects for Cassandra</a>, and there were at least five different ways to go about this. Initially, it seemed we were going to create a standard and build a fresh operator from scratch, adopting the others’ ideas. For more details on this discussion, check out this lengthy dev mailing list <a href="https://lists.apache.org/thread.html/r473275258f3203121935c2412fbe94c0fc368fe17b72141957afef62%40%3Cdev.cassandra.apache.org%3E" target="_blank" rel="noopener">thread</a>.</p>
</div>
<div class="paragraph">
<p>For the next stage, the SIG is focused on increasing Cass Operator’s community adoption with the ultimate goal of bringing the project into the ASF.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="why-cass-operator"><a class="anchor" href="#why-cass-operator"></a>Why Cass-Operator?</h3>
<div class="paragraph">
<p>Several features of the Cass-Operator project, open-sourced by DataStax, made it the prime candidate for the other projects to rally around. (You can read about the five major Kubernetes Operators for Cassandra in the last <a href="Cassandra-and-Kubernetes-SIG-Update-and-Survey.html" class="page">Cassandra SIG update</a>.)</p>
</div>
<div class="imageblock">
<div class="content">
<img src="../_images/blog/cass-operator-diagram.png" alt="High Level Architecture of the Cass Operator in Kubernetes">
</div>
</div>
<div class="paragraph">
<p><strong>High Level Architecture of the Cass Operator in Kubernetes</strong></p>
</div>
<div class="paragraph">
<p>Cass-Operator has major features for datacenter provisioning and operations and has Apache Cassandra’s best practices baked into the automations:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Bootstraps nodes appropriately</strong> - this feature is important because when Cassandra starts up it needs to start the initial seeds first, in each rack, in a uniform manner.</p>
</li>
<li>
<p><strong>Scales up and scales down clusters gracefully</strong> - nodes are intelligently scaled up and down one at a time across racks so that replicas of data are uniformly distributed.</p>
</li>
<li>
<p><strong>Automated node recovery processes</strong> - basic operations such as restart, replace node, or replace an instance are all automated.</p>
</li>
<li>
<p><strong>Basic topology</strong> - this feature makes multi-DC / multi-rack clusters fairly easy to create.</p>
</li>
<li>
<p><strong>Advanced topology</strong> - Advanced networking at the Kubernetes layer makes multi-region / multi-K8s clusters possible with CNIs such as Cilium or externally via traditional networking tools.</p>
</li>
<li>
<p><strong>Customizable containers</strong> - applying containerization best practice, this enables human operators to merge containers they have built with what’s offered in the cass-operator so that they don’t have to deal with secrets/volumes.</p>
</li>
</ul>
</div>
<div class="imageblock">
<div class="content">
<img src="../_images/blog/apache-cassandra-cluster-on-kubernetes.png" alt="Apache Cassandra Cluster on Kubernetes">
</div>
<div class="title">Figure 1. An Apache Cassandra Cluster managed by Cass Operator in Kubernetes across different workers with StatefulSets managing the pods running Cassandra</div>
</div>
</div>
<div class="sect2">
<h3 id="cass-operator-differentiators"><a class="anchor" href="#cass-operator-differentiators"></a>Cass-Operator Differentiators</h3>
<div class="paragraph">
<p>Cass-Operator has many general features that distinguish it even before it is merged with the powerful features that CassKop will supply:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The operator leverages a number of existing open source tools in the OSS ecosystem and commercial components that have been open-sourced to avoid issues with vendor lock-in:</p>
</li>
<li>
<p>Open-sourced Cass Config Builder extracted from DataStax OpsCenter Life Cycle Manager.</p>
</li>
<li>
<p>Open-sourced Management API for Apache Cassandra (MAAC).</p>
</li>
<li>
<p>Open-sourced Metrics Collector for Apache Cassandra (MCAC).</p>
</li>
<li>
<p>Open-sourced SRE tools such as Prometheus and Grafana Operator.</p>
</li>
<li>
<p>PodTemplateSpec enables operators to super-customize existing pods.</p>
</li>
<li>
<p>Cass-Operator implements advanced networking and manages the node ports and host networks.</p>
</li>
<li>
<p>Management API mTLS support provides simple security.</p>
</li>
<li>
<p>Automated generation of keystore and truststore for internode and client to node TLS.</p>
</li>
<li>
<p>Automated superuser account configuration according to best practices.</p>
</li>
<li>
<p>NetworkTopologyStrategy is automatically applied with appropriate replication factor (RF) for system keyspaces.</p>
</li>
<li>
<p>Webhook validation ensures that invalid changes are rejected with a helpful message.</p>
</li>
<li>
<p>Rolling cluster updates which allow for changes related to a change in binary (C* upgrade), a change in configuration, and canary deployments - single rack application of changes for validation before broader deployment.</p>
</li>
<li>
<p>Operator certification and thorough testing on several platforms, including Azure AKS, Amazon EKS, Google GKE, Red Hat OpenShift, and VMWare Tanzu Kubernetes.</p>
</li>
<li>
<p>Well documented cloud storage classes, ingress solutions and reference Implementations with an example application using the Java driver.</p>
</li>
<li>
<p>Super-useful cluster-level stop / resume, which stops all running instances while keeping persistent storage. This feature allows for scaling compute down to zero, and bringing the cluster back up follows the expected Cassandra startup processes.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="casskop-operator-features-that-are-being-merged"><a class="anchor" href="#casskop-operator-features-that-are-being-merged"></a>CassKop operator features that are being merged</h3>
<div class="paragraph">
<p>There are features in the CassKop operator, open-sourced by Orange Telecom, which are being merged/committed into the CassOperator project:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Node labeling to map any internal architecture, including network-specific labels to help with multi-datacenter setup.</p>
</li>
<li>
<p>Volumes and sidecar management (which could be linked to PodTemplateSpec).</p>
</li>
<li>
<p>Backup &amp; Restore (Note: the CassKop project ruled out using <a href="https://velero.io/" target="_blank" rel="noopener">Velero</a>, and used <a href="https://github.com/instaclustr/esop" target="_blank" rel="noopener">Instaclustr esop</a> but <a href="https://github.com/thelastpickle/cassandra-medusa" target="_blank" rel="noopener">Medusa</a> could work too).</p>
</li>
<li>
<p>Kubectl plugin integration, which is useful on the ops side without an admin UI.</p>
</li>
<li>
<p>MultiCassKop evolution to drive multiple Cass-Operators clusters instead of multiple CassKops clusters (Note: This may remain Orange internal if too specific)</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>As you can see, there’s a lot of great things being developed for the Apache Cassandra project so that relates well with the Kubernetes world. We’ll also have a roadmap post soon. Join us for the next Cassandra Kubernetes SIG meeting or say hi on the <a href="https://the-asf.slack.com/" target="_blank" rel="noopener">Apache Software Foundation’s Slack team</a> by joining the <a href="https://app.slack.com/client/T4S1WH2J3/C014SSUAL9E" target="_blank" rel="noopener">#cassandra-kubernetes</a> channel.</p>
</div>
<div class="paragraph">
<p>Join the <a href="https://cwiki.apache.org/confluence/display/CASSANDRA/Cassandra+Kubernetes+SIG" target="_blank" rel="noopener">biweekly meetings</a> to stay informed.</p>
</div>
<div class="paragraph">
<p>This article originally was posted to Container Journal in April 2021. Reposted with permission. Please see the original article here: <a href="https://containerjournal.com/topics/cassandra-kubernetes-sig-picks-cass-operator-for-k8s/" target="_blank" rel="noopener">https://containerjournal.com/topics/cassandra-kubernetes-sig-picks-cass-operator-for-k8s/</a></p>
</div>
</div>
</div>
</div>
</div>
<footer class="grad grad--two flex-center pb-xlarge">
<div class="inner text-center z2 relative">
<h2 class="white py-small">Get started with Cassandra, fast.</h2>
<a id="footer-cta" href="/_/quickstart.html" class="btn btn--filled ma-medium">Quickstart Guide</a>
</div>
<div class="inner flex flex-distribute-items mt-xlarge z2 relative">
<div class="col-2">
<div id="footer-logo" class="logo logo--footer mb-medium"><img src="../../assets/img/logo-white-r.png" alt="Cassandra Logo"></div>
<p>Apache Cassandra<img src="../../assets/img/registered.svg" alt="®" style="width:18px;"> powers mission-critical deployments with improved performance and unparalleled levels of scale in the cloud.</p>
<div class="footer-social-icons">
<a href="https://twitter.com/cassandra?lang=en" target="_blank"><img src="../../assets/img/twitter-icon-circle-white.svg" alt="twitter icon" width="24"></a>
<a href="https://www.linkedin.com/company/apache-cassandra/" target="_blank"><img src="../../assets/img/LI-In-Bug.png" alt="linked-in icon" width="24"></a>
<a href="https://www.youtube.com/c/PlanetCassandra" target="_blank"><img src="../../assets/img/youtube-icon.png" alt="youtube icon" width="24"></a>
</div>
</div>
<div class="col-2 flex flex-center">
<ul class="columns-2">
<li class="mb-small"><a href="/">Home</a></li>
<li class="mb-small"><a href="/_/cassandra-basics.html">Cassandra Basics</a></li>
<li class="mb-small"><a href="/_/quickstart.html">Quickstart</a></li>
<li class="mb-small"><a href="/_/ecosystem.html">Ecosystem</a></li>
<li class="mb-small"><a href="/doc/latest/">Documentation</a></li>
<li class="mb-small"><a href="/_/community.html">Community</a></li>
<li class="mb-small"><a href="/_/case-studies.html">Case Studies</a></li>
<li class="mb-small"><a href="/_/resources.html">Resources</a></li>
<li class="mb-small"><a href="/_/blog.html">Blog</a></li>
</ul>
</div>
</div>
</footer>
<div class="lower-footer bg-white pa-medium">
<div class="flex flex-row flex-vert-center">
<div class="pr-medium"><img src="../../assets/img//feather-small.png" alt="ASF" width="20"></div>
<div class="pr-medium"><a href="http://www.apache.org/" target="_blank">Foundation</a></div>
<div class="pr-medium"><a href="https://www.apache.org/events/current-event.html" target="_blank">Events</a></div>
<div class="pr-medium"><a href="https://www.apache.org/licenses/" target="_blank">License</a></div>
<div class="pr-medium"><a href="https://www.apache.org/foundation/thanks" target="_blank">Thanks</a></div>
<div class="pr-medium"><a href="https://www.apache.org/security" target="_blank">Security</a></div>
<div class="pr-medium"><a href="https://privacy.apache.org/policies/privacy-policy-public.html" target="_blank">Privacy</a></div>
<div class="pr-medium"><a href="https://www.apache.org/foundation/sponsorship" target="_blank">Sponsorship</a></div>
</div>
<p class="my-medium">© 2009-<script>document.write(new Date().getFullYear())</script> <a href="https://apache.org" target="_blank">The Apache Software Foundation</a> under the terms of the Apache License 2.0. Apache, the Apache feather logo, Apache Cassandra, Cassandra, and the Cassandra logo, are either registered trademarks or trademarks of The Apache Software Foundation.</p>
</div>
<div id="fade" class="hidden"></div>
<div id="modal" class="hidden">
<div id="close-modal" class="cursor-pointer"><svg viewBox="0 0 24 24" width="24" height="24" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round" class="css-i6dzq1"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg></div>
<div id="mod-content" class="vid-mod-content resp-container"></div>
</div>
<script>
jQuery(function(){
var windowW = $(window).width();
$(document)
.on('click','.mobile-nav-icon',function(){
$('.main-nav').fadeIn();
})
.on('click','.main-nav',function(){
if(windowW <= 1000){
$(this).fadeOut();
}
})
.on('click','#version-toggle',function(){
$(this).toggleClass('active');
$(this).next().fadeToggle();
})
.on('click','#mobile-docs-nav-burger', function(){
$(this).toggleClass('active');
$('.docs-nav').toggleClass('active');
});
var url = window.location.pathname;
var isQuickstart = url.includes('quickstart.html');
if(isQuickstart){
var footerCTA = document.getElementById('footer-cta');
footerCTA.innerHTML = 'Get latest updates';
footerCTA.setAttribute('href', '/_/blog.html');
}
});
</script>
</div>
</body>
<script>
jQuery(function(){
});
</script>
</html>