云原生架构之【Kubernetes(K8s)】第四部分:资源编排部署和运维管理

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.集群部署拓扑图

K8s 集群拓扑图

网络资源规划:

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   <none>           <none>

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   <none>        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   <none>           <none>
pod/webapp-7db8b4f789-wplfs   1/1     Running   0          20m    10.254.1.57   k8s-node1   <none>           <none>

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   <none>        80:32132/TCP   8s     app=webapp

NAME              CLASS    HOSTS             ADDRESS   PORTS     AGE
ingress-web       <none>   ingress.web                 80        20h
ingress-web-ssl   <none>   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    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342