TLS for Intra-Kubernetes AI Service Communication
PythonWhen setting up intra-service communication within a Kubernetes cluster, particularly for AI services or any other type of application that requires secure communication, it's important to establish a Transport Layer Security (TLS) system. This ensures that the data transmitted between services is encrypted and secure from potential eavesdropping or tampering.
In Kubernetes, managing TLS can be done, among other ways, through the use of cert-manager, which is a native Kubernetes certificate management controller. It can help with issuing certificates from a variety of sources, such as Let’s Encrypt, HashiCorp Vault, Venafi, a simple signing key pair, or self-signed certificates.
The following program demonstrates how to set up the cert-manager in a Kubernetes cluster using Pulumi to manage TLS for secure service communication. It assumes that you have a Kubernetes cluster up and running and
pulumi
and thekubectl
CLI installed and configured to talk to your Kubernetes cluster.Here is an explanation of the steps that will be followed in the program:
- Configuration and import: Importing necessary Pulumi libraries/packages for creating Kubernetes resources.
- Install cert-manager: Deploying cert-manager to your Kubernetes cluster using Pulumi, which automates the process that you would otherwise do via
kubectl
and Helm. - Creating Certificate Issuer: Configuring a ClusterIssuer or Issuer, which are Kubernetes resources that represent certificate authorities (CAs) that are able to generate signed certificates by honoring certificate signing requests.
- Deploying an example service: Creating a dummy AI service with a corresponding Kubernetes
Service
andDeployment
for demonstration purposes. This service will be configured with TLS using a certificate issued by cert-manager. - Exporting relevant information: Exporting the service endpoint for accessing your AI service securely.
Let's translate these steps into a Pulumi program written in Python:
import pulumi from pulumi_kubernetes.helm.v3 import Chart, ChartOpts from pulumi_kubernetes.apiextensions import CustomResource from pulumi_kubernetes.apiextensions.v1 import CustomResourceDefinition from pulumi_kubernetes.core.v1 import Service, Pod from pulumi_kubernetes.cert_manager.v1 import ClusterIssuer # Step 2: Install cert-manager # Using helm chart to install cert-manager into the kubernetes cluster # Helm is a package manager for Kubernetes, and Pulumi supports installing Helm charts directly into your cluster cert_manager_chart = Chart( 'cert-manager', ChartOpts( chart='cert-manager', version='v1.5.3', namespace='cert-manager', fetch_opts={'repo': 'https://charts.jetstack.io'} ), opts=pulumi.ResourceOptions(provider=k8s_provider) # Assuming we have a k8s_provider configured to connect to our Kubernetes cluster ) # Step 3: Creating Certificate Issuer # This is a Custom Resource Definition (CRD) provided by cert-manager, representing a certificate authority from where to request TLS certificates issuer = ClusterIssuer( 'letsencrypt-prod', metadata={'name': 'letsencrypt-prod'}, spec={ 'acme': { 'server': 'https://acme-v02.api.letsencrypt.org/directory', 'email': 'your-email@example.com', # Provide a valid email address 'privateKeySecretRef': {'name': 'letsencrypt-prod'}, 'solvers': [{ 'http01': { 'ingress': { 'class': 'traefik' } } }] } } ) # Step 4: Deploying an example service # Creating a Kubernetes Service and Deployment. This would represent your AI Service. # Note that in a real-world scenario, you might need to configure your AI Service's image, # resource requests, and other specs depending on your actual application requirements. ai_service = Service( 'ai-service', spec={ 'selector': {'app': 'ai-service'}, 'ports': [{'port': 443, 'targetPort': 'https'}], 'type': 'ClusterIP' # Use LoadBalancer if you want an external IP assigned by the cloud provider } ) ai_service_deployment = Pod( 'ai-service-deployment', spec={ 'selector': {'matchLabels': {'app': 'ai-service'}}, 'replicas': 1, 'template': { 'metadata': {'labels': {'app': 'ai-service'}}, 'spec': { 'containers': [{ 'name': 'ai-service', 'image': 'your-ai-service-image:latest', # Use the Docker image for your AI service 'ports': [{'name': 'https', 'containerPort': 443}] }] } } } ) # Step 5: Exporting relevant information # Exporting the Kubernetes service's cluster IP address for accessing your AI service pulumi.export('ai_service_cluster_ip', ai_service.spec['cluster_ip'])
This Pulumi program installs
cert-manager
, sets up aClusterIssuer
that will enable the creation of valid TLS certificates, deploys a dummy AI service using a simple deployment and service definition in Kubernetes, and then it exports the cluster IP as an output for you to utilize. For your actual AI service, you'll have to replace'your-ai-service-image:latest'
with the actual image of your AI service and'your-email@example.com'
with your valid email address.Note that to test and use the TLS certificates for your services, you'd need to configure respective
Ingress
resources (or any other method you use to expose services) with annotations or spec configurations pointing to yourClusterIssuer
to get a TLS certificate for your AI services. Additionally, ensure your AI service is properly set up to serve traffic over HTTPS using the TLS certificates that will be mounted by cert-manager once issued.