180 lines
4.9 KiB
Markdown
180 lines
4.9 KiB
Markdown
# Kubectl
|
|
|
|
Kubectl is a command line tool for communicating with a [Kubernetes Cluster](kubernetes/kubernetes.md)'s control pane, using the Kubernetes API.
|
|
|
|
Documentation: [Kubectl Reference](https://kubernetes.io/docs/reference/kubectl/)
|
|
|
|
---
|
|
## Installation
|
|
|
|
### On Windows (PowerShell)
|
|
|
|
Install Kubectl with [chocolatey](tools/chocolatey.md):
|
|
|
|
```
|
|
choco install kubernetes-cli
|
|
```
|
|
|
|
### On Linux
|
|
|
|
> [!INFO] Installing on WSL2
|
|
> On WSL2 it's recommended to install Docker Desktop [[docker-desktop]], which automatically comes with kubectl.
|
|
|
|
#### Download the latest release
|
|
|
|
```bash
|
|
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
|
|
```
|
|
|
|
#### Install kubectl
|
|
|
|
```bash
|
|
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
|
|
```
|
|
|
|
### On mac OS
|
|
|
|
Install Kubectl with [homebrew](tools/homebrew.md):
|
|
|
|
```zsh
|
|
brew install kubernetes-cli
|
|
```
|
|
|
|
---
|
|
## Config Management
|
|
|
|
### Multiple Config Files
|
|
|
|
### On Windows (PowerShell)
|
|
|
|
```powershell
|
|
$env:KUBECONFIG = "$HOME/.kube/prod-k8s-clcreative-kubeconfig.yaml;$HOME/.kube/infra-home-kube-prod-1.yml;$HOME/.kube/infra-home-kube-demo-1.yml;$HOME/.kube/infra-cloud-kube-prod-1.yml"
|
|
```
|
|
|
|
### On Linux
|
|
|
|
```bash
|
|
export KUBECONFIG=~/.kube/kube-config-1.yml:~/.kube/kube-config-2.yml
|
|
```
|
|
|
|
Managing multiple config files manually can become extensive. Below you can find a handy script, which you can implement in your shell rc file (e.g. .bashrc or .zshrc). The script will automatically add all found kubeconfigs to the `KUBECONFIG` environment variable.
|
|
|
|
Script was copied from [here](https://medium.com/@alexgued3s/multiple-kubeconfigs-no-problem-f6be646fc07d)
|
|
|
|
```bash
|
|
# If there's already a kubeconfig file in ~/.kube/config it will import that too and all the contexts
|
|
DEFAULT_KUBECONFIG_FILE="$HOME/.kube/config"
|
|
if test -f "${DEFAULT_KUBECONFIG_FILE}"
|
|
then
|
|
export KUBECONFIG="$DEFAULT_KUBECONFIG_FILE"
|
|
fi# Your additional kubeconfig files should be inside ~/.kube/config-files
|
|
ADD_KUBECONFIG_FILES="$HOME/.kube/config-files"
|
|
mkdir -p "${ADD_KUBECONFIG_FILES}"OIFS="$IFS"
|
|
IFS=$'\n'
|
|
for kubeconfigFile in `find "${ADD_KUBECONFIG_FILES}" -type f -name "*.yml" -o -name "*.yaml"`
|
|
do
|
|
export KUBECONFIG="$kubeconfigFile:$KUBECONFIG"
|
|
done
|
|
IFS="$OIFS"
|
|
```
|
|
|
|
Another helpful tool that makes you changing and selecting the cluster context easier is
|
|
`kubectx`. You can download `kubectx` [here](https://github.com/ahmetb/kubectx).
|
|
|
|
:warning: The above script conflicts with kubectx, cause kubectx can only work with one
|
|
kubeconfig file listed in the `KUBECONFIG` env var. If you want to use both, add the following
|
|
lines to your rc file.
|
|
|
|
```bash
|
|
# now we merge all configs to one
|
|
kubectl config view --merge --flatten > $HOME/.kube/merged-config
|
|
export KUBECONFIG="$HOME/.kube/merged-config"
|
|
```
|
|
|
|
---
|
|
## Commands
|
|
|
|
### Networking
|
|
|
|
Connect containers using Kubernetes internal DNS system:
|
|
`<service-name>.<namespace>.svc.cluster.local`
|
|
|
|
Troubleshoot Networking with a netshoot toolkit Container:
|
|
`kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot -- /bin/bash`
|
|
|
|
### Containers
|
|
|
|
Restart Deployments (Stops and Restarts all Pods):
|
|
`kubectl scale deploy <deployment> --replicas=0`
|
|
`kubectl scale deploy <deployment> --replicas=1`
|
|
|
|
Executing Commands on Pods:
|
|
`kubectl exec -it <PODNAME> -- <COMMAND>`
|
|
`kubectl exec -it generic-pod -- /bin/bash`
|
|
|
|
### Config and Cluster Management
|
|
COMMAND | DESCRIPTION
|
|
---|---
|
|
`kubectl cluster-info` | Display endpoint information about the master and services in the cluster
|
|
`kubectl config view` |Get the configuration of the cluster
|
|
### Resource Management
|
|
COMMAND | DESCRIPTION
|
|
---|---
|
|
`kubectl get all --all-namespaces` | List all resources in the entire Cluster
|
|
`kubectl delete <RESOURCE> <RESOURCENAME> --grace-period=0 --force` | Try to force the deletion of the resource
|
|
|
|
---
|
|
## List of Kubernetes Resources "Short Names"
|
|
|
|
Short Name | Long Name
|
|
---|---
|
|
`csr`|`certificatesigningrequests`
|
|
`cs`|`componentstatuses`
|
|
`cm`|`configmaps`
|
|
`ds`|`daemonsets`
|
|
`deploy`|`deployments`
|
|
`ep`|`endpoints`
|
|
`ev`|`events`
|
|
`hpa`|`horizontalpodautoscalers`
|
|
`ing`|`ingresses`
|
|
`limits`|`limitranges`
|
|
`ns`|`namespaces`
|
|
`no`|`nodes`
|
|
`pvc`|`persistentvolumeclaims`
|
|
`pv`|`persistentvolumes`
|
|
`po`|`pods`
|
|
`pdb`|`poddisruptionbudgets`
|
|
`psp`|`podsecuritypolicies`
|
|
`rs`|`replicasets`
|
|
`rc`|`replicationcontrollers`
|
|
`quota`|`resourcequotas`
|
|
`sa`|`serviceaccounts`
|
|
`svc`|`services`
|
|
|
|
---
|
|
## 陼 Logs and Troubleshooting
|
|
...
|
|
|
|
### Logs
|
|
...
|
|
|
|
### MySQL
|
|
`kubectl run -it --rm --image=mysql:5.7 --restart=Never mysql-client -- mysql -u USERNAME -h HOSTNAME -p`
|
|
|
|
### Networking
|
|
`kubectl run -it --rm --image=nicolaka/netshoot netshoot -- /bin/bash`
|
|
|
|
---
|
|
## Resources stuck in Terminating state
|
|
...
|
|
|
|
```sh
|
|
(
|
|
NAMESPACE=longhorn-demo-1
|
|
kubectl proxy &
|
|
kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json
|
|
curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize
|
|
)
|
|
```
|
|
|