2020-07-27 kubectl 命令行管理工具

1. kubectl管理命令概要

官网链接 https://kubernetes.io/zh/docs/reference/kubectl/overview/#%e8%af%ad%e6%b3%95
概述:kubectl是一个命令行接口,用于对kubernetes集群运行命令。
官网链接 https://kubernetes.io/zh/docs/reference/kubectl/overview/#%e8%af%ad%e6%b3%95

概述:kubectl是一个命令行接口,用于对kubernetes集群运行命令。

kubect命令行

语法结构 kubetctl [command] [type] [name] [flages]

  • commasnd 指对一个或者多个资源的操作,例如:create、get、name、describe、delete
  • type 指定资源类型(不区分大小写)
  • name 指定资源名称(区分大小写)
    • 获取所有资源 kubectl get pods
    • 获取指定资源 kunectl get pod example-pod1 example-pod2 #结构 tpye1 name1 name2
    • 用一个或多个文件 kubectl get pod -f ./pod.yaml #结构 -f file1 -f file2
  • flags 指定可选参数。

kubectl格式化输出

语法结构 kubetctl [command] [type] [name] -o=<output_format>

  • -o json 输出json格式api对象
  • -o name 仅输出资源名称,不显示其他信息
  • -o wide 以纯文本格式输出,包含任何附加信息,对于pod包含节点名称
  • -o yaml 输出以yaml格式的api对象

示例:kubectl get pod -o wide 输出pod详细信息

kubectl根据命名空间过滤

语法结构 kubetctl [command] [type] [name] -o=<output_format> -n namespace

示例:kubectl get pod -o wide -n kube-system

命令

  • 基础命令

    • create 通过文件名或标准输入创建资源
    • expose 将一个新的资源公开为新的service
    • run 在集群中运行一个特定的镜像(创建一个容器)
    • set 在对象上设置特定的功能
    • get 显示一个或多个资源
    • exit 使用默认的编辑器编辑资源
    • delete 通过文件名、标准输入、资源名称、或标签选择器来删除资源
  • 部署命令

    • rollout 管理资源的发布
    • rolling-update 对给定的复制控制器滚动更新
    • scale 扩容或缩容pod数量,Deployment、ReplicaSet、RC、或Job
    • autoscale 创建一个自动选择扩容并设置pod数量
  • 集群管理命令

    • certficate 修改证书资源
    • cluster-info 显示集群信息
    • top 显示资源(cpu/memory/storage)使用。需要部署Heapster运行
    • cordon 标记节点可以调度
    • uncordon 标记节点不可调度 (节点维护情况下使用)
    • drain 驱逐节点上的应用,准备下线(比如机器故障、更换等停机)
    • taint 修改节点taint标记
  • 故障诊断和调试命令

    • describe 显示特性资源或资源组详细信息
    • log 在一个pod中打印一个容器日志,如果pod只有一个容器日志,容器名称是可选的
    • attach 附加到一个运行的容器
    • exec 执行命令到容器
    • port-forward 转发一个或多个本地端口到pod
    • porxy 运行一个porxy到kubernetes api server
    • cp 拷贝文件或目录到容器中
    • auth 检查授权
  • 高级命令

    • apply 通过文件名或标准输入对资源应用配置
    • patch 通过补丁修改、更新资源字段
    • replace 通过文件名或标准输入替换一个资源
    • covert 不同api版本之间转换配置文件
  • 设置命令

    • lable 更新资源上的标签
    • annotate 更新资源上的注释
    • completion 用于实现kubectl工具自动补全
  • 其他命令

    • api-versions 打印受支持的api版本
    • config 修改kubernetes文件(用于访问api,比如配置认证信息等)
    • help 所有帮助命令
    • plugin 运行一个命令行插件
    • version 打印客户端和服务版本信息

2. kubectl管理应用程序生命周期

  1. 创建
# 在集群中运行nginx1.14
[root@master1 ~]# kubectl run nginx --replicas=3 --image=nginx:1.14 --port=80    ---replicas=3指运行3个pod
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx created
[root@master1 ~]# kubectl get pods    ---可以看到3个nginx副本创建成功(有时可能要等好久)
NAME                     READY   STATUS    RESTARTS   AGE
busybox                  1/1     Running   9          6d
nginx-59d795d786-5lgdb   1/1     Running   0          5h5m
nginx-59d795d786-c7xlc   1/1     Running   0          8h
nginx-59d795d786-cqdn7   1/1     Running   0          5h5m
web-d86c95cc9-kt8m2      1/1     Running   0          6d5h

