144 lines
6.2 KiB
Markdown
144 lines
6.2 KiB
Markdown
|
---
|
|||
|
title: Troubleshooting kubeadm
|
|||
|
---
|
|||
|
|
|||
|
{% capture overview %}
|
|||
|
|
|||
|
As with any program, you might run into an error using or operating it. Below we have listed
|
|||
|
common failure scenarios and have provided steps that will help you to understand and hopefully
|
|||
|
fix the problem.
|
|||
|
|
|||
|
If your problem is not listed below, please follow the following steps:
|
|||
|
|
|||
|
- If you think your problem is a bug with kubeadm:
|
|||
|
- Go to [github.com/kubernetes/kubeadm](https://github.com/kubernetes/kubeadm/issues) and search for existing issues.
|
|||
|
- If no issue exists, please [open one](https://github.com/kubernetes/kubeadm/issues/new) and follow the issue template.
|
|||
|
|
|||
|
- If you are unsure about how kubeadm or kubernetes works, and would like to receive
|
|||
|
support about your question, please ask on Slack in #kubeadm, or open a question on StackOverflow. Please include
|
|||
|
relevant tags like `#kubernetes` and `#kubeadm` so folks can help you.
|
|||
|
|
|||
|
If your cluster is in an error state, you may have trouble in the configuration if you see Pod statuses like `RunContainerError`,
|
|||
|
`CrashLoopBackOff` or `Error`. If this is the case, please read below.
|
|||
|
|
|||
|
{% endcapture %}
|
|||
|
|
|||
|
#### `ebtables` or `ethtool` not found during installation
|
|||
|
|
|||
|
If you see the following warnings while running `kubeadm init`
|
|||
|
|
|||
|
```
|
|||
|
[preflight] WARNING: ebtables not found in system path
|
|||
|
[preflight] WARNING: ethtool not found in system path
|
|||
|
```
|
|||
|
|
|||
|
Then you may be missing ebtables and ethtool on your Linux machine. You can install them with the following commands:
|
|||
|
|
|||
|
```
|
|||
|
# For ubuntu/debian users, try
|
|||
|
apt install ebtables ethtool
|
|||
|
|
|||
|
# For CentOS/Fedora users, try
|
|||
|
yum install ebtables ethtool
|
|||
|
```
|
|||
|
|
|||
|
#### Pods in `RunContainerError`, `CrashLoopBackOff` or `Error` state
|
|||
|
|
|||
|
Right after `kubeadm init` there should not be any such Pods. If there are Pods in
|
|||
|
such a state _right after_ `kubeadm init`, please open an issue in the kubeadm repo.
|
|||
|
`kube-dns` should be in the `Pending` state until you have deployed the network solution.
|
|||
|
However, if you see Pods in the `RunContainerError`, `CrashLoopBackOff` or `Error` state
|
|||
|
after deploying the network solution and nothing happens to `kube-dns`, it's very
|
|||
|
likely that the Pod Network solution that you installed is somehow broken. You
|
|||
|
might have to grant it more RBAC privileges or use a newer version. Please file
|
|||
|
an issue in the Pod Network providers' issue tracker and get the issue triaged there.
|
|||
|
|
|||
|
#### `kube-dns` is stuck in the `Pending` state
|
|||
|
|
|||
|
This is **expected** and part of the design. kubeadm is network provider-agnostic, so the admin
|
|||
|
should [install the pod network solution](/docs/concepts/cluster-administration/addons/)
|
|||
|
of choice. You have to install a Pod Network
|
|||
|
before `kube-dns` may deployed fully. Hence the `Pending` state before the network is set up.
|
|||
|
|
|||
|
#### `HostPort` services do not work
|
|||
|
|
|||
|
The `HostPort` and `HostIP` functionality is available depending on your Pod Network
|
|||
|
provider. Please contact the author of the Pod Network solution to find out whether
|
|||
|
`HostPort` and `HostIP` functionality are available.
|
|||
|
|
|||
|
Verified HostPort CNI providers:
|
|||
|
- Calico
|
|||
|
- Canal
|
|||
|
- Flannel
|
|||
|
|
|||
|
For more information, read the [CNI portmap documentation](https://github.com/containernetworking/plugins/blob/master/plugins/meta/portmap/README.md).
|
|||
|
|
|||
|
If your network provider does not support the portmap CNI plugin, you may need to use the [NodePort feature of
|
|||
|
services](/docs/concepts/services-networking/service/#type-nodeport) or use `HostNetwork=true`.
|
|||
|
|
|||
|
#### Pods are not accessible via their Service IP
|
|||
|
|
|||
|
Many network add-ons do not yet enable [hairpin mode](https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/#a-pod-cannot-reach-itself-via-service-ip)
|
|||
|
which allows pods to access themselves via their Service IP if they don't know about their podIP. This is an issue
|
|||
|
related to [CNI](https://github.com/containernetworking/cni/issues/476). Please contact the providers of the network
|
|||
|
add-on providers to get timely information about whether they support hairpin mode.
|
|||
|
|
|||
|
If you are using VirtualBox (directly or via Vagrant), you will need to
|
|||
|
ensure that `hostname -i` returns a routable IP address (i.e. one on the
|
|||
|
second network interface, not the first one). By default, it doesn't do this
|
|||
|
and kubelet ends-up using first non-loopback network interface, which is
|
|||
|
usually NATed. Workaround: Modify `/etc/hosts`, take a look at this
|
|||
|
`Vagrantfile`[ubuntu-vagrantfile](https://github.com/errordeveloper/k8s-playground/blob/22dd39dfc06111235620e6c4404a96ae146f26fd/Vagrantfile#L11) for how this can be achieved.
|
|||
|
|
|||
|
#### TLS certificate errors
|
|||
|
|
|||
|
The following error indicates a possible certificate mismatch.
|
|||
|
|
|||
|
```
|
|||
|
# kubectl get po
|
|||
|
Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
|
|||
|
```
|
|||
|
|
|||
|
Verify that the `$HOME/.kube/config` file contains a valid certificate, and regenerate a certificate if necessary.
|
|||
|
Another workaround is to overwrite the default `kubeconfig` for the "admin" user:
|
|||
|
|
|||
|
```
|
|||
|
mv $HOME/.kube $HOME/.kube.bak
|
|||
|
mkdir -p $HOME/.kube
|
|||
|
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
|
|||
|
sudo chown $(id -u):$(id -g) $HOME/.kube/config
|
|||
|
```
|
|||
|
|
|||
|
#### Errors on CentOS when setting up masters
|
|||
|
|
|||
|
If you are using CentOS and encounter difficulty while setting up the master node,
|
|||
|
verify that your Docker cgroup driver matches the kubelet config:
|
|||
|
|
|||
|
```bash
|
|||
|
docker info | grep -i cgroup
|
|||
|
cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
|
|||
|
```
|
|||
|
|
|||
|
If the Docker cgroup driver and the kubelet config don't match, change the kubelet config to match the Docker cgroup driver. The
|
|||
|
flag you need to change is `--cgroup-driver`. If it's already set, you can update like so:
|
|||
|
|
|||
|
```bash
|
|||
|
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
|
|||
|
```
|
|||
|
|
|||
|
Otherwise, you will need to open the systemd file and add the flag to an existing environment line.
|
|||
|
|
|||
|
Then restart kubelet:
|
|||
|
|
|||
|
```bash
|
|||
|
systemctl daemon-reload
|
|||
|
systemctl restart kubelet
|
|||
|
```
|
|||
|
|
|||
|
The `kubectl describe pod` or `kubectl logs` commands can help you diagnose errors. For example:
|
|||
|
|
|||
|
```bash
|
|||
|
kubectl -n ${NAMESPACE} describe pod ${POD_NAME}
|
|||
|
|
|||
|
kubectl -n ${NAMESPACE} logs ${POD_NAME} -c ${CONTAINER_NAME}
|
|||
|
```
|