youki2008
作者youki20082020-06-29 15:00
系统架构师, DDT

kubernetes系列05—kubectl应用快速入门

字数 14505阅读 1111评论 0赞 2

kubernetes系列05—kubectl应用快速入门

1、使用kubectl

1.1 介绍

kubectl 用于运行 Kubernetes 集群命令的管理工具。

1.2 语法

kubectl [command] [TYPE] [NAME] [flags]

  • command :指定要在一个或多个资源执行的操作,例如操作 create , get , describe , delete 。 TYPE :指定资源类型 Resource types 。
  • Name 区分大小写,如果省略 Name ,则显示所有资源的详细信息,例如: $ kubectl get pods 。

1.3 选项

OperationDescriptionSyntax
annotate为一个或多个资源添加注释kubectl annotate (-f FILENAMETYPE NAMETYPE/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 FILENAMETYPE NAMETYPE/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 FILENAMETYPE [NAME/NAME-l label--all]) [flags]
describe显示一个或多个resources的详细状态。kubectl describe (-f FILENAMETYPE [NAME_PREFIX/NAME-l label]) [flags]
edit使用默认编辑器编辑和更新服务器上一个或多个定义的资源。kubectl edit (-f FILENAMETYPE NAMETYPE/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 FILENAMETYPE NAMETYPE/NAME) [--port=port] [--protocol=TCPUDP] [--target-port=number-or-name] [--name=name] [----external-ip=external-ip-of-service] [--type=type] [flags]
get列出一个或多个资源。kubectl get (-f FILENAMETYPE [NAME/NAME-l label]) [--watch] [--sort-by=FIELD] [[-o--output]=OUTPUT_FORMAT] [flags]
label添加或更新一个或多个资源的flags。kubectl label (-f FILENAMETYPE NAMETYPE/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 FILENAMETYPE NAMETYPE/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 FILENAMETYPE NAMETYPE/NAME) --replicas=COUNT [--resource-version=version] [--current-replicas=count] [flags]
stop已弃用kubectl stop
version显示客户端和服务器上运行的Kubernetes版本。kubectl version [--client] [flags]

1.4 示例演示

( 1 )简单的查询操作

查询节点详细信息

[root@master ~]# kubectl describe node node1

Name: node1
Roles:
Labels: beta.kubernetes.io/arch=amd64
... ...

