架构班的小伙伴作业看这里哦:(学习杰哥视频的作业第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可参考以上两种类型及官方文档进行配置,相关官方文档会在文末给出。