[toc]

1. kubectl 使用指南

kubectl 是 Kubernetes 自带的客户端,可以用它来直接操作 Kubernetes集群。Kubectl 的配置文件在$HOME/.kube 目录。我们可以通过设置 KUBECONFIG 环境变量或设置命令参数–kubeconfig 来指定其他位置的 kubeconfig 文件。

kubectl 并不需要 kubectl 安装在 K8S 集群的任何 Node 上,但是,需要确保安装 kubectl 的机器和 K8S 的集群能够进行网络互通。

从用户角度来说,kubectl 就是控制 Kubernetes 的驾驶舱,它允许你执行所有可能的 Kubernetes 操作;从技术角度来看,kubectl 就是 Kubernetes API 的一个客户端而已。

使用以下语法 kubectl 从终端窗口运行命令: kubectl [command] [TYPE] [NAME] [flags]

  • command:指定要对一个或多个资源执行的操作,例如 creategetdescribedelete
  • TYPE:指定**资源类型 **。资源类型不区分大小写,可以指定单数、复数或缩写形式。例如,以下命令输出相同的结果:
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1
  • NAME:指定资源的名称。名称区分大小写。如果省略名称,则显示所有资源的详细信息 kubectl get pods

  • flags: 指定可选的参数。例如,可以使用 -s-server 参数指定 Kubernetes API 服务器的地址和端口。

在对多个资源执行操作时,您可以按类型和名称指定每个资源,或指定一个或多个文件:

  • 要按类型和名称指定资源: kubectl get pod pod1
  • 要对所有类型相同的资源进行分组,请执行以下操作:TYPE name1 name2 。 例子:kubectl get pod example-pod1 example-pod2
  • 分别指定多个资源类型:TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE4/name4。 例子:kubectl get pod/example-pod1 replicationcontroller/example-rc1
  • 用一个或多个文件指定资源:-f file1 -f file2 -f file3
  • 使用 YAML 而不是 JSON 因为 YAML 更容易使用,特别是用于配置文件时。 例子:kubectl get -f pod.yaml

2. 简单部署

2.1 部署 Pod

通过 kubectl 部署 Pod 的办法分为两步:

  1. 准备 Pod 的 yaml 文件;

  2. 执行 kubectl 命令部署

2.1.1 pod 的yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: memory-demo
  namespace: mem-example
spec:
  containers:
  - name: memory-demo-ctr
    image: polinux/stress
    resources:
      limits:
        memory: "200Mi"
      requests:
        memory: "100Mi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
    volumeMounts:
    - name: redis-storage
      mountPath: /data/redis
  volumes:
  - name: redis-storage
    emptyDir: {}
  • apiVersion记录 K8S 的 API Server 版本,现在看到的都是v1,用户不用管。

  • kind记录该 yaml 的对象,比如这是一份 Pod 的 yaml 配置文件,那么值内容就是Pod

  • metadata记录了 Pod 自身的元数据,比如这个 Pod 的名字、这个 Pod 属于哪个 namespace

  • spec记录了 Pod 内部所有的资源的详细信息,看懂这个很重要:

    • containers记录了 Pod 内的容器信息,

      containers包括了:name容器名,image容器的镜像地址,resources容器需要的 CPU、内存、GPU 等资源,command容器的入口命令,args容器的入口参数,volumeMounts容器要挂载的 Pod 数据卷等。limits是 K8S 为该容器至多分配的资源配额;而requests则是 K8S 为该容器至少分配的资源配额

    • volumes记录了 Pod 内的数据卷信息,后文会详细介绍 Pod 的数据卷。

2.1.2 执行 kubectl 命令部署

有了 Pod 的 yaml 文件之后,就可以用 kubectl 部署了,命令非常简单:kubectl create -f ${POD_YAML}

img

2.2 部署 Deployment

2.2.1 Deployment 的 yaml 文件

apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
   name: rss-site
   namespace: mem-example
 spec:
   replicas: 2
   template:
     metadata:
       labels:
         app: web
     spec:
      containers:
       - name: memory-demo-ctr
         image: polinux/stress
         resources:
         limits:
           emory: "200Mi"
         requests:
           memory: "100Mi"
         command: ["stress"]
         args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
         volumeMounts:
         - name: redis-storage
           mountPath: /data/redis
     volumes:
     - name: redis-storage
       emptyDir: {}
  • metadata同 Pod 的 yaml,这里提一点:如果没有指明 namespace,那么就是用 kubectl 默认的 namespace(如果 kubectl 配置文件中没有指明 namespace,那么就是 default 空间)。

  • spec,可以看到 Deployment 的spec字段是在 Pod 的spec内容外“包了一层”,那就来看 Deployment 有哪些需要注意的:

    • replicas。副本个数。也就是该 Deployment 需要起多少个相同的 Pod,如果用户成功在 K8S 中配置了 n(n>1)个,那么 Deployment 会确保在集群中始终有 n 个服务在运行

    • template

      • metadata,新手同学先不管这边的信息。
      • spec,会发现这完完全全是上文提到的 Pod 的spec内容,在这里写明了 Deployment 下属管理的每个 Pod 的具体内容。

2.2.2 执行 kubectl 命令部署

Deployment 的部署办法同 Pod:kubectl create -f ${DEPLOYMENT_YAML}。由此可见,K8S 会根据配置文件中的kind字段来判断具体要创建的是什么资源

部署完 deployment 之后,可以查看到自动创建了 ReplicaSet 和 Pod

如下图所示:

img

从名字上可以看出,deployment和 replicaSet还有Pod三者的名字是一个累加的方式, 所以看pod的名称, 可以看到deployment和replicaSet的名字是什么

命令行工具 (kubectl) | Kubernetes

Kubernetes 入门&进阶实战 - 知乎 (zhihu.com)