《重识云原生系列》专题索引:

  1. 第一章——不谋全局不足以谋一域
  2. 第二章计算第1节——计算虚拟化技术总述
  3. 第二章计算第2节——主流虚拟化技术之VMare ESXi
  4. 第二章计算第3节——主流虚拟化技术之Xen
  5. 第二章计算第4节——主流虚拟化技术之KVM
  6. 第二章计算第5节——商用云主机方案
  7. 第二章计算第6节——裸金属方案
  8. 第三章云存储第1节——分布式云存储总述
  9. 第三章云存储第2节——SPDK方案综述
  10. 第三章云存储第3节——Ceph统一存储方案
  11. 第三章云存储第4节——OpenStack Swift 对象存储方案
  12. 第三章云存储第5节——商用分布式云存储方案
  13. 第四章云网络第一节——云网络技术发展简述
  14. 第四章云网络4.2节——相关基础知识准备
  15. 第四章云网络4.3节——重要网络协议
  16. 第四章云网络4.3.1节——路由技术简述
  17. 第四章云网络4.3.2节——VLAN技术
  18. 第四章云网络4.3.3节——RIP协议
  19. 第四章云网络4.3.4节——OSPF协议
  20. 第四章云网络4.3.5节——EIGRP协议
  21. 第四章云网络4.3.6节——IS-IS协议
  22. 第四章云网络4.3.7节——BGP协议
  23. 第四章云网络4.3.7.2节——BGP协议概述
  24. 第四章云网络4.3.7.3节——BGP协议实现原理
  25. 第四章云网络4.3.7.4节——高级特性
  26. 第四章云网络4.3.7.5节——实操
  27. 第四章云网络4.3.7.6节——MP-BGP协议
  28. 第四章云网络4.3.8节——策略路由
  29. 第四章云网络4.3.9节——Graceful Restart(平滑重启)技术
  30. 第四章云网络4.3.10节——VXLAN技术
  31. 第四章云网络4.3.10.2节——VXLAN Overlay网络方案设计
  32. 第四章云网络4.3.10.3节——VXLAN隧道机制
  33. 第四章云网络4.3.10.4节——VXLAN报文转发过程
  34. 第四章云网络4.3.10.5节——VXlan组网架构
  35. 第四章云网络4.3.10.6节——VXLAN应用部署方案
  36. 第四章云网络4.4节——Spine-Leaf网络架构
  37. 第四章云网络4.5节——大二层网络
  38. 第四章云网络4.6节——Underlay 和 Overlay概念
  39. 第四章云网络4.7.1节——网络虚拟化与卸载加速技术的演进简述
  40. 第四章云网络4.7.2节——virtio网络半虚拟化简介
  41. 第四章云网络4.7.3节——Vhost-net方案
  42. 第四章云网络4.7.4节vhost-user方案——virtio的DPDK卸载方案
  43. 第四章云网络4.7.5节vDPA方案——virtio的半硬件虚拟化实现
  44. 第四章云网络4.7.6节——virtio-blk存储虚拟化方案
  45. 第四章云网络4.7.8节——SR-IOV方案
  46. 第四章云网络4.7.9节——NFV
  47. 第四章云网络4.8.1节——SDN总述
  48. 第四章云网络4.8.2.1节——OpenFlow概述
  49. 第四章云网络4.8.2.2节——OpenFlow协议详解
  50. 第四章云网络4.8.2.3节——OpenFlow运行机制
  51. 第四章云网络4.8.3.1节——Open vSwitch简介
  52. 第四章云网络4.8.3.2节——Open vSwitch工作原理详解
  53. 第四章云网络4.8.4节——OpenStack与SDN的集成
  54. 第四章云网络4.8.5节——OpenDayLight
  55. 第四章云网络4.8.6节——Dragonflow
  56.  第四章云网络4.9.1节——网络卸载加速技术综述

  57. 第四章云网络4.9.2节——传统网络卸载技术

  58. 第四章云网络4.9.3.1节——DPDK技术综述

  59. 第四章云网络4.9.3.2节——DPDK原理详解

  60. 第四章云网络4.9.4.1节——智能网卡SmartNIC方案综述

  61. 第四章云网络4.9.4.2节——智能网卡实现

  62. 第六章容器6.1.1节——容器综述

  63. 第六章容器6.1.2节——容器安装部署

  64. 第六章容器6.1.3节——Docker常用命令

  65. 第六章容器6.1.4节——Docker核心技术LXC

  66. 第六章容器6.1.5节——Docker核心技术Namespace

  67. 第六章容器6.1.6节—— Docker核心技术Chroot

  68. 第六章容器6.1.7.1节——Docker核心技术cgroups综述

  69. 第六章容器6.1.7.2节——cgroups原理剖析

  70. 第六章容器6.1.7.3节——cgroups数据结构剖析

  71. 第六章容器6.1.7.4节——cgroups使用

  72. 第六章容器6.1.8节——Docker核心技术UnionFS

  73. 第六章容器6.1.9节——Docker镜像技术剖析

  74. 第六章容器6.1.10节——DockerFile解析

  75. 第六章容器6.1.11节——docker-compose容器编排

  76. 第六章容器6.1.12节——Docker网络模型设计

  77. 第六章容器6.2.1节——Kubernetes概述

  78. 第六章容器6.2.2节——K8S架构剖析

  79. 第六章容器6.3.1节——K8S核心组件总述

  80. 第六章容器6.3.2节——API Server组件

  81. 第六章容器6.3.3节——Kube-Scheduler使用篇

  82. 第六章容器6.3.4节——etcd组件

  83. 第六章容器6.3.5节——Controller Manager概述

  84. 第六章容器6.3.6节——kubelet组件

  85. 第六章容器6.3.7节——命令行工具kubectl

  86. 第六章容器6.3.8节——kube-proxy

  87. 第六章容器6.4.1节——K8S资源对象总览

  88. 第六章容器6.4.2.1节——pod详解

  89. 第六章容器6.4.2.2节——Pod使用(上)

  90. 第六章容器6.4.2.3节——Pod使用(下)

  91. 第六章容器6.4.3节——ReplicationController

  92. 第六章容器6.4.4节——ReplicaSet组件

  93. 第六章容器基础6.4.5.1节——Deployment概述

  94. 第六章容器基础6.4.5.2节——Deployment配置详细说明

  95. 第六章容器基础6.4.5.3节——Deployment实现原理解析

  96. 第六章容器基础6.4.6节——Daemonset

  97. 第六章容器基础6.4.7节——Job

  98. 第六章容器基础6.4.8节——CronJob

