the following is the service definition
# Source: ingress-nginx/templates/controller-service.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '60'
service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: 'true'
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:iam::xxx:server-certificate/project-ssl-cert2xxx01
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: https
service.beta.kubernetes.io/aws-load-balancer-type: elb
service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags: 'Name=nginx-ingress-${ENVIRONMENT}-elb,owner=devops,k8s=true'
labels:
helm.sh/chart: ingress-nginx-2.11.0
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 0.34.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
type: LoadBalancer
externalTrafficPolicy: Local
ports:
- name: http
port: 80
protocol: TCP
targetPort: tohttps
- name: https
port: 443
protocol: TCP
targetPort: http
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controllerthere is this line in .metadata.annotations containing ${ENVIRONMENT}:
service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags: 'Name=nginx-ingress-${ENVIRONMENT}-elb,owner=devops,k8s=true'So what is the best (and proper way) to pass this into kubectl apply?
Environment variables are not directly supported on templates used by kubectl.
There are some tools that can help with configuration templating:
Kapitan can handle templating too (although it's an exaggerated solution for your problem).
Or you can do some text-processing before applying your template (e.g., sed 's/${ENVIRONMENT}/development/g' controller-service.yaml | kubectl apply -f -)