--- layout: docs page_title: Uninstall description: Uninstall Consul on Kubernetes --- # Uninstall Consul Uninstalling Consul requires running `helm delete` **and** then manually cleaning up some resources that Helm does not delete. 1. First, run `helm delete`: ```shell-session $ helm delete hashicorp release "hashicorp" uninstalled ``` 1. After deleting the Helm release, you need to delete the `PersistentVolumeClaim`'s for the persistent volumes that store Consul's data. These are not deleted by Helm due to a [bug](https://github.com/helm/helm/issues/5156). To delete, run: ```shell-session $ kubectl get pvc -l chart=consul-helm NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE data-default-hashicorp-consul-server-0 Bound pvc-32cb296b-1213-11ea-b6f0-42010a8001db 10Gi RWO standard 17m data-default-hashicorp-consul-server-1 Bound pvc-32d79919-1213-11ea-b6f0-42010a8001db 10Gi RWO standard 17m data-default-hashicorp-consul-server-2 Bound pvc-331581ea-1213-11ea-b6f0-42010a8001db 10Gi RWO standard 17m $ kubectl delete pvc -l chart=consul-helm persistentvolumeclaim "data-default-hashicorp-consul-server-0" deleted persistentvolumeclaim "data-default-hashicorp-consul-server-1" deleted persistentvolumeclaim "data-default-hashicorp-consul-server-2" deleted ``` ~> **NOTE:** This will delete **all** data stored in Consul and it can't be recovered unless you've taken other backups. 1. If installing with ACLs enabled, you will need to then delete the ACL secrets: ```shell-session $ kubectl get secret | grep consul | grep Opaque consul-acl-replication-acl-token Opaque 1 41m consul-bootstrap-acl-token Opaque 1 41m consul-client-acl-token Opaque 1 41m consul-connect-inject-acl-token Opaque 1 37m consul-controller-acl-token Opaque 1 37m consul-federation Opaque 4 41m consul-mesh-gateway-acl-token Opaque 1 41m ``` Ensure that the secrets you're about to delete are all created by Consul and not created by someone else that happen to have the word `consul`. ```shell-session $ kubectl get secret | grep consul | grep Opaque | awk '{print $1}' | xargs kubectl delete secret secret "consul-acl-replication-acl-token" deleted secret "consul-bootstrap-acl-token" deleted secret "consul-client-acl-token" deleted secret "consul-connect-inject-acl-token" deleted secret "consul-controller-acl-token" deleted secret "consul-federation" deleted secret "consul-mesh-gateway-acl-token" deleted secret "consul-gossip-encryption-key" deleted ``` 1. If installing with `controller.enabled` then you will need to delete the webhook certificate: ```shell-session $ kubectl get secret consul-controller-webhook-cert NAME TYPE DATA AGE consul-controller-webhook-cert kubernetes.io/tls 2 47m ``` ```shell-session $ kubectl delete secret consul-controller-webhook-cert secret "consul-consul-controller-webhook-cert" deleted ``` 1. If installing with `tls.enabled` then there will be a `ServiceAccount` that is left behind: ```shell-session $ kubectl get serviceaccount consul-tls-init NAME SECRETS AGE consul-tls-init 1 47m ``` ```shell-session $ kubectl delete serviceaccount consul-tls-init serviceaccount "consul-tls-init" deleted ```