2020-10-13 架构师第16周作业

架构班的小伙伴作业看这里哦:(学习杰哥视频的作业第31-32天)

1、总结描述kubectl常用命令并用实例说明。

1. help 帮助信息

# kubectl --help

kubectl controls the Kubernetes cluster manager.

Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/

Basic Commands (Beginner):

  create        Create a resource from a file or from stdin.

  expose        使用 replication controller, service, deployment 或者 pod 并暴露它作为一个新的Kubernetes Service

  run            在集群中运行一个指定的镜像

  set            为 objects 设置一个指定的特征

Basic Commands (Intermediate):

  explain        查看资源的文档

  get            显示一个或更多 resources

  edit          在服务器上编辑一个资源

  delete        Delete resources by filenames, stdin, resources and names, or by resources and label selector

Deploy Commands:

  rollout        Manage the rollout of a resource

  scale          为 Deployment, ReplicaSet, Replication Controller 或者 Job 设置一个新的副本数量

  autoscale      自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量

Cluster Management Commands:

  certificate    修改 certificate 资源.

  cluster-info  显示集群信息

  top            Display Resource (CPU/Memory/Storage) usage.

  cordon        标记 node 为 unschedulable

  uncordon      标记 node 为 schedulable

  drain          Drain node in preparation for maintenance

  taint          更新一个或者多个 node 上的 taints

Troubleshooting and Debugging Commands:

  describe      显示一个指定 resource 或者 group 的 resources 详情

  logs          输出容器在 pod 中的日志

  attach        Attach 到一个运行中的 container

  exec          在一个 container 中执行一个命令

  port-forward  Forward one or more local ports to a pod

  proxy          运行一个 proxy 到 Kubernetes API server

  cp            复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.

  auth          Inspect authorization

Advanced Commands:

  diff          Diff live version against would-be applied version

  apply          通过文件名或标准输入流(stdin)对资源进行配置

  patch          使用 strategic merge patch 更新一个资源的 field(s)

  replace        通过 filename 或者 stdin替换一个资源

  wait          Experimental: Wait for a specific condition on one or many resources.

  convert        在不同的 API versions 转换配置文件

Settings Commands:

  label          更新在这个资源上的 labels

  annotate      更新一个资源的注解

  completion    Output shell completion code for the specified shell (bash or zsh)

Other Commands:

  api-resources  Print the supported API resources on the server

  api-versions  Print the supported API versions on the server, in the form of "group/version"

  config        修改 kubeconfig 文件

  plugin        Provides utilities for interacting with plugins.

  version        输出 client 和 server 的版本信息

Usage:

  kubectl [flags] [options]

Use "kubectl --help" for more information about a given command.Use "kubectl options" for a list of global command-line options (applies to all commands).

2. kubect create 创建一个资源从一个文件或标准输入

# kubectl create deployment nginx --image=nginx:1.14

# kubectl create -f my-nginx.yaml

3. kubectl run 在集群中运行一个指定的镜像

# kubectl run nginx --image=nginx:1.16 --port=80 --replicas=1

4. kubectl expose 创建Service对象以将应用程序"暴露"于网络中

# kubectl expose deployment/nginx  --type="NodePort" --port=80 --name=nginx

5.kubectl get 显示一个或更多resources资源

# kubectl get cs                            # 查看集群状态

# kubectl get nodes                      # 查看集群节点信息

# kubectl get ns                            # 查看集群命名空间

# kubectl get svc -n kube-system               # 查看指定命名空间的服务

# kubectl get pod -o wide      # 查看Pod详细信息

# kubectl get pod -o yaml      # 以yaml格式查看Pod详细信息

# kubectl get pods                        # 查看资源对象,查看所有Pod列表

# kubectl get rc,service                  # 查看资源对象,查看rc和service列表

# kubectl get pod,svc,ep --show-labels    # 查看pod,svc,ep能及标签信息

# kubectl get all --all-namespaces           # 查看所有的命名空间

6.kubectl clster-info 显示集群信息