[root@master1 ~]# kubectl get deploy,pods    ---显示deployment,pods
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   3/3     3            3           8h
deployment.apps/web     1/1     1            1           6d5h
NAME                         READY   STATUS    RESTARTS   AGE
pod/busybox                  1/1     Running   10         6d
pod/nginx-59d795d786-5lgdb   1/1     Running   0          5h21m
pod/nginx-59d795d786-c7xlc   1/1     Running   0          8h
pod/nginx-59d795d786-cqdn7   1/1     Running   0          5h21m
pod/web-d86c95cc9-kt8m2      1/1     Running   0          6d5h
  1. 发布
# 创建service 
[root@master1 ~]# kubectl expose deployment nginx --type=NodePort --port=80 --target-port=80 --name=nginx-service
---port service的端口,用于集群内部之间访问的端口,target-port 容器的端口,type=NodePort 随机生成一个端口,用于集群外部访问
service/nginx-service exposed
# 查看service 
[root@master1 ~]# kubectl get service
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.0.0.1     <none>        443/TCP        21h
nginx-service   NodePort    10.0.0.252   <none>        80:31838/TCP   15s    ---刚创建的service
web             NodePort    10.0.0.29    <none>        80:32041/TCP   109m
web01           NodePort    10.0.0.38    <none>        80:30081/TCP   80m

任意node节点都访问成功。

访问成功