1 kubectl

        kubectl 是 Kubernetes 的命令行工具(CLI),是 Kubernetes 用户和管理员必备的管理工具。kubectl安装在k8s的master节点,kubectl在$HOME/.kube目录中查找一个名为config的文件, 你可以通过设置Kubeconfig环境变量或设置--kubeconfig来指定其他的kubeconfig文件。kubectl通过与apiserver交互可以实现对k8s集群中各种资源的增删改查。

        kubectl 提供了大量的子命令,方便管理 Kubernetes 集群中的各种功能。这里不再罗列各种子命令的格式,而是介绍下如何查询命令的帮助:

  • kubectl -h 查看子命令列表
  • kubectl options 查看全局选项
  • kubectl --help 查看子命令的帮助
  • kubectl [command] [PARAMS] -o= 设置输出格式(如 json、yaml、jsonpath 等)
  • kubectl explain [RESOURCE] 查看资源的定义

1.1 配置

        使用 kubectl 的第一步是配置 Kubernetes 集群以及认证方式,包括:

  • cluster 信息:Kubernetes server 地址
  • 用户信息:用户名、密码或密钥
  • Context:cluster、用户信息以及 Namespace 的组合

示例

kubectl config set-credentials myself --username=admin --password=secret 
kubectl config set-cluster local-server --server=http://localhost:8080 
kubectl config set-context default-context --cluster=local-server --user=myself --namespace=default 
kubectl config use-context default-context 
kubectl config view

1.2 集群内身份验证和命名空间覆盖

        默认情况下,kubectl 命令首先确定它是否在 Pod 中运行,从而被视为在集群中运行。 它首先检查 KUBERNETES_SERVICE_HOST 和 KUBERNETES_SERVICE_PORT 环境变量以及 /var/run/secrets/kubernetes.io/serviceaccount/token 中是否存在服务帐户令牌文件。 如果三个条件都被满足,则假定在集群内进行身份验证。

        为保持向后兼容性,如果在集群内身份验证期间设置了 POD_NAMESPACE 环境变量,它将覆盖服务帐户令牌中的默认命名空间。 任何依赖默认命名空间的清单或工具都会受到影响。

