要想掌握kubernetes,kubectl必须玩得溜

2023-05-11 00:00:00 集群 命令 指定 部署 信息

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:6443minikube

在kubernetes使用context在指定cluster和用户的组合,从而确定连接到哪个集群。在kubernetes中还有namespace的概念,这里展开讲一下,有助于理解。

Context(上下文)是用来确定当前连接的Kubernetes集群和用户的组合。它包含了以下信息:

  • 集群(cluster):指定连接的Kubernetes集群的配置,包括API服务器的地址和相关证书信息。

  • 用户(user):指定连接集群所使用的用户的认证凭证信息。

  • 命名空间(namespace):可选项,指定在连接集群时默认使用的命名空间。

上下文的作用是确定了与集群的连接和身份验证信息,以及默认使用的命名空间。使用不同的上下文可以连接到不同的Kubernetes集群,并使用不同的用户身份进行操作。

Namespace(命名空间)则是用来在一个Kubernetes集群中对资源进行逻辑隔离和组织的机制。它允许将不同的资源(如Pod、Service、Deployment等)划分到不同的命名空间中,以实现资源的隔离和管理。

命名空间的作用是提供资源的逻辑隔离和资源管理。不同的命名空间中的资源相互隔离,具有相同名称的资源在不同的命名空间中可以存在。命名空间提供了一种将资源组织起来的方式,便于管理和控制访问。

以本地的minikube部署的集群为例,以下是默认的context和namespace的信息,表示连接到minikube集群,用户名也是minikube。

- context:
    clusterminikube
    extensions:
    - extension:
        last-updateMon, 08 May 2023 20:47:13 CST
        providerminikube.sigs.k8s.io
        versionv1.29.0
      namecontext_info
    namespacedefault
    userminikube
  nameminikube

使用一下命令可以连接到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>是要删除的资源的类型,例如poddeploymentservice等,<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的功能非常强大,本文只列出了常用的一部分操作,更多功能可以参照官方的指南。

相关文章