访问成功
---查看相关日志
[root@k8s-master1 ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
busybox                  1/1     Running   0          58m
nginx-59d795d786-dkpnq   1/1     Running   0          34m
nginx-59d795d786-qll5h   1/1     Running   0          34m
nginx-59d795d786-zhvb8   1/1     Running   0          34m
web-d86c95cc9-xb5nw      1/1     Running   0          114m
web01-69b48974d6-lm7fg   1/1     Running   0          84m
[root@k8s-master1 ~]# kubectl logs nginx-59d795d786-dkpnq
10.244.1.1 - - [26/Jul/2020:15:07:12 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0" "-"
10.244.1.1 - - [26/Jul/2020:15:07:12 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0" "-"
2020/07/26 15:07:12 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.244.1.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.9.65:31838"
10.244.0.0 - - [26/Jul/2020:15:07:48 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763" "-"
10.244.1.1 - - [26/Jul/2020:15:09:13 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0" "-"
2020/07/26 15:09:13 [error] 6#6: *3 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.244.1.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.9.65:31838"
10.244.1.1 - - [26/Jul/2020:15:09:13 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0" "-"
  1. 更新
[root@k8s-master1 ~]# kubectl set image deployment/nginx nginx=nginx:1.15    ---更新到nginx1.15
deployment.apps/nginx image updated
[root@k8s-master1 ~]# kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
busybox                  1/1     Running             0          60m
nginx-59d795d786-dkpnq   1/1     Running             0          36m
nginx-59d795d786-qll5h   1/1     Running             0          36m
nginx-59d795d786-zhvb8   1/1     Running             0          36m
nginx-dc5dc5865-jjw9j    0/1     ContainerCreating   0          4s
web-d86c95cc9-xb5nw      1/1     Running             0          117m
web01-69b48974d6-lm7fg   1/1     Running             0          87m
[root@k8s-master1 ~]# kubectl get pods    ---可以看到,不是一下子把所有容器都删掉,而是一个一个地更新,这样可以保证业务不中断的情况下更新
NAME                     READY   STATUS              RESTARTS   AGE
busybox                  1/1     Running             1          84m
nginx-59d795d786-dkpnq   1/1     Running             0          60m
nginx-59d795d786-qll5h   0/1     Terminating         0          60m
nginx-59d795d786-zhvb8   1/1     Running             0          60m
nginx-dc5dc5865-jjw9j    1/1     Running             0          23m
nginx-dc5dc5865-vvh2q    0/1     ContainerCreating   0          6s
web-d86c95cc9-xb5nw      1/1     Running             0          140m
web01-69b48974d6-lm7fg   1/1     Running             0          111m

[root@k8s-master1 ~]# kubectl get pods    ---更新完成
NAME                     READY   STATUS    RESTARTS   AGE
busybox                  1/1     Running   3          3h17m
nginx-dc5dc5865-jjw9j    1/1     Running   0          136m
nginx-dc5dc5865-vvh2q    1/1     Running   0          113m
nginx-dc5dc5865-zbklt    1/1     Running   0          28m
web-d86c95cc9-xb5nw      1/1     Running   0          4h13m
web01-69b48974d6-lm7fg   1/1     Running   0          3h44m
[root@k8s-master1 ~]# kubectl describe pod nginx-dc5dc5865-jjw9j | grep Image
    Image:          nginx:1.15
    Image ID:       docker-pullable://nginx@sha256:23b4dcdf0d34d4a129755fc6f52e1c6e23bb34ea011b315d87e193033bcd1b68
  1. 回滚
[root@k8s-master1 ~]# kubectl rollout history deployment/nginx    ---查看发布过的版本
deployment.apps/nginx 
REVISION  CHANGE-CAUSE
1         <none>    ---1.14
2         <none>    ---1.15
[root@k8s-master1 ~]# kubectl rollout undo deployment/nginx    ---回滚到上一个版本
deployment.apps/nginx rolled back
  1. 删除
[root@k8s-master1 ~]# kubectl delete deployment/nginx
deployment.apps "nginx" deleted
[root@k8s-master1 ~]# kubectl delete svc/nginx-service
service "nginx-service" deleted
[root@k8s-master1 ~]# kubectl get pods    ---发现没了,删除成功
NAME                     READY   STATUS    RESTARTS   AGE
busybox                  1/1     Running   19         19h
web-d86c95cc9-xb5nw      1/1     Running   0          20h
web01-69b48974d6-lm7fg   1/1     Running   0          19h

3. kubectl工具远程连接集群

在node节点上执行kubectl

[root@k8s-master1 k8s]# scp /usr/local/bin/kubectl 192.168.9.65:/usr/bin/    ---把命令拷贝一份过去
root@192.168.9.65's password: 
kubectl 
[root@k8s-node1 ~]# kubectl get node    ---报错,因为没有apiserver
The connection to the server localhost:8080 was refused - did you specify the right host or port?
# 生成管理员证书admin-key.pem和admin.pem
[root@k8s-master1 ~]# cd TLS/k8s
[root@k8s-master1 k8s]# vim admin-csr.json
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
[root@k8s-master1 k8s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
2020/07/27 17:42:08 [INFO] generate received request
2020/07/27 17:42:08 [INFO] received CSR
2020/07/27 17:42:08 [INFO] generating key: rsa-2048
2020/07/27 17:42:08 [INFO] encoded CSR
2020/07/27 17:42:08 [INFO] signed certificate with serial number 370243385112739732888072353273824480375932047526
2020/07/27 17:42:08 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").

[root@k8s-master1 k8s]# cat kubectl远程连接k8s.sh     ---上传脚本
# 设置集群参数
kubectl config set-cluster kubernetes \
  --server=https://192.168.9.63:6443 \    ---master1的IP地址(如果用VIP就设置成VIP地址)
  --certificate-authority=ca.pem \
  --embed-certs=true \
  --kubeconfig=config
# 设置客户端认证参数
kubectl config set-credentials cluster-admin \
  --certificate-authority=ca.pem \
  --embed-certs=true \
  --client-key=admin-key.pem \
  --client-certificate=admin.pem \
  --kubeconfig=config
# 设置上下文参数
kubectl config set-context default \
  --cluster=kubernetes \
  --user=cluster-admin \
  --kubeconfig=config
# 设置默认上下文
kubectl config use-context default --kubeconfig=config

[root@k8s-master1 k8s]# bash kubectl远程连接k8s.sh     ---执行脚本
Cluster "kubernetes" set.
User "cluster-admin" set.
Context "default" created.
Switched to context "default".
[root@k8s-master1 k8s]# ls    ---生成的config文件就是所需的文件
admin.csr       admin-key.pem  ca-config.json  ca-csr.json  ca.pem  generate_k8s_cert.sh   kube-proxy.csr       kube-proxy-key.pem  server.csr       server-key.pem
admin-csr.json  admin.pem      ca.csr          ca-key.pem   config  kubectl远程连接k8s.sh  kube-proxy-csr.json  kube-proxy.pem      server-csr.json  server.pem

[root@k8s-master1 k8s]# scp config 192.168.9.65:/root/    ---把config拷贝到node1节点上
root@192.168.9.65's password: 
config
[root@k8s-node1 ~]# kubectl --kubeconfig=./config get node    ---在node1节点上执行成功
NAME        STATUS   ROLES    AGE   VERSION
k8s-node1   Ready    <none>   22h   v1.16.0
k8s-node2   Ready    <none>   22h   v1.16.0
[root@k8s-node1 ~]# mv config .kube/    ---把config文件移动到.kube目录下就可以直接使用kubectl命令了
[root@k8s-node1 ~]# kubectl get node
NAME        STATUS   ROLES    AGE   VERSION
k8s-node1   Ready    <none>   22h   v1.16.0
k8s-node2   Ready    <none>   22h   v1.16.0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355