POD_NAMESPACE 环境变量

        如果设置了 POD_NAMESPACE 环境变量,对命名空间资源的 CLI 操作对象将使用该变量值作为默认值。 例如,如果该变量设置为 seattle,kubectl get pods 将返回 seattle 命名空间中的 Pod。 这是因为 Pod 是一个命名空间资源,且命令中没有提供命名空间。

        直接使用 --namespace  会覆盖此行为。

1.2.1 kubectl 如何处理 ServiceAccount 令牌

假设:

  • 有 Kubernetes 服务帐户令牌文件挂载在 /var/run/secrets/kubernetes.io/serviceaccount/token 上,并且
  • 设置了 KUBERNETES_SERVICE_HOST 环境变量,并且
  • 设置了 KUBERNETES_SERVICE_PORT 环境变量,并且
  • 你没有在 kubectl 命令行上明确指定命名空间。

        然后 kubectl 假定它正在你的集群中运行。 kubectl 工具查找该 ServiceAccount 的命名空间 (该命名空间与 Pod 的命名空间相同)并针对该命名空间进行操作。 这与集群外运行的情况不同; 当 kubectl 在集群外运行并且你没有指定命名空间时, kubectl 命令会针对 default 命名空间进行操作。

1.3 kubectl的安装方法

kubectl 的安装方法:

# OS X 
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl 
# Linux 
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl 
# Windows 
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/windows/amd64/kubectl.exe

1.4 kubectl语法

        kubectl语法格式如下,可在k8s集群的master节点执行: 

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服务器的地址和端口。

注意事项说明:

        从命令行指定的参数会覆盖默认值和任何相应的环境变量。

1.在对多个资源执行操作时,可以按类型、名称、一个或者多个文件指定每个资源:

1)按类型和名称指定资源:

        a.要对所有类型相同的资源进行分组,请执行以下操作:

TYPE1 name1 name2 name

例子:

kubectl get pod example-pod1 example-pod2

        b.分别指定多个资源类型:

TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE/name

例子:

kubectl get pod/example-pod1 deployment/example-rc1

2)用一个或多个文件指定资源:-f file1 -f file2 -f file

        使用YAML而不是JSON,因为YAML更容易使用,特别是用于配置文件时。例子:

kubectl get pod -f ./pod.yaml

2.kubectl –-help

        可查看kubectl的帮助命令。

2 kubectl命令详解

2.1 常用命令格式

  • 创建:

kubectl run --image= 或者 

kubectl create -f manifest.yaml

  • 查询:

kubectl get

  • 更新 

kubectl set 或者 

kubectl patch

  • 删除:

kubectl delete  或者 

kubectl delete -f manifest.yaml

  • 查询 Pod IP:

kubectl get pod -o jsonpath='{.status.podIP}'

  • 容器内执行命令:

kubectl exec -ti sh

  • 容器日志:

kubectl logs [-f]

  • 导出服务:

kubectl expose deploy --port=80

  • Base64 解码:

kubectl get secret SECRET -o go-template='{{ .data.KEY | base64decode }}'

        注意,kubectl run 仅支持 Pod、Replication Controller、Deployment、Job 和 CronJob 等几种资源。具体的资源类型是由参数决定的,默认为 Deployment:

创建的资源类型

参数

Pod

--restart=Never

Replication Controller

--generator=run/v1

Deployment

--restart=Always

Job

--restart=OnFailure

CronJob

--schedule=

2.2 命令行自动补全

Linux 系统 Bash:

source /usr/share/bash-completion/bash_completion source <(kubectl completion bash)

MacOS zsh

source <(kubectl completion zsh)

2.3 自定义输出列

        比如,查询所有 Pod 的资源请求和限制:

kubectl get pods --all-namespaces -o custom-columns=NS:.metadata.namespace,NAME:.metadata.name,"CPU(requests)":.spec.containers[*].resources.requests.cpu,"CPU(limits)":.spec.containers[*].resources.limits.cpu,"MEMORY(requests)":.spec.containers[*].resources.requests.memory,"MEMORY(limits)":.spec.containers[*].resources.limits.memory

