Description
Summary
It appears that if your ~/.kube/config
specifies a cluster with insecure-skip-tls-verify: true
, then it is not possible to use Terraform to manage a different Kubernetes cluster and also validate the TLS certificate. Setting insecure = false
does not appear to override the setting from ~/.kube/config
.
There's an obvious workaround (update your ~/.kube/config
file,) but it's not initially obvious that the problem is caused by the Kubernetes provider being unable to override the setting in your ~/.kube/config
file.
Terraform Version
Terraform v0.11.8
+ provider.google v1.16.2
+ provider.kubernetes v1.2.0
+ provider.random v2.0.0
Affected Resource(s)
kubernetes
provider
Terraform Configuration Files
terraform {
required_version = "~> 0.11.8"
}
provider "kubernetes" {
version = "~> 1.2"
host = "36.4.3.2"
username = "user"
password = "pw"
cluster_ca_certificate = "${file("ca.crt")}"
insecure = false
}
resource "kubernetes_namespace" "namespace" {
metadata {
name = "namespace"
}
}
kubeconfig
My ~/.kube/config
has a single cluster, and it has insecure-skip-tls-verify
set to true
. This is not the cluster I am using Terraform to manage; it just happens to be in my configuration.
apiVersion: v1
clusters:
- cluster:
server: https://192.168.0.100:8443
insecure-skip-tls-verify: true
name: minikube
contexts:
- context:
cluster: minikube
user: minikube
name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
user:
client-certificate: C:\Users\wes.robinson\.minikube\client.crt
client-key: C:\Users\wes.robinson\.minikube\client.key
Debug Output
https://gist.github.com/RobinsonWM/8f927ee586ba51c89809ebcd782fcbdc
Expected Behavior
It should have authenticated to my k8s cluster and created a namespace.
Actual Behavior
It gave an error message and stopped before authenticating to k8s. This error is coming from the Kubernetes client Go library because Terraform passed a Cluster CA certificate, but it also passed the Insecure
flag to request that the certificate not be validated:
>terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
Error: Error refreshing state: 1 error(s) occurred:
* provider.kubernetes: Failed to configure: specifying a root certificates file with the insecure flag is not allowed
Steps to Reproduce
- Configure your
~/.kube/config
to look like the one above - specifically, a single cluster that hasinsecure-skip-tls-verify: true
- Create your Terraform configuration like mine, specifically with a
cluster_ca_certificate
and withinsecure
set tofalse
- Run
terraform plan
orterraform apply
Important Factoids
We have reproduced this on Windows 10 and Mac OS X.
References
I think this might be very similar to an issue that was fixed in the Datadog provider: hashicorp/terraform#12168