kubectl是一个命令行工具,用于与Kubernetes集群进行交互。它可以用于部署应用程序、管理容器、查看集群资源状态等。
要想熟练使用kubernetes,掌握kubectl的用法必不可少。本文列举一些kubectl的常见用法,以期学习以后能够熟练使用kubernetes。
一、kubectl的安装
基于Centos系统,x86架构,使用以下命令下载kubectl
[k8s@node1 ~]$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
如需下载某个指定的版本,请用指定版本号替换该命令的这一部分: $(curl -L -s https://dl.k8s.io/release/stable.txt)
,例如替换为1.27.1。
下载验证文件:
[k8s@node1 ~]$ curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
对下载的软件进行验证:
[k8s@node1 ~]$ echo "$(cat kubectl.sha256) kubectl" | sha256sum --check
kubectl: OK
安装Kubectl
[k8s@node1 ~]$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
验证安装是否成功
[k8s@node1 ~]$ kubectl version --client
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short. Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"27", GitVersion:"v1.27.1", GitCommit:"4c9411232e10168d7b050c49a1b59f6df9d7ea4b", GitTreeState:"clean", BuildDate:"2023-04-14T13:21:19Z", GoVersion:"go1.20.3", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v5.0.1
二、kubectl的配置
kubectl会读取配置信息,一般配置在 $HOME/.kube
目录下一个名为 config
的配置文件,也可以通过设置 KUBECONFIG
环境变量或设置 --kubeconfig
来指定新的配置文件。
单机部署默认的配置文件内容如下:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: xxxxxxxxxxx=(内容太长了,这里简略)
server: https://api.crc.testing:6443
name: api-crc-testing:6443
- cluster:
certificate-authority: /home/k8s/.minikube/ca.crt
extensions:
- extension:
last-update: Mon, 08 May 2023 20:47:13 CST
provider: minikube.sigs.k8s.io
version: v1.29.0
name: cluster_info
server: https://192.168.49.2:8443
name: minikube
contexts:
- context:
cluster: api-crc-testing:6443
namespace: default
user: kubeadmin
name: crc-admin
- context:
cluster: api-crc-testing:6443
namespace: default
user: developer
name: crc-developer
- context:
cluster: minikube
extensions:
- extension:
last-update: Mon, 08 May 2023 20:47:13 CST
provider: minikube.sigs.k8s.io
version: v1.29.0
name: context_info
namespace: default
user: minikube
name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: developer
user:
token: sha256~1Ou45NGf93f0wxOHwTdxRXbUQUS2KIY8muAWG7uqD8M
- name: kubeadmin
user:
token: sha256~TqzvApNboymi9QfgGI8bEzOEiE2h6ZA3ixenkJD67UI
- name: minikube
user:
client-certificate: /home/k8s/.minikube/profiles/minikube/client.crt
client-key: /home/k8s/.minikube/profiles/minikube/client.key
配置文件中列出了集群的相关信息,包括集群地址、证书、用户信息、context信息等,若要修改相关的信息可以修改此文件,注意做好备份。
如果要查看当前的kubectl配置,可以使用以下命令:
[k8s@node1 ~]$ kubectl config view
三、kubectl连接集群
kubectl通过kubeconfig来确定连接的集群的信息,在kubeconfig文件中,使用clusters
字段添加集群配置,每个集群配置需要包括集群的名称、API服务器的地址和相关证书信息,如:
clusters:
- cluster:
certificate-authority-data: xxxxxxxxxxx=(内容太长了,这里简略)
server: https://api.crc.testing:6443
name: api-crc-testing:6443
- cluster:
certificate-authority: /home/k8s/.minikube/ca.crt
extensions:
- extension:
last-update: Mon, 08 May 2023 20:47:13 CST
provider: minikube.sigs.k8s.io
version: v1.29.0
name: cluster_info
server: https://192.168.49.2:8443
name: minikube
可以看到默认使用minikube安装以后有两个cluster,分别是api-crc-testing:6443
和minikube
。
在kubernetes使用context在指定cluster和用户的组合,从而确定连接到哪个集群。在kubernetes中还有namespace的概念,这里展开讲一下,有助于理解。
Context(上下文)是用来确定当前连接的Kubernetes集群和用户的组合。它包含了以下信息:
集群(cluster):指定连接的Kubernetes集群的配置,包括API服务器的地址和相关证书信息。
用户(user):指定连接集群所使用的用户的认证凭证信息。
命名空间(namespace):可选项,指定在连接集群时默认使用的命名空间。
上下文的作用是确定了与集群的连接和身份验证信息,以及默认使用的命名空间。使用不同的上下文可以连接到不同的Kubernetes集群,并使用不同的用户身份进行操作。
Namespace(命名空间)则是用来在一个Kubernetes集群中对资源进行逻辑隔离和组织的机制。它允许将不同的资源(如Pod、Service、Deployment等)划分到不同的命名空间中,以实现资源的隔离和管理。
命名空间的作用是提供资源的逻辑隔离和资源管理。不同的命名空间中的资源相互隔离,具有相同名称的资源在不同的命名空间中可以存在。命名空间提供了一种将资源组织起来的方式,便于管理和控制访问。
以本地的minikube部署的集群为例,以下是默认的context和namespace的信息,表示连接到minikube集群,用户名也是minikube。
- context:
cluster: minikube
extensions:
- extension:
last-update: Mon, 08 May 2023 20:47:13 CST
provider: minikube.sigs.k8s.io
version: v1.29.0
name: context_info
namespace: default
user: minikube
name: minikube
使用一下命令可以连接到Kubernetes集群:
kubectl config use-context <context-name>
其中,<context-name>
是已经存在的Kubernetes集群的名称,以上面列出来的配置为例,集群中有一个context为minikube,只用相关信息后提示如下
[k8s@node1 ~]$ kubectl config use-context minikube
Switched to context "minikube".
使用以下命令可以查看集群的信息:
[k8s@node1 ~]$ kubectl cluster-info
Kubernetes control plane is running at https://192.168.49.2:8443
CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
使用以下命令获取所有的namespace
[k8s@node1 ~]$ kubectl get namespace
NAME STATUS AGE
default Active 11m
kube-node-lease Active 11m
kube-public Active 11m
kube-system Active 11m
使用以下命令获取所有的context
[k8s@node1 ~]$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
crc-admin api-crc-testing:6443 kubeadmin default
crc-developer api-crc-testing:6443 developer default
* minikube minikube minikube default
四、应用程序部署和调试
部署应用程序:使用以下命令可以创建deployment,在Kubernetes集群上部署应用程序
$ kubectl create deployment <deployment-name> --image=<image-name>
其中,<deployment-name>
是要创建的部署的名称,<image-name>
是要使用的容器映像的名称。
kubectl还提供了apply
通过定义kubernetes资源文件的方式来管理应用,所以还可以提供kubectl apply
的方式来进行pod部署,例如:
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep
spec:
containers:
- name: busybox
image: busybox:1.28
args:
- sleep
- "1000000"
EOF
调试应用程序:部署完成以后可以使用以下命令进行调试验证
kubectl describe pod <pod-name>
kubectl logs <pod-name>
个命令可以获取指定Pod的详细信息,例如事件、容器状态、容器日志等。第二个命令可以查看指定Pod的日志。
将指定的部署公开为一个服务
$ kubectl expose deployment <deployment-name> --port=<port-number> --type=LoadBalancer
在指定Pod中打开一个交互式终端,可以连接到pod
$ kubectl exec -it <pod-name> -- /bin/bash
也可以使用attch挂接到某个容器中
$ kubectl attach my-pod -i
五、查看和查找资源
查看所有的node信息,列出了状态、角色等重点信息。
[k8s@node1 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 46h v1.23.8
查看Pod列表
$ kubectl get pods
查看所有的deployments
$ kubectl get deployments
查看某个deployment
$ kubectl get deployment my-dep
获取Kubernetes集群中所有服务的列表
$ kubectl get services
创建配置configmap,以下命令创建一个名为<config-name>
的配置项,其中包含一个键值对。
$ kubectl create configmap <config-name> --from-literal=<key>=<value>
以下命令可以获取Kubernetes集群中所有配置项的列表。
$ kubectl get configmaps
列举出所有的pv持久卷
$ kubectl get pv
六、容器和资源管理
集群扩缩容
$ kubectl scale deployment <deployment-name> --replicas=<number-of-replicas>
其中,<deployment-name>
是要扩缩容的部署的名称,<number-of-replicas>
是要设置的副本数量。
升级应用程序
$ kubectl set image deployment/<deployment-name> <container-name>=<new-image>
其中,<deployment-name>
是要升级的部署的名称,<container-name>
是要升级的容器的名称,<new-image>
是要使用的新容器映像的名称。
回滚应用程序到上一个版本
$ kubectl rollout undo deployment/frontend
回滚到特定版本
$ kubectl rollout undo deployment/frontend --to-revision=4
删除指定的资源
$ kubectl delete <resource-type> <resource-name>
其中,<resource-type>
是要删除的资源的类型,例如pod
、deployment
、service
等,<resource-name>
是要删除的资源的名称。
七、使用技巧
1、在bash shell中实现命令自动补全
需要先安装bash-completion包
[k8s@node1 root]$ sudo yum install bash-completion
在终端执行以下命令:
[k8s@node1 ~]$ echo "source <(kubectl completion bash)" >> ~/.bashrc
[k8s@node1 ~]$ source ~/.bashrc
还可以为kubectl设置一个别名,例如设置为'k'
[k8s@node1 ~]$ alias k=kubectl
[k8s@node1 ~]$ complete -o default -F __start_kubectl k
验证是否生效,使用k
别名获取contexts
[k8s@node1 ~]$ k config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
crc-admin api-crc-testing:6443 kubeadmin default
crc-developer api-crc-testing:6443 developer default
* minikube minikube minikube default
2、控制输出的日志的详细程度
Kubectl 日志输出详细程度是通过 -v
或者 --v
来控制的,参数后跟一个数字表示日志的级别。
如果在操作过程中有失败的情况,为了定位原则,可以设置--v=5,代表跟踪级别的详细日志信息。
kubectl的功能非常强大,本文只列出了常用的一部分操作,更多功能可以参照官方的指南。