云原生架构之【Kubernetes(K8s)】第四部分:资源编排

2020-09-04  本文已影响0人  张毅SOHO

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]

示例 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、基础命令

2、部署命令

3、集群管理命令

4、故障诊断和调试命令

5、高级命令

6、设置命令

7、其他命令

更多指令使用指南请阅读【http://docs.kubernetes.org.cn/683.html


3.集群部署拓扑图

K8s 集群拓扑图

网络资源规划:

1、Master 主控节点

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 证书服务器

5、K8s 集群网络


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    
上一篇 下一篇

猜你喜欢

热点阅读