[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
:指定要对一个或多个资源执行的操作,例如create
、get
、describe
、delete
。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 的办法分为两步:
准备 Pod 的 yaml 文件;
执行 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 属于哪个 namespacespec
记录了 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}
。
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,
如下图所示:
从名字上可以看出,deployment和 replicaSet还有Pod三者的名字是一个累加的方式, 所以看pod的名称, 可以看到deployment和replicaSet的名字是什么