查看版本
[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"}

[root@master ~]# kubectl versio
查看集群信息
[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 命令

$ 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

[root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1
deployment.apps/nginx-deploy created

( 2 )在 master 上查询验证

[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 节点上查询

[root@node2 ~]# ifconfig |head -2

cni0: flags=4163 mtu 1450
inet 10.244.2.1 netmask 255.255.255.0 broadcast 0.0.0.0

( 4 )访问 pod 内的 nginx 服务

[root@node1 ~]# curl 10.244.2.2

3、delete删除

3.1 介绍

  • 通过配置文件名、 stdin 、资源名称或 label 选择器来删除资源。
  • 支持 JSON 和 YAML 格式文件。可以只指定一种类型的参数:文件名、资源名称或 label 选择器。

3.2 语法

$ kubectl delete ([-f FILENAME] | TYPE [(NAME | -l label | --all)])

3.3 演示

删除刚才的 pod ,立刻会生成一个新的 pod ,因为此 pod 是控制器管理的

[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 语法

$ 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 的服务

[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 443/TCP 16h
nginx ClusterIP 10.96.212.79 80/TCP 9s

[root@master ~]# kubectl get svc #简写

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 16h
nginx ClusterIP 10.96.212.79 80/TCP 13s

( 2 )验证,在集群内部节点访问服务

[root@master ~]# curl 10.96.212.79

( 3 )删除 pod ,立即生产新的 pod ,但是 service 还是不变,继续提供服务,只是指定到新的 pod

---删除pod

[root@master ~]# kubectl delete pods nginx-deploy-5b595999-jf5gm

---立即生产新的pod,service继续提供服务

[root@master ~]# curl 10.96.212.79

---指定到新的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:
Selector: run=nginx-deploy
Type: ClusterIP
IP: 10.96.212.79
Port: 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.2:80
Session Affinity: None
Events:

5、scale动态扩容/缩容

5.1 介绍

  • 扩容或缩容 Deployment 、 ReplicaSet 、 Replication Controller 或 Job 中 Pod 数量。
  • scale 也可以指定多个前提条件,如:当前副本数量或 --resource-version ,进行伸缩比例设置前,系统会先验证前提条件是否成立。

5.2 语法

$ kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)

5.3 演示

( 1 )先运行名为 myapp 标签选择器的 2 个 pod ,镜像是我用于测试演示自己构建的

[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 ,并验证

[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 80/TCP 8s

[root@master ~]# curl 10.104.205.158

Hello MyApp | Version: v1 | Pod Name
---因为有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 个

[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 个

[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 语法

$ kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N

6.3 演示

将镜像版本从 v1 升级到 v2 版

[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 | Pod Name

7、rollout undo回滚版本

7.1 介绍

( 1 ) rollout

  • 对资源进行管理
  • 可用资源包括: deployments 、 daemonsets
  • 子命令: history (查看历史版本) 、 pause (暂停资源) 、 resume (恢复暂停资源) 、 status (查看资源状态) 、 undo (回滚版本)

    ( 2 ) rollout undo

    回滚 pod 到之前的版本。

7.2 语法

$ kubectl rollout undo (TYPE NAME | TYPE/NAME) [flags]

7.3 演示

[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 | Pod Name

8、edit编辑修改

8.1 介绍

  • 使用默认编辑器,编辑服务器上定义的资源。
  • 使用命令行工具获取的任何资源都可以使用 edit 命令编辑。 edit 命令会打开使用 KUBE_EDITOR , GIT_EDITOR 或者 EDITOR 环境变量定义的编辑器,可以同时编辑多个资源,但所编辑过的资源只会一次性提交。 edit 除命令参数外还接受文件名形式。
  • 文件默认输出格式为 YAML 。要以 JSON 格式编辑,请指定 “-o json” 选项。
  • 如果在更新资源时报错,将会在磁盘上创建一个临时文件来记录。在更新资源时最常见的错误是几个用户同时使用编辑器更改服务器上资源,发生这种情况,你需要将你的更改应用到最新版本的资源上,或者更新保存的临时副本。

8.2 语法

$ kubectl edit (RESOURCE/NAME | -f FILENAME)

8.3 演示

( 1 )修改 service ,将类型 type: ClusterIP ,修改为 type: NodePort ;修改后,可以在集群外访问到 pod 中的服务

[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 80:31599/TCP 23m

( 2 )在集群外的主机上访问了

9、label标签

9.1 介绍

更新(增加、修改或删除)资源上的 label (标签)。

  • label 必须以字母或数字开头,可以使用字母、数字、连字符、点和下划线,最长 63 个字符。
  • 如果 --overwrite 为 true ,则可以覆盖已有的 label ,否则尝试覆盖 label 将会报错。
  • 如果指定了 --resource-version ,则更新将使用此资源版本,否则将使用现有的资源版本。

9.2 语法

$ kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]

9.3 演示

( 1 )运行一个标签为 app=nginx 的 pod

[root@master ~]# kubectl run nginx --image=nginx:1.14-alpine --replicas=1 --labels="app=nginx"

deployment.apps/nginx created

( 2 ) -l 指定标签,实现标签过滤

[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 )打一个新的标签

[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 )修改标签

[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 )等值关系: = , == , !=

[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 :不存在此健

[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

作者:along阿龙
出处:http://www.cnblogs.com/along21/
简介:每天都在进步,每周都在总结,你的一个点赞,一句留言,就可以让博主开心一笑,充满动力!
版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广