2.4 日志查看

        kubectl logs 用于显示 pod 运行中,容器内程序输出到标准输出的内容。跟 docker 的 logs 命令类似。

# Return snapshot logs from pod nginx with only one container 
kubectl logs nginx 

# Return snapshot of previous terminated ruby container logs from pod web-1 
kubectl logs -p -c ruby web-1 

# Begin streaming the logs of the ruby container in pod web-1 
kubectl logs -f -c ruby web-1

        注:kubectl 只可以查看单个容器的日志,如果想要同时查看多个 Pod 的日志,可以使用 stern。比如: stern --all-namespaces -l run=nginx。

2.5 连接到一个正在运行的容器

         attach 用于连接到一个正在运行的容器。跟 docker 的 attach 命令类似。

# Get output from running pod 123456-7890, using the first container by default 
kubectl attach 123456-7890 

# Get output from ruby-container from pod 123456-7890 
kubectl attach 123456-7890 -c ruby-container 

# Switch to raw terminal mode, sends stdin to 'bash' in ruby-container from pod 123456-7890 # and sends stdout/stderr from 'bash' back to the client 
kubectl attach 123456-7890 -c ruby-container -i -t 

Options: 
  -c, --container='': Container name. If omitted, the first container in the pod will be chosen
  -i, --stdin=false: Pass stdin to the container
  -t, --tty=false: Stdin is a TTY 

2.6 在容器内部执行命令

        kubectl exec 用于在一个正在运行的容器执行命令。跟 docker 的 exec 命令类似。

# Get output from running 'date' from pod 123456-7890, using the first container by default 
kubectl exec 123456-7890 date 

# Get output from running 'date' in ruby-container from pod 123456-7890 
kubectl exec 123456-7890 -c ruby-container date 

# Switch to raw terminal mode, sends stdin to 'bash' in ruby-container from pod 123456-7890 # and sends stdout/stderr from 'bash' back to the client 
kubectl exec 123456-7890 -c ruby-container -i -t -- bash -il 

Options: 
  -c, --container='': Container name. If omitted, the first container in the pod will be chosen 
  -p, --pod='': Pod name 
  -i, --stdin=false: Pass stdin to the container 
  -t, --tty=false: Stdin is a TT

2.7 端口转发

        kubectl port-forward 用于将本地端口转发到指定的 Pod。

# Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in the 
pod kubectl port-forward mypod 5000 6000 

# Listen on port 8888 locally, forwarding to 5000 in the pod 
kubectl port-forward mypod 8888:5000 

# Listen on a random port locally, forwarding to 5000 in the pod 
kubectl port-forward mypod :5000 

# Listen on a random port locally, forwarding to 5000 in the pod 
kubectl port-forward mypod 0:5000

        也可以将本地端口转发到服务、复制控制器或者部署的端口。

# Forward to deployment 
kubectl port-forward deployment/redis-master 6379:6379 

# Forward to replicaSet 
kubectl port-forward rs/redis-master 6379:6379 

# Forward to service 
kubectl port-forward svc/redis-master 6379:6379

2.8 API Server 代理

        kubectl proxy 命令提供了一个 Kubernetes API 服务的 HTTP 代理。

$ kubectl proxy --port=8080 Starting to serve on 127.0.0.1:8080

        可以通过代理地址 http://localhost:8080/api/ 来直接访问 Kubernetes API,比如查询 Pod 列表:

curl http://localhost:8080/api/v1/namespaces/default/pods

        注意,如果通过 --address 指定了非 localhost 的地址,则访问 8080 端口时会报未授权的错误,可以设置 --accept-hosts 来避免这个问题( 不推荐生产环境这么设置 ):

kubectl proxy --address='0.0.0.0' --port=8080 --accept-hosts='^*$'

2.9 文件拷贝

        kubectl cp 支持从容器中拷贝,或者拷贝文件到容器中:

# Copy /tmp/foo_dir local directory to /tmp/bar_dir in a remote pod in the default namespace 
kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir 

# Copy /tmp/foo local file to /tmp/bar in a remote pod in a specific container 
kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container> 

# Copy /tmp/foo local file to /tmp/bar in a remote pod in namespace <some-namespace> 
kubectl cp /tmp/foo <some-namespace>/<some-pod>:/tmp/bar 