# kubectl cluster-info            # 查看集群状态信息

7. kubectl describe 描述资源对象

# kubectl describe nodes   # 显示Node的详细信息

# kubectl describe pods/    # 显示Pod的详细信息

8.kubectl scale pod扩容与缩容

# kubectl scale deployment nginx --replicas 5    # 扩容

# kubectl scale deployment nginx --replicas 3    # 缩容

9.查看服务器上支持的API资源

# kubectl api-resources


2、总结k8s的常见的volume使用。

2.1 背景

       存储资源在所有计算资源中扮演着十分重要的角色,大部分业务场景下都有可能使用到各类存储资源。在Kubernetes中,系统通过Volume对集群中的容器动态或静态提供存储资源。通常情况下,我们可以认为容器或者Pod的生命周期时短暂的,当容器被销毁时,容器内部的数据也同时被清除。为了持久化保存容器的数据,Kubernetes引入了Volume,类似于Docker的Volume(Docker also has a concept of volumes, though it is somewhat looser and less managed. In Docker, a volume is simply a directory on disk or in another Container. Lifetimes are not managed and until very recently there were only local-disk-backed volumes. Docker now provides volume drivers, but the functionality is very limited for now)。这个Volume被某个Pod挂载之后,这个Pod里面的所有容器都能使用这个Volume。Kubernetes目前支持的volume类型可以参考文末官方资料。

2.2 两种Volume使用举例

2.2.1 emptyDir:

(1) emptyDir是最基础的Volume类型。每个emptyDir Volume是主机上的一个空目录,可以被Pod中所有的容器共享。它对于容器来说是持久的,对于Pod则不是。删除容器并不会对它造成影响,只有删除整个Pod时,它才会被删除,它的生命周期与所挂载的Pod一致。简而言之,emptyDir类型的Volume在Pod分配到Node上时被创建,Kubernetes会在Node主机上自动分配一个目录,因此无需指定Node主机上对应的目录文件。 这个目录的初始内容为空,当Pod从Node上移除时,emptyDir中的数据会被永久删除。emptyDir主要用于一些无需永久保留的数据,例如临时目录,多容器共享目录等。我们通过实际案例来理解一下,Pod gysl的yaml如下:

apiVersion: v1

kind: Pod

metadata:

  name: gysl

spec:

  containers:

  - image: busybox

    name: gysl-01

    volumeMounts:

    - mountPath: /gysl-01

      name: gysl-volume

    args:

    - /bin/sh

    - -c

    - echo "This is a test file.">/gysl-01/test.gysl;sleep 20000


  - image: busybox

    name: gysl-02

    volumeMounts:

    - mountPath: /gysl-02

      name: gysl-volume

    args:

    - /bin/sh

    - -c

    - cat /gysl-02/test.gysl;sleep 20000


  volumes:

  - name: gysl-volume

    emptyDir: {}

(2) 创建Pod gysl,并查看相关信息:

[root@k8s-m k8s-volumes]# kubectl apply -f emptyDir.yaml

pod/gysl created

[root@k8s-m k8s-volumes]# kubectl get pod

NAME   READY   STATUS    RESTARTS   AGE

gysl   2/2     Running   0          10m

[root@k8s-m k8s-volumes]# kubectl logs gysl gysl-02

This is a test file.

该例中,我们创建了一个名为gysl的Pod,这个pod里面包含gysl-01和gysl-02两个容器,这两个容器同时挂载了名为gysl-volume的emptyDir,gysl-01的挂载点为/gysl-01,gysl-02的挂载点为gysl-02,容器gysl-01创建了一个test.gysl的文件,内容为:“This is a test file.”在容器gysl-02中,成功显示了gysl-01创建的文件的内容。

2.2.2  hostPath

(1) hostPath: hostPath的主要作用是将主机的文件或目录挂载给Pod的容器使用,使得容器能以较为良好的性能来存储数据。接下来我们以Pod gysl-hostpath为例来理解一下hostPath的相关概念,YAML文件如下:

apiVersion: v1

