kubectl 是 K8s 集群的命令行工具,通过 kubectl 能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。
kubectl 工具已包含在 K8s 的 Server、Node 编译程序安装包中,无需单独安装。默认情况下,启动时连接本地服务器的 8080 端口访问 K8s APIServer,因此仅可以在 K8s 的任意主控节点上使用(如果需要在工作节点或者其他主机上使用 kubectl,则需要为它创建 K8s APIServer 的连接文件,通常情况下没有这种必要性)。
目录
1.语法结构
2.命令清单
3.集群部署拓扑图
4.应用资源编排部署
-- 4.1.使用命令部署应用
-- 4.2.使用 YAML 文件部署应用
5.运维管理
附录一 更多学习资料
附录二 安装 kubectl 命令补全工具
1.语法结构
kubetctl [command] [type] [name] [flages]
- [commasnd]:指对一个或者多个资源的操作,例如:create、get、name、describe、delete 等。
- [type] 指定资源类型(不区分大小写),多个资源通过 "," 分隔。可以通过 "kubectl api-resources" 命令查询资源类型清单。
- name:指定资源名称(区分大小写)。
- flags:指定可选参数。常用包括:
-n [namespace]:指定资源的命名空间,默认值是 "default"。
-o [output_format]:指定资源的输出方式。可选形式包括:
① -o json:输出 JSON 格式 API 对象。
② -o name:输出资源名称,不显示其他信息。
③ -o wide:输出资源的详细信息。
④ -o yaml:输出 YAML 格式的 API 对象。
⑤ 不指定时输出资源摘要信息。
-s [apiserver_ip:port]:指定连接的 API Server 的 IP 和 Port,默认值是 "localhost:8080"。
示例 1:查询所有工作节点
[centos@k8s-master ~]$ kubectl get node
示例 2:查询指定名字的工作节点
[centos@k8s-master ~]$ kubectl get node k8s-node1
示例 3:查询指定命名空间的 Pod 的摘要信息
[centos@k8s-master ~]$ kubectl get pod -n kube-system
示例 4:查询指定命名空间的 Pod 的详细信息
[centos@k8s-master ~]$ kubectl get pod -n kube-system -o wide
示例 5:查询指定命名空间的 Pod 、 Service、Node 的详细信息
[centos@k8s-master ~]$ kubectl get pod,svc,node -n kube-system -o wide
2.命令清单
1、基础命令
- create:通过文件名或标准输入创建资源。
- expose:将一个新的资源暴露为新的服务。
- run:在集群中运行一个特定的镜像(创建一个容器)。
- set:在对象上设置特定的功能。
- get:显示一个或多个资源。
- edit:编辑一个资源。
- exit:使用默认的编辑器编辑资源。
- delete:通过文件名、标准输入、资源名称、或标签选择器来删除资源。
- explain:查看资源的文档。
2、部署命令
- rollout:管理资源的发布。
- rolling-update:对给定的复制控制器滚动更新。
- scale:扩容或缩容 Pod 数量。
- autoscale :创建一个自动选择扩容并设置 Pod 数量。
3、集群管理命令
- certficate:修改证书资源。
- cluster-info:显示集群信息。
- cordon:标记节点可以调度。
- uncordon 标记节点不可调度:(节点维护情况下使用)。
- drain:驱逐节点上的应用,准备下线(比如机器故障、更换等停机)。
- taint:修改节点 taint 标记。
4、故障诊断和调试命令
- describe:显示特性资源或资源组详细信息。
- log:在一个 Pod 中打印一个容器日志。
- attach:附加到一个运行的容器。
- exec:执行命令到容器。
- port-forward:转发一个或多个本地端口到 Pod 。
- porxy:运行一个 Porxy 到 API Server。
- cp:拷贝文件或目录到容器中。
- auth:检查授权。
5、高级命令
- apply:通过文件名或标准输入对资源应用配置。
- patch:通过补丁修改、更新资源字段。
- replace:通过文件名或标准输入替换一个资源。
- covert:不同 API 版本之间转换配置文件。
6、设置命令
- lable:更新资源上的标签。
- annotate:更新资源上的注释。
- completion:用于实现 kubectl 工具自动补全。
7、其他命令
- api-versions:打印受支持的 API 版本。
- api-resources:打印受支持的资源类型。
- config:修改 kubernetes 文件(用于访问 API 的连接和认证信息等)。
- help:所有帮助命令。
- plugin:运行一个命令行插件。
- version:打印客户端和服务版本信息。
更多指令使用指南请阅读【http://docs.kubernetes.org.cn/683.html】
3.集群部署拓扑图
网络资源规划:
1、Master 主控节点
- 主机名:k8s-master
- IP:192.168.0.20
- 程序:kube-apiserver,kube-controllermanager,kube-scheduler
- 操作系统:CentOS8
2、Node 工作节点
节点名 | 主机名 | IP 地址 | 程序 | 操作系统 |
---|---|---|---|---|
工作节点-1 | k8s-node1 | 192.168.0.31 | kubelet,kube-proxy,docker | CentOS8 |
工作节点-2 | k8s-node2 | 192.168.0.32 | kubelet,kube-proxy,docker | CentOS8 |
工作节点≥3 | k8s-node3 | 192.168.0.33 | kubelet,kube-proxy,docker | CentOS8 |
3、Etcd 节点
节点名 | 主机名 | IP 地址 | 程序 | 操作系统 |
---|---|---|---|---|
Etcd 节点-1 | k8s-etcd1 | 192.168.0.41 | etcd | CentOS8 |
Etcd 节点-2 | k8s-etcd2 | 192.168.0.42 | etcd | CentOS8 |
Etcd 节点≥3 | k8s-etcd3 | 192.168.0.43 | etcd | CentOS8 |
4、SSL 证书服务器
- 主机名:k8s-ssl
- IP:192.168.0.50
- 程序:CFSSL,OpenSSL
- 操作系统:CentOS8
5、K8s 集群网络
- Service 子网 IP 段:10.0.0.0/16。用于为 Pod 中发布的服务自动分配 IP 地址。
- CNI 子网 IP 段:10.254.0.0/16。用于为 Pod 中部署的容器自动分配 IP 地址。
4.应用资源编排部署
应用部署时,Node 工作节点会检查本地节点是否已存在镜像,如果不存在则会自动从 Docker Hub 中下载镜像。
如果在互联网中,由于国外的 Docker Hub 限速会导致长时间部署不成功,建议通过 Docker 将镜像下载到所有的 Node 工作节点本地仓库后再创建容器。
如果部署在隔离网络中,需要首先在能够连接互联网且装有 docker 的代理主机上拉取镜像到本地,然后从代理主机上将镜像导入到所有的 Node 工作节点上。
Docker 获取镜像的指令:
docker pull nginx:latest如何安装 Docker 及拉取、导出、导入镜像,请阅读文章《RedHat/CentOS8【Docker】镜像制作编排和容器部署》【https://www.jianshu.com/p/a4198b127729】。
4.1.使用命令部署应用
在任意 Master 主控节点上执行以下操作步骤:
1、部署 Pod。
[centos@k8s-master ~]$ kubectl create deployment web --image=nginx:latest
格式:kubectl create deployment nane --image [--dry-run=server|client|none]
参数:
nane:资源名称。
--image:资源镜像名称。
--dry-run:试运行模式,不实际创建。
2、暴露 Service。
[centos@k8s-master ~]$ kubectl expose deployment web --port=80 --type=NodePort
格式: kubectl expose deployment web [--port] [--protocol=TCP|UDP|SCTP] [--target-port] [--name][--type=ClusterIP|NodePort|LoadBalancer|ExternalName] [--dry-run=server|client|none]
参数:
name:资源名称。
--port:Pod 暴露给服务的端口号,应与 Pod 提供服务的端口号一致。
--protocol:Pod 暴露给服务的端口协议,应与 Pod 提供服务的协议一致。默认为 "TCP" 协议。
--target-port:Pod 接收服务流量的端口号,应与 Pod 暴露给服务的端口号一致。默认值为 Pod 暴露给服务的端口号。
--name:部署服务、端点的名字。默认值为资源名称。
--type:暴露可访问类型,"ClusterIP" 表示仅集群内部访问,"NodePort" 表示通过端口映射访问,其他不常用。默认值 "ClusterIP" 。
--dry-run:试运行模式,不实际创建。
3、查看部署资源。
[centos@k8s-master ~]$ kubectl get deploy,pod,ep,svc -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/web 1/1 1 1 72m nginx nginx:latest app=web
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/web-756987f8f4-c9q92 1/1 Running 0 72m 10.254.1.56 k8s-node1
NAME ENDPOINTS AGE
endpoints/web 10.254.1.56:80 6m6s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/web NodePort 10.0.104.29 80:32660/TCP 6m6s app=web
4.2.使用 YAML 文件部署应用
YAML 编写规范请阅读文章【https://www.runoob.com/w3cnote/yaml-intro.html】
在任意 Master 主控节点上执行以下操作步骤:
1、从命令中创建 YAML 文件。
# 创建空的 YAML 文件。
[centos@k8s-master ~]$ touch nginx.yaml
# 通过试运行模式执行命令,追加 deployment 资源的 YAML 内容到 nginx.yaml 文件中。
[centos@k8s-master ~]$ kubectl create deployment webapp --image=nginx:latest -o yaml --dry-run=client >> nginx.yaml
# 追加分隔符,YAML 使用 '---' 来分隔多个不同的 YAML 内容。
[centos@k8s-master ~]$ echo '---' >> nginx.yaml
# 通过试运行模式执行命令,追加 service 资源的 YAML 内容到 nginx.yaml 文件中。
[centos@k8s-master ~]$ kubectl expose deployment webapp --port=80 --type=NodePort -o yaml --dry-run=client >> nginx.yaml
2、编辑 YAML 文件。
使用文本编辑器打开 YAML 文件:
[centos@k8s-master ~]$ gedit nginx.yaml
修改文件内容如下并保存:
apiVersion: apps/v1
# kind: DaemonSet
# 如果将 kind 属性设置为 DaemonSet,镜像会在所有的 Node 工作节点中部署。
kind: Deployment
metadata:
# 资源标签
labels:
app: webapp
# 资源名称
name: webapp
# 资源命名空间
namespace: default
spec:
# 表示 Pod 副本数,默认为 1, 扩容 Pod 副本可实现负载均衡,Pod 最大副本数建议与 Node 工作节点数
# 当 Kind 修改为 “DaemonSet” 时,此属性不适用,注释或删除改属性。
# replicas: 2
replicas: 2
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
# 当增加 hostNetwork 属性并设置为 true 时,表示使用宿主机的网络空间,设置为 false 或不设置表示使用容器内部的网络空间。
# hostNetwork: true
containers:
- image: nginx:latest
name: nginx
# 挂载外部存储
# volumeMounts:
# 容器内挂载路径
# - mountPath: /data/hostPath/
# 挂载存储资源的名称,名称与 volume 中 name 设置值一致
# name: host
# - mountPath: /data/emptyDir/
# name: shared
# - mountPath: /data/nfs
# name: nfs
# 外部存储资源
# volumes:
# 资源名称
# - name: host
# 资源类型(hostPath 表示使用 Pod 容器所在宿主机的磁盘位置,当 Pod 容器迁移时,不会同步迁移数据。使用宿主机本地磁盘可以做数据半版持久化存储,但使用宿主机挂载的网络磁盘则可以做持久化存储。)
# hostPath:
# 资源位置
# path: /host
# - name: shared
# 资源类型(emptyDir 表示使用临时交换空间,当 Pod 启动时自动在宿主机上开辟空间,Pod 销毁时自动销毁。不能做数据持久化存储。)
# emptyDir: {}
# - name: nfs
# 资源类型(nfs 表示使用 NFS 存储服务器的网络存储位置。可以做持久化存储。)
# server: 192.168.115.6
# path: /nfs
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
# 资源标签
labels:
app: webapp
# 资源名称
name: webapp
# 资源命名空间
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
# 设置值为暴露到宿主机网络的端口号(取值范围:30000-32767),不设置时随机取值
nodePort: 30001
selector:
app: webapp
type: NodePort
3、部署 YAML 文件声明的资源。
[centos@k8s-master ~]$ kubectl apply -f nginx.yaml
4、查看部署资源。
[centos@k8s-master ~]$ kubectl get deploy,pod,ep,svc,ing -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/webapp 2/2 2 2 20m nginx nginx:latest app=webapp
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/webapp-7db8b4f789-5qxpx 1/1 Running 2 20m 10.254.0.34 k8s-node2
pod/webapp-7db8b4f789-wplfs 1/1 Running 0 20m 10.254.1.57 k8s-node1
NAME ENDPOINTS AGE
endpoints/webapp 10.254.0.34:80,10.254.1.57:80 8s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/webapp NodePort 10.0.139.121 80:32132/TCP 8s app=webapp
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-web ingress.web 80 20h
ingress-web-ssl ingress.web.ssl 80, 443 18h
5、创建、更新、删除、创建+更新 YAML 文件声明的资源。
# 创建+更新部署资源
[centos@k8s-master ~]$ kubectl apply -f nginx.yaml
# 创建部署资源
[centos@k8s-master ~]$ kubectl create -f nginx.yaml
# 更新部署资源
[centos@k8s-master ~]$ kubectl update -f nginx.yaml
# 删除部署资源
[centos@k8s-master ~]$ kubectl delete -f nginx.yaml
5.运维管理
1、使用帮助
# 获取受支持的 API 版本。
[centos@k8s-master ~]$ kubectl api-versions
# 获取受支持的资源类型。
[centos@k8s-master ~]$ kubectl api-resources
# 获取命令行使用帮助。
[centos@k8s-master ~]$ kubectl api-resources
2、资源管理
# 查看 Node 详细信息
[centos@k8s-master ~]$ kubectl get node -n default -o wide
# 查看 Pod 详细信息
[centos@k8s-master ~]$ kubectl get pod -n default -o wide
# 查看 Pod 运行事件信息
[centos@k8s-master ~]$ kubectl describe pod web-756987f8f4-c9q92 -n default
# 查看 Endpoint 详细信息
[centos@k8s-master ~]$ kubectl get ep -n default -o wide
# 查看 Service 详细信息
[centos@k8s-master ~]$ kubectl get svc -n default -o wide
# 查看 Deployment 详细信息
[centos@k8s-master ~]$ kubectl get deploy -n default -o wide
# 查看 Ingress 详细信息
[centos@k8s-master ~]$ kubectl get ing -n default -o wide
# 同时查看多个资源详细信息
[centos@k8s-master ~]$ kubectl get deploy,node,pod,ep,svc,ing -n default -o wide
# 升级 Pod 容器的镜像
[centos@k8s-master ~]$ kubectl set image deployment/web nginx=nginx:1.15 -n default
# 查看 Pod 容器镜像的升级状态
[centos@k8s-master ~]$ kubectl rollout status deployment/web
# 扩(缩)融 Pod 容器,--replicas 表示 Pod 副本数,默认为 1, 扩容 Pod 副本可实现负载均衡,Pod 最大副本数建议与 Node 工作节点数。
[centos@k8s-master ~]$ kubectl scale deployment/web --replicas=2
# 查看 Pod 容器的历史版本
[centos@k8s-master ~]$ kubectl rollout history deployment/web
# 将 Pod 回滚到上一个版本
[centos@k8s-master ~]$ kubectl rollout undo deployment/web
# 将 Pod 回滚到指定的版本
[centos@k8s-master ~]$ kubectl rollout undo deployment/web --revision=2
3、容器管理
# 查看容器运行日志
[centos@k8s-master ~]$ kubectl logs web-756987f8f4-c9q92 -n default
# 在容器中执行命令
[centos@k8s-master ~]$ kubectl exec web-756987f8f4-c9q92 ls -n default
# 进入容器
[centos@k8s-master ~]$ kubectl exec -it web-756987f8f4-c9q92 bash -n default
# 从宿主机向容器中拷贝文件
[centos@k8s-master ~]$ kubectl cp srcile.txt web-756987f8f4-c9q92:/var/destfile.txt -n default
# 从容器向宿主机中拷贝文件
[centos@k8s-master ~]$ kubectl cp web-756987f8f4-c9q92:/var/srcfile.txt destfile.txt -n default
# 创建容器
[centos@k8s-master ~]$ kubectl run busybox-container --image=busybox:1.28.4 bash
# 创建容器并进入命令行
[centos@k8s-master ~]$ kubectl run -it busybox-container2 --image=busybox:1.28.4 bash
# 创建容器并进入命令行,并在退出容器时自动删除(一般用于测试)
[centos@k8s-master ~]$ kubectl run -it --rm busybox-container --image=busybox:1.28.4 bash
4、集群管理
# 显示集群 API Server 和 Service 的地址
[centos@k8s-master ~]$ kubectl cluster-info
# 显示集群当前状态
[centos@k8s-master ~]$ kubectl cluster-info dump
# 显示集群当前状态,并输出到指定目录
[centos@k8s-master ~]$ kubectl cluster-info dump --output-directory=/tmp/cluster-state
# 标记工作节点 "k8s-node1" 为不可调度状态
[centos@k8s-master ~]$ kubectl cordon k8s-node1
# 标记工作节点 "k8s-node1" 为可调度状态,或用于恢复已排除的工作节点
[centos@k8s-master ~]$ kubectl uncordon k8s-node1
# 排除工作节点 "k8s-node1" 上的 Pod,排除前需要先将该节点标记为不可调度状态
[centos@k8s-master ~]$ kubectl drain k8s-node1
附录一 更多学习资料
K8s 中文文档【https://www.kubernetes.org.cn/docs】
K8s 中文文档【https://kubernetes.io/zh/docs/home/】
K8s 指令使用指南【http://docs.kubernetes.org.cn/683.html】
YAML 编写规范【https://www.runoob.com/w3cnote/yaml-intro.html】
附录二 安装 kubectl 命令补全工具
1、使用 yum 源安装语法补全工具 bash-completion 。
[centos@k8s-master ~]$ sudo dnf install bash-completion
2、配置当前 Shell 的 kubectl 命令补全。
[centos@k8s-master ~]$ source /usr/share/bash-completion/bash_completion
[centos@k8s-master ~]$ source <(kubectl completion bash)
3、永久配置当前用户 Shell 的 kubectl 命令补全。
[centos@k8s-master ~]$ echo "source <(kubectl completion bash)" >> ~/.bashrc
[centos@k8s-master ~]$ bash
3、在 Shell 中输入 "kubectl" 指令后按 "Tab" 键测试。
[centos@k8s-master ~]$ kubectl
alpha attach completion create edit kustomize plugin run uncordon
annotate auth config delete exec label port-forward scale version
api-resources autoscale convert describe explain logs proxy set wait
api-versions certificate cordon diff expose options replace taint
apply cluster-info cp drain get patch rollout top