Container Storage Interface (CSI)
Antigamente o Kubernetes usava somente o Docker como container runtime. Todo o código para trabalhar com o Docker era inserido direto no código fonte do Kubernetes. Com a chegada de novos container runtimes como o RKT e o CRI-O foi necessário uma forma de suportá-los sem precisar inseri-los no código fonte do Kubernetes.
Sendo assim, o Docker foi removido do código fonte do Kubernetes e criada uma interface genérica para esse propósito chamada CRI (Container Runtime Interface) para que no futuro novos runtimes pudessem ser agregados ao Kubernetes.
O CRI estabelece uma interface clara e padronizada entre o Kubernetes e os container runtimes, permitindo que o Kubernetes seja mais flexível e agnóstico em relação ao runtime subjacente.
Da mesma maneira, para suportar diferentes redes foi criada a Container Network Interface (CNI) que define os padrões para comunicação de rede e vários players podem desenvolver soluções para o Kubernetes.
O CSI Driver não é exclusivo do Kubernetes; é uma interface projetada para conectar sistemas que gerenciam containers aos drivers de armazenamento externo. Essa integração de volumes de armazenamento é aplicável em uma variedade de cenários, desde orquestradores de containers até ambientes de execução isolados e qualquer outra situação onde seja necessário vincular armazenamento externo a containers.
Ele simplifica a integração de novos fornecedores de armazenamento ao estabelecer uma interface padronizada para os drivers de volume. Essa padronização permite que diversos provedores de armazenamento desenvolvam plugins compatíveis com o CSI, seguindo os padrões estabelecidos pela interface. Isso promove uma maior flexibilidade de escolha para os usuários e facilita a interoperabilidade entre diferentes sistemas de orquestração de containers e provedores de armazenamento.
Em programação, uma interface define um contrato ou conjunto de métodos que uma classe ou objeto deve implementar. É uma abstração que descreve as operações que um objeto pode realizar, mas não contém a implementação dessas operações.
// Interface define o contrato
interface Animal {
void fazerSom();
}
// Implementação específica da interface
class Cachorro implements Animal {
public void fazerSom() {
System.out.println("Au au!");
}
}