kind: Pod

metadata:

  name: gysl-hostpath

spec:

  nodeSelector:

    role: test

  containers:

  - image: ubuntu:18.04

    name: gysl-hostpath-container

    volumeMounts:

    - mountPath: /etc/gysl-test-01

      name: gysl-02

    - mountPath: /etc/gysl-test-02

      name: gysl-01

    - mountPath: /gysl-test-dir

      name: gysl-dir

    args:

    - /bin/bash

    - -c

    - cat /etc/gysl-test-01 /etc/gysl-test-02;ls -l /gysl-test-dir;sleep 3600

  volumes:

  - hostPath:

      path: /root/gysl-01

    name: gysl-01

  - hostPath:

      path: /root/gysl-02

    name: gysl-02

  - hostPath:

      path: /root/gysl-dir

    name: gysl-dir

(2) 在Node k8s-n1的/root目录下创建如下文件和目录:

[root@k8s-n1 ~]# ll

总用量 8

-rw-r--r-- 1 root root 16 11月 21 20:31 gysl-01

-rw-r--r-- 1 root root 16 11月 21 20:31 gysl-02

drwxr-xr-x 2 root root 51 11月 21 20:32 gysl-dir

(3) 两个文件的内容如下:

[root@k8s-n1 ~]# cat gysl-01

This is gysl-01

[root@k8s-n1 ~]# cat gysl-02

This is gysl-02

(4) 目录gysl-dir的内容如下:

[root@k8s-n1 ~]# ll gysl-dir/

总用量 12

-rw-r--r-- 1 root root 16 11月 21 20:32 gysl-01

-rw-r--r-- 1 root root 16 11月 21 20:32 gysl-02

-rw-r--r-- 1 root root 16 11月 21 20:32 gysl-03

(5) 给Node k8s-n1指定一个标签,apply 该Pod:

[root@k8s-m k8s-Volumes]# kubectl label node k8s-n1 role=test

node/k8s-n1 labeled

[root@k8s-m k8s-Volumes]# kubectl apply -f hostPath.yaml

pod/gysl-hostpath created

[root@k8s-m k8s-Volumes]# kubectl get pod -o wide

NAME            READY  STATUS    RESTARTS  AGE  IP            NODE    NOMINATED NODE

gysl-hostpath  1/1    Running  0          17s  10.244.1.177  k8s-n1 

[root@k8s-m k8s-Volumes]# kubectl logs gysl-hostpath

This is gysl-02

This is gysl-01

total 12

-rw-r--r-- 1 root root 16 Nov 21 12:32 gysl-01

-rw-r--r-- 1 root root 16 Nov 21 12:32 gysl-02

-rw-r--r-- 1 root root 16 Nov 21 12:32 gysl-03

这个例子中,我把名为gysl-02的hostPath文件挂载到了容器的文件/etc/gysl-test-01上,把名为gysl-01的hostPath文件挂载到了容器的文件/etc/gysl-test-02上,把名为gysl-dir的hostPath目录挂载到了/gysl-test-dir下。通过logs命令,我们不难发现,目标已经达成。

这种挂载方式比emptyDir更为持久,除非所在Node发生故障。不过,除了挂载一些配置文件/二进制文件之外,一般不采用该类挂载方式,因为这样的挂载操作增加了Pod文件与Node主机文件的耦合,不利于统一管理。

2.3 总结

2.3.1 在volume的配置过程中,涉及到具体挂载路径的需要按照一定的规则来配置。例如:文件或目录需要写绝对路径。不按照规则来配置,会出现以下报错:

Warning  Failed    8s (x3 over 20s)  kubelet, k8s-n1    Error: Error response from daemon: create ~/gysl: "~/gysl-dir" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path

2.3.2 emptyDir和hostPath都是比较常见的两种类型的volume,在使用时需要根据具体情况进行配置。其他类型的volume可参考以上两种类型及官方文档进行配置,相关官方文档会在文末给出。

你可能感兴趣的:(2020-10-13 架构师第16周作业)