# Copy /tmp/foo from a remote pod to /tmp/bar locally 
kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar 

Options: 
  -c, --container='': Container name. If omitted, the first container in the pod will be chosen

        注意:文件拷贝依赖于 tar 命令,所以容器中需要能够执行 tar 命令。

2.10 kubectl drain

        kubectl drain NODE [Options]

  • 它会删除该 NODE 上由 ReplicationController, ReplicaSet, DaemonSet, StatefulSet or Job 创建的 Pod
  • 不删除 mirror pods(因为不可通过 API 删除 mirror pods)
  • 如果还有其它类型的 Pod(比如不通过 RC 而直接通过 kubectl create 的 Pod)并且没有 --force 选项,该命令会直接失败
  • 如果命令中增加了 --force 选项,则会强制删除这些不是通过 ReplicationController, Job 或者 DaemonSet 创建的 Pod

        有的时候不需要 evict pod,只需要标记 Node 不可调用,可以用 kubectl cordon 命令。

        恢复的话只需要运行 kubectl uncordon NODE 将 NODE 重新改成可调度状态。

2.11 权限检查

        kubectl auth 提供了两个子命令用于检查用户的鉴权情况:

  • kubectl auth can-i 检查用户是否有权限进行某个操作,比如
# Check to see if I can create pods in any namespace 
kubectl auth can-i create pods --all-namespaces 

# Check to see if I can list deployments in my current namespace 
kubectl auth can-i list deployments.extensions 

# Check to see if I can do everything in my current namespace ("*" means all) 
kubectl auth can-i '*' '*' 

# Check to see if I can get the job named "bar" in namespace "foo" 
kubectl auth can-i list jobs.batch/bar -n foo
  • kubectl auth reconcile 自动修复有问题的 RBAC 策略,如
# Reconcile rbac resources from a file 
kubectl auth reconcile -f my-rbac-rules.yaml

2.12 模拟其他用户

        kubectl 支持模拟其他用户或者组来进行集群管理操作,比如:

kubectl drain mynode --as=superman --as-group=system:masters

        这实际上就是在请求 Kubernetes API 时添加了如下的 HTTP HEADER:

Impersonate-User: superman 
Impersonate-Group: system:masters

2.13 查看事件(events)

# 查看所有事件 
kubectl get events --all-namespaces 

# 查看名为nginx对象的事件 
kubectl get events --field-selector involvedObject.name=nginx,involvedObject.namespace=default 

# 查看名为nginx的服务事件 
kubectl get events --field-selector involvedObject.name=nginx,involvedObject.namespace=default,involvedObject.kind=Service 

# 查看Pod的事件 
kubectl get events --field-selector involvedObject.name=nginx-85cb5867f-bs7pn,involvedObject.kind=Pod

2.14 原始 URI

        kubectl 也可以用来直接访问原始 URI,比如要访问 Metrics API 可以:

  • kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes
  • kubectl get --raw /apis/metrics.k8s.io/v1beta1/pods
  • kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes/
  • kubectl get --raw /apis/metrics.k8s.io/v1beta1/namespace//pods/

3 kubectl 插件

        kubectl 插件提供了一种扩展 kubectl 的机制,比如添加新的子命令。插件可以以任何语言编写,只需要满足以下条件即可:

  • 插件放在 ~/.kube/plugins 或环境变量 KUBECTL_PLUGINS_PATH 指定的目录中
  • 插件的格式为子目录 / 可执行文件或脚本 且子目录中要包括 plugin.yaml 配置文件

比如

$ tree 
. 
└── hello
    └── plugin.yaml 

1 directory, 1 file 

$ cat hello/plugin.yaml 
name: "hello" 
shortDesc: "Hello kubectl plugin!" 
command: "echo Hello plugins!" 

$ kubectl plugin hello 
Hello plugins!

        你也可以使用 krew 来管理 kubectl 插件。

参考链接

kubectl · Kubernetes指南

kubectl基础命令详解(一)_OSoooo的博客-CSDN博客_kubectl

kubectl简介 - 快乐嘉年华 - 博客园

kubectl工具详解_pipipipe的博客-CSDN博客_kubectl工具

命令行工具 (kubectl) | Kubernetes

kubectl - 知乎

kubectl详解 - 明王不动心 - 博客园

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