kubernetes系列05—kubectl应用快速入门
1、使用kubectl
1.1 介绍
kubectl用于运行Kubernetes集群命令的管理工具。
1.2 语法
1
|
kubectl [ command ] [TYPE] [NAME] [flags] |
- command:指定要在一个或多个资源执行的操作,例如操作create,get,describe,delete。TYPE:指定资源类型Resource types。
- Name区分大小写,如果省略Name,则显示所有资源的详细信息,例如:$ kubectl get pods。
1.3 选项
Operation |
Description |
Syntax |
annotate |
为一个或多个资源添加注释 |
kubectl annotate (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags] |
api-versions |
列出支持的API版本。 |
kubectl api-versions [flags] |
apply |
对文件或stdin的资源进行配置更改。 |
kubectl apply -f FILENAME [flags] |
attach |
连接到一个运行的容器,既可以查看output stream,也可以与容器(stdin)进行交互。 |
kubectl attach POD -c CONTAINER [-i] [-t] [flags] |
autoscale |
自动扩容/缩容由replication controller管理的一组pod。 |
kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [flags] |
cluster-info |
显示有关集群中master和services的终端信息。 |
kubectl cluster-info [flags] |
config |
修改kubeconfig文件。有关详细信息,请参阅各个子命令。 |
kubectl config SUBCOMMAND [flags] |
create |
从file或stdin创建一个或多个资源。 |
kubectl create -f FILENAME [flags] |
delete |
从file,stdin或指定label 选择器,names,resource选择器或resources中删除resources。 |
kubectl delete (-f FILENAME | TYPE [NAME | /NAME | -l label | --all]) [flags] |
describe |
显示一个或多个resources的详细状态。 |
kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | /NAME | -l label]) [flags] |
edit |
使用默认编辑器编辑和更新服务器上一个或多个定义的资源。 |
kubectl edit (-f FILENAME | TYPE NAME | TYPE/NAME) [flags] |
exec |
对pod中的容器执行命令。 |
kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]] |
explain |
获取各种资源的文档。例如pod,node,services等 |
kubectl explain [--include-extended-apis=true] [--recursive=false] [flags] |
expose |
将 replication controller,service或pod作为一个新的Kubernetes service显示。 |
kubectl expose (-f FILENAME | TYPE NAME | TYPE/NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [----external-ip=external-ip-of-service] [--type=type] [flags] |
get |
列出一个或多个资源。 |
kubectl get (-f FILENAME | TYPE [NAME | /NAME | -l label]) [--watch] [--sort-by=FIELD] [[-o | --output]=OUTPUT_FORMAT] [flags] |
label |
添加或更新一个或多个资源的flags。 |
kubectl label (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags] |
logs |
在pod中打印容器的日志。 |
kubectl logs POD [-c CONTAINER] [--follow] [flags] |
patch |
使用strategic merge 补丁程序更新资源的一个或多个字段。 |
kubectl patch (-f FILENAME | TYPE NAME | TYPE/NAME) --patch PATCH [flags] |
port-forward |
将一个或多个本地端口转发到pod。 |
kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N] [flags] |
proxy |
在Kubernetes API服务器运行代理。 |
kubectl proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix] [flags] |
replace |
从file或stdin替换资源。 |
kubectl replace -f FILENAME |
rolling-update |
通过逐步替换指定的replication controller及其pod来执行滚动更新。 |
kubectl rolling-update OLD_CONTROLLER_NAME ([NEW_CONTROLLER_NAME] --image=NEW_CONTAINER_IMAGE | -f NEW_CONTROLLER_SPEC) [flags] |
run |
在集群上运行指定的镜像。 |
kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [flags] |
scale |
更新指定replication controller的大小。 |
kubectl scale (-f FILENAME | TYPE NAME | TYPE/NAME) --replicas=COUNT [--resource-version=version] [--current-replicas=count] [flags] |
stop |
已弃用 |
kubectl stop |
version |
显示客户端和服务器上运行的Kubernetes版本。 |
kubectl version [--client] [flags] |
1.4 示例演示
(1)简单的查询操作
查询节点详细信息
1
2
3
4
5
|
[root@master ~] # kubectl describe node node1 Name: node1 Roles: <none> Labels: beta.kubernetes.io /arch =amd64 ... ... |
查看版本
1
2
3
|
[root@master ~] # kubectl version Client Version: version.Info{Major: "1" , Minor: "11" , GitVersion: "v1.11.1" , GitCommit: "bb9ffb1654d4a729bb4cec18ff088eacc153c239" , GitTreeState: "clean" , BuildDate: "2018-08-07T23:17:28Z" , GoVersion: "go1.10.3" , Compiler: "gc" , Platform: "linux/amd64" } Server Version: version.Info{Major: "1" , Minor: "11" , GitVersion: "v1.11.1" , GitCommit: "b1b29978270dc22fecc592ac55d903350454310a" , GitTreeState: "clean" , BuildDate: "2018-07-17T18:43:26Z" , GoVersion: "go1.10.3" , Compiler: "gc" , Platform: "linux/amd64" } |
查看集群信息
1
2
3
|
[root@master ~] # kubectl cluster-info Kubernetes master is running at https: //192 .168.10.103:6443 KubeDNS is running at https: //192 .168.10.103:6443 /api/v1/namespaces/kube-system/services/kube-dns :dns /proxy |
2、run运行
2.1 介绍
创建并运行一个或多个容器镜像。
2.2 命令
1
|
$ kubectl run NAME --image=image [-- env = "key=value" ] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [-- command ] -- [COMMAND] [args...] [options] |
2.3 常用选项
- --port:要暴露的端口
- --replicas:期望创建几个Pod,默认1个
- --dry-run:true为干跑
2.4 演示
(1)运行一个nginx的pod
1
2
|
[root@master ~] # kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 deployment.apps /nginx-deploy created |
(2)在master上查询验证
1
2
3
4
5
6
7
8
9
|
[root@master ~] # kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deploy 1 1 1 1 44s [root@master ~] # kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deploy-5b595999-6kw54 1 /1 Running 0 51s [root@master ~] # kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deploy-5b595999-6kw54 1 /1 Running 0 1m 10.244.2.2 node2 |
(3)在部署的node节点上查询
1
2
3
|
[root@node2 ~] # ifconfig |head -2 cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 inet 10.244.2.1 netmask 255.255.255.0 broadcast 0.0.0.0 |
(4)访问pod内的nginx服务
1
2
3
4
5
|
[root@node1 ~] # curl 10.244.2.2 <!DOCTYPE html> <html> < head > <title>Welcome to nginx!< /title > |
3、delete删除
3.1 介绍
- 通过配置文件名、stdin、资源名称或label选择器来删除资源。
- 支持JSON和YAML格式文件。可以只指定一种类型的参数:文件名、资源名称或label选择器。
3.2 语法
1
|
$ kubectl delete ([-f FILENAME] | TYPE [(NAME | -l label | --all)]) |
3.3 演示
删除刚才的pod,立刻会生成一个新的pod,因为此pod是控制器管理的
1
2
3
4
5
6
7
8
|
[root@master ~] # kubectl delete pods nginx-deploy-5b595999-6kw54 pod "nginx-deploy-5b595999-6kw54" deleted [root@master ~] # kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deploy-5b595999-jf5gm 0 /1 ContainerCreating 0 16s [root@master ~] # kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deploy-5b595999-jf5gm 1 /1 Running 0 47s 10.244.1.2 node1 |
4、expose暴露
4.1 介绍
- 将资源暴露为新的Kubernetes Service。
- 指定deployment、service、replica set、replication controller或pod ,并使用该资源的选择器作为指定端口上新服务的选择器。deployment 或 replica set只有当其选择器可转换为service支持的选择器时,即当选择器仅包含matchLabels组件时才会作为暴露新的Service。
- 资源包括(不区分大小写):pod(po),service(svc),replication controller(rc),deployment(deploy),replica set(rs)
4.2 语法
1
|
$ kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [-- type = type ] |
4.3 常用选项
- --port:暴露在service上的端口
- --target-port:容器中的端口
4.4 演示
(1)将nginx-deploy控制器中相关的Pod资源创建一个名为nginx的服务
1
2
3
4
5
6
7
8
9
10
|
[root@master ~] # kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP service /nginx exposed [root@master ~] # kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443 /TCP 16h nginx ClusterIP 10.96.212.79 <none> 80 /TCP 9s [root@master ~] # kubectl get svc #简写 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443 /TCP 16h nginx ClusterIP 10.96.212.79 <none> 80 /TCP 13s |
(2)验证,在集群内部节点访问服务
1
2
3
4
5
|
[root@master ~] # curl 10.96.212.79 <!DOCTYPE html> <html> < head > <title>Welcome to nginx!< /title > |
(3)删除pod,立即生产新的pod,但是service还是不变,继续提供服务,只是指定到新的pod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
---删除pod [root@master ~] # kubectl delete pods nginx-deploy-5b595999-jf5gm ---立即生产新的pod,service继续提供服务 [root@master ~] # curl 10.96.212.79 <!DOCTYPE html> <html> < head > <title>Welcome to nginx!< /title > ---指定到新的pod [root@master ~] # kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deploy-5b595999-2z769 1 /1 Running 0 29m 10.244.1.2 node2 [root@master ~] # kubectl describe svc nginx Name: nginx Namespace: default Labels: run=nginx-deploy Annotations: <none> Selector: run=nginx-deploy Type: ClusterIP IP: 10.96.212.79 Port: < unset > 80 /TCP TargetPort: 80 /TCP Endpoints: 10.244.1.2:80 Session Affinity: None Events: <none> |
5、scale动态扩容/缩容
5.1 介绍
- 扩容或缩容 Deployment、ReplicaSet、Replication Controller或 Job 中Pod数量。
- scale也可以指定多个前提条件,如:当前副本数量或 --resource-version ,进行伸缩比例设置前,系统会先验证前提条件是否成立。
5.2 语法
1
|
$ kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME) |
5.3 演示
(1)先运行名为myapp标签选择器的2个pod,镜像是我用于测试演示自己构建的
1
2
3
4
5
6
7
8
9
|
[root@master ~] # kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2 deployment.apps /myapp created [root@master ~] # kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE myapp 2 2 2 2 6s [root@master ~] # kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE myapp-848b5b879b-58jcr 1 /1 Running 0 11s 10.244.2.53 node2 myapp-848b5b879b-wpx9v 1 /1 Running 0 11s 10.244.1.56 node1 |
(2)创建service,并验证
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@master ~] # kubectl expose deployment myapp --name=myapp --port=80 service /myapp exposed [root@master ~] # kubectl get svc myapp NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myapp ClusterIP 10.104.205.158 <none> 80 /TCP 8s [root@master ~] # curl 10.104.205.158 Hello MyApp | Version: v1 | <a href= "hostname.html" >Pod Name< /a > ---因为有2个pod,所以是随机调度 [root@master ~] # curl 10.104.205.158/hostname.html myapp-848b5b879b-58jcr [root@master ~] # curl 10.104.205.158/hostname.html myapp-848b5b879b-wpx9v |
(3)使用scale,将pod扩容到5个
1
2
3
4
5
6
7
8
9
|
[root@master ~] # kubectl scale --replicas=5 deployment myapp deployment.extensions /myapp scaled [root@master ~] # kubectl get pods NAME READY STATUS RESTARTS AGE myapp-848b5b879b-2sj8n 1 /1 Running 0 8s myapp-848b5b879b-58jcr 1 /1 Running 0 4m myapp-848b5b879b-hp7zs 1 /1 Running 0 8s myapp-848b5b879b-sfq8r 1 /1 Running 0 8s myapp-848b5b879b-wpx9v 1 /1 Running 0 4m |
(4)使用scale,将pod缩容到3个
1
2
3
4
5
6
|
[root@master ~] # kubectl scale --replicas=3 deployment myapp [root@master ~] # kubectl get pods NAME READY STATUS RESTARTS AGE myapp-848b5b879b-2sj8n 1 /1 Running 0 1m myapp-848b5b879b-58jcr 1 /1 Running 0 6m myapp-848b5b879b-wpx9v 1 /1 Running 0 6m |
6、set动态升级版本
6.1 介绍
(1)set
- 配置应用资源。
- 使用这些命令能帮你更改现有应用资源一些信息。
- 子命令:image、resources、selector、subject
(2)set image
- 更新现有的资源对象的容器镜像。
- 可使用资源对象包括(不区分大小写):pod (po)、replicationcontroller (rc)、deployment (deploy)、daemonset (ds)、job、replicaset (rs)
6.2 语法
1
|
$ kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N |
6.3 演示
将镜像版本从v1升级到v2版
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@master ~] # kubectl set image deployment myapp myapp=ikubernetes/myapp:v2 deployment.extensions /myapp image updated [root@master ~] # kubectl rollout status deployment myapp #动态显示版本升级过程 ---因为版本升级,所以pod都是新建的,名字都改变了 [root@master ~] # kubectl get pods NAME READY STATUS RESTARTS AGE client 1 /1 Running 0 3h myapp-74c94dcb8c-d5fgk 1 /1 Running 0 55s myapp-74c94dcb8c-f2ntn 1 /1 Running 0 21s myapp-74c94dcb8c-ht9v7 1 /1 Running 0 38s ---验证,版本升级成功 [root@master ~] # curl 10.104.205.158 Hello MyApp | Version: v2 | <a href= "hostname.html" >Pod Name< /a > |
7、rollout undo回滚版本
7.1 介绍
(1)rollout
- 对资源进行管理
- 可用资源包括:deployments、daemonsets
- 子命令:history(查看历史版本)、pause(暂停资源)、resume(恢复暂停资源)、status(查看资源状态)、undo(回滚版本)
(2)rollout undo
回滚pod到之前的版本。
7.2 语法
1
|
$ kubectl rollout undo (TYPE NAME | TYPE /NAME ) [flags] |
7.3 演示
1
2
3
4
5
6
7
8
9
10
|
[root@master ~] # kubectl rollout undo deployment myapp deployment.extensions /myapp [root@master ~] # kubectl get pods NAME READY STATUS RESTARTS AGE myapp-848b5b879b-gg9lr 1 /1 Running 0 15s myapp-848b5b879b-km4t6 1 /1 Running 0 16s myapp-848b5b879b-nq98c 1 /1 Running 0 17s ---验证,回滚成功 [root@master ~] # curl 10.104.205.158 Hello MyApp | Version: v1 | <a href= "hostname.html" >Pod Name< /a > |
8、edit编辑修改
8.1 介绍
- 使用默认编辑器,编辑服务器上定义的资源。
- 使用命令行工具获取的任何资源都可以使用edit命令编辑。edit命令会打开使用KUBE_EDITOR,GIT_EDITOR 或者EDITOR环境变量定义的编辑器,可以同时编辑多个资源,但所编辑过的资源只会一次性提交。edit除命令参数外还接受文件名形式。
- 文件默认输出格式为YAML。要以JSON格式编辑,请指定“-o json”选项。
- 如果在更新资源时报错,将会在磁盘上创建一个临时文件来记录。在更新资源时最常见的错误是几个用户同时使用编辑器更改服务器上资源,发生这种情况,你需要将你的更改应用到最新版本的资源上,或者更新保存的临时副本。
8.2 语法
1
|
$ kubectl edit (RESOURCE /NAME | -f FILENAME) |
8.3 演示
(1)修改service,将类型type: ClusterIP,修改为type: NodePort;修改后,可以在集群外访问到pod中的服务
1
2
3
4
5
6
7
8
9
10
|
[root@master ~] # kubectl edit svc myapp ... ... spec: ... ... type : NodePort ... ... service /myapp edited [root@master ~] # kubectl get svc myapp NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myapp NodePort 10.104.205.158 <none> 80:31599 /TCP 23m |
(2)在集群外的主机上访问了
9、label标签
9.1 介绍
更新(增加、修改或删除)资源上的 label(标签)。
- label 必须以字母或数字开头,可以使用字母、数字、连字符、点和下划线,最长63个字符。
- 如果--overwrite 为 true,则可以覆盖已有的 label,否则尝试覆盖 label 将会报错。
- 如果指定了--resource-version,则更新将使用此资源版本,否则将使用现有的资源版本。
9.2 语法
1
|
$ kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version] |
9.3 演示
(1)运行一个标签为app=nginx的pod
1
2
|
[root@master ~] # kubectl run nginx --image=nginx:1.14-alpine --replicas=1 --labels="app=nginx" deployment.apps /nginx created |
(2)-l 指定标签,实现标签过滤
1
2
3
4
5
6
7
8
9
|
[root@master ~] # kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS myapp-848b5b879b-5blnx 1 /1 Running 0 4m pod-template- hash =4046164356,run=myapp myapp-848b5b879b-6hgpp 1 /1 Running 0 4m pod-template- hash =4046164356,run=myapp myapp-848b5b879b-hzj5g 1 /1 Running 0 4m pod-template- hash =4046164356,run=myapp nginx-86d5b5ddb6-rwv2z 1 /1 Running 0 53s app=nginx,pod-template- hash =4281618862 [root@master ~] # kubectl get pods --show-labels -l app NAME READY STATUS RESTARTS AGE LABELS nginx-86d5b5ddb6-rwv2z 1 /1 Running 0 1m app=nginx,pod-template- hash =4281618862 |
(3)打一个新的标签
1
2
3
4
5
|
[root@master ~] # kubectl label pods nginx-86d5b5ddb6-rwv2z release=canary pod /nginx-86d5b5ddb6-rwv2z labeled [root@master ~] # kubectl get pods --show-labels -l release NAME READY STATUS RESTARTS AGE LABELS nginx-86d5b5ddb6-rwv2z 1 /1 Running 0 4m app=nginx,pod-template- hash =4281618862,release=canary |
(4)修改标签
1
2
3
4
5
|
[root@master ~] # kubectl label pods nginx-86d5b5ddb6-rwv2z release=stable --overwrite pod /nginx-86d5b5ddb6-rwv2z labeled [root@master ~] # kubectl get pods --show-labels -l release NAME READY STATUS RESTARTS AGE LABELS nginx-86d5b5ddb6-rwv2z 1 /1 Running 0 5m app=nginx,pod-template- hash =4281618862,release=stable |
9.4 标签选择器
(1)等值关系:=,==,!=
1
2
3
4
5
6
7
8
9
10
11
|
[root@master ~] # kubectl get pods -l release --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-86d5b5ddb6-rwv2z 1 /1 Running 0 6m app=nginx,pod-template- hash =4281618862,release=stable [root@master ~] # kubectl get pods -l release=stable --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-86d5b5ddb6-rwv2z 1 /1 Running 0 6m app=nginx,pod-template- hash =4281618862,release=stable [root@master ~] # kubectl get pods -l release!=stable --show-labels NAME READY STATUS RESTARTS AGE LABELS myapp-848b5b879b-5blnx 1 /1 Running 0 10m pod-template- hash =4046164356,run=myapp myapp-848b5b879b-6hgpp 1 /1 Running 0 10m pod-template- hash =4046164356,run=myapp myapp-848b5b879b-hzj5g 1 /1 Running 0 10m pod-template- hash =4046164356,run=myapp |
(2)集合关系
- KEY in (VALUE1,VALUE2,...):集合中存在此健
- KEY notin (VALUE1,VALUE2,...):集合中不存在此健
- KEY:存在此健
- !KEY:不存在此健
1
2
3
4
5
6
7
8
|
[root@master ~] # kubectl get pods -l "release in (stable,beta,alpha)" NAME READY STATUS RESTARTS AGE nginx-86d5b5ddb6-rwv2z 1 /1 Running 0 9m [root@master ~] # kubectl get pods -l "release notin (stable,beta,alpha)" NAME READY STATUS RESTARTS AGE myapp-848b5b879b-5blnx 1 /1 Running 0 12m myapp-848b5b879b-6hgpp 1 /1 Running 0 12m myapp-848b5b879b-hzj5g 1 /1 Running 0 12m |