使用 Kubectl 管理 Kubernetes 容器平台

  • 一、Kubectl 概述
  • 二、Kubectl 创建和删除 Pod 相关操作
  • 1.在集群上运行一个镜像
  • 2.Kubectl run 语法
  • 3.Pod 常见的状态
  • 3.使用 Kubectl Delete 删除创建的对象
  • 1)删除 Pod
  • 2)删除 Deployment
  • 三、YAML 语法规则
  • 1.YAML 语法的基本语法规则
  • 2.YAML 支持的三种数据结构
  • 四、Kubectl Create 创建 Deployment
  • 1.生成 Deployment 文件
  • 2.使用 Create 创建 Deployment
  • 3.使用 Get 命令查看 Pod 详细信息
  • 4.使用 Describe 查看 K8s 中的详细信息
  • 五、Kubectl 其他常用命令和参数说明
  • 1.Kubectl Logs
  • 2.Kubectl Exec
  • 3.Kubectl Attach
  • 六、使用 Kubectl 管理集群中 Deployment 资源和 Service 服务
  • 1.生成 Deployment 和 Service 服务的配置文件
  • 2.创建 Deployment 和 Serveice

准备工作:

一、Kubectl 概述

Kubectl 是一个用于操作 Kubernetes 集群的命令行接口,通过利用 Kubectl 的各种命令可以实现各种功能。

二、Kubectl 创建和删除 Pod 相关操作

命令

说明

run

在集群上运行一个 Pod

create

使用文件或标准输入的方式创建一个 Pod

delete

使用文件或者标准输入以及资源名称或者标签选择器来删除某个 Pod

1.在集群上运行一个镜像

docker.io-nginx.tarpod-infrastructure.tar 上传到 node1node2 上并导入镜像:

[root@node1 ~]# ls
anaconda-ks.cfg      k8s-package         pod-infrastructure.tar
docker.io-nginx.tar  k8s-package.tar.gz
[root@node1 ~]# docker load -i docker.io-nginx.tar 
[root@node1 ~]# docker load -i pod-infrastructure.tar

kubernetes 默认 storageclass kubernetes 默认 容器_kubernetes

2.Kubectl run 语法

Kubectl run 和 Docker run 一样,Kubectl run 能将一个 Pod 运行起来。

  • 格式kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas]

在 master 上启动 Pod:

[root@master ~]# kubectl run nginx-1 --image=docker.io/nginx --replicas=1 --port=9000

kubernetes 默认 storageclass kubernetes 默认 容器_管理K8s容器平台_02


查看 Deployment:

[root@master ~]# kubectl get deployment

kubernetes 默认 storageclass kubernetes 默认 容器_kubernetes_03


查看生成的 Pod,Kubernetes 将容器运行在 Pod 中以方便实施卷和网络共享等管理:

[root@master ~]# kubectl get pods

kubernetes 默认 storageclass kubernetes 默认 容器_容器_04

3.Pod 常见的状态

  • Running:正常运行的状态。
  • ContainerCreating:容器正在创建。
  • ImagePullBackOff:镜像拉取失败。
  • terminating:终止,删除 Pod 时的状态。

3.使用 Kubectl Delete 删除创建的对象

1)删除 Pod

[root@master ~]# kubectl delete pod nginx-1-2637872784-5kg5l
[root@master ~]# kubectl get pod

kubernetes 默认 storageclass kubernetes 默认 容器_运维_05


过 2 分钟左右,再次确认,发现已经运行

kubernetes 默认 storageclass kubernetes 默认 容器_管理K8s容器平台_06

2)删除 Deployment

直接删除 Pod 触发了 Replicas 的确保机制,所以需要删除 Deployment

[root@master ~]# kubectl delete deployment nginx-1
[root@master ~]# kubectl get pod

kubernetes 默认 storageclass kubernetes 默认 容器_运维_07

三、YAML 语法规则

YAML 语言的设计目标,就是方便人类读写。它实质上是一种数据串行化格式。

1.YAML 语法的基本语法规则

  • 大小写敏感。
  • 使用缩进表示层级关系。
  • 缩进时不允许使用 Tab 键,只允许使用空格。
  • # 表示注释,从这个字符一直到行尾,都会被解析器忽略。
  • 在 YAML 里面,连续的项目(如:数组元素、集合元素)通过减号 - 来表示,Map 结构里面的键值对 key/value 用冒号 : 来分割。

2.YAML 支持的三种数据结构

  • 对象:键值对的集合,又称为 mapping 映射,hashes 哈希,dictionary 字典。
  • 数组:一组按次序排列的值,又称为 sequence 序列,list 列表。
  • 纯量(scalars):单个的、不可再分的值。

四、Kubectl Create 创建 Deployment

  • 使用 Kubectl run 在配置很复杂的需求时,需要非常长的一条语句,也很容易出错,也没法保存;
  • 所以更多场景下会使用 yaml 或者json 文件。

1.生成 Deployment 文件

上传 docker.io-mysql-mysql-server.tarnode1node2 上:

[root@node1 ~]# docker load -i docker.io-mysql-mysql-server.tar

编写 Deployment 文件:

[root@master ~]# vim mysql-deployment.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: mysql
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: mysql
    spec:
      containers:
      - name: mysql
        image: docker.io/mysql/mysql-server
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3306
          protocol: TCP
        env:
          - name: MYSQL_ROOT_PASSWORD
            value: "123123"

kubernetes 默认 storageclass kubernetes 默认 容器_管理K8s容器平台_08

2.使用 Create 创建 Deployment

[root@master ~]# kubectl create -f mysql-deployment.yaml

kubernetes 默认 storageclass kubernetes 默认 容器_运维_09

  • 注意:当一个目录下,有多个 yaml 文件的时候,使用 kubectl create -f 目录 的方式一下全部创建。

3.使用 Get 命令查看 Pod 详细信息

[root@master ~]# kubectl get pod
[root@master ~]# kubectl get deployment

kubernetes 默认 storageclass kubernetes 默认 容器_管理K8s容器平台_10


加上 -o wide 参数可以查看更详细的信息,如:看 Pod 在哪个 Node 上运行,Pod 的 IP 地址等信息。

[root@master ~]# kubectl get pod -o wide

kubernetes 默认 storageclass kubernetes 默认 容器_运维_11

  • 注意:10.255.5.2 这个 IP 地址是 flannel 中定义的网段中的一个 IP 地址(Pod 通过这个 IP 和 Master 进行通信)

node2 上查看运行的 Container:

[root@node2 ~]# docker ps

kubernetes 默认 storageclass kubernetes 默认 容器_容器_12

4.使用 Describe 查看 K8s 中的详细信息

命令

作用

kubectl describe pod Pod-ID

查看 Pod 的详细描述信息

kubectl describe node Node-ID

查看 Node 的详细描述信息

kubectl describe deployment Deployment-ID

查看 Deployment 的详细描述信息

五、Kubectl 其他常用命令和参数说明

命令

说明

logs

查看 Pod 的日志信息

exec

在 Pod 中执行一条命令

cp

从容器拷出或向容器拷入文件

attach

到一个运行中的容器上,实时查看容器消息

1.Kubectl Logs

[root@master ~]# kubectl get pod
[root@master ~]# kubectl logs mysql-2388517676-588kb

kubernetes 默认 storageclass kubernetes 默认 容器_运维_13

2.Kubectl Exec

exec 命令用于到 pod 中执行一条命令。

[root@master ~]# kubectl get pod
[root@master ~]# kubectl exec -it mysql-2388517676-588kb -- /bin/bash
bash-4.2# exit

3.Kubectl Attach

attach 用于取得 Pod 中容器的实时信息,可以持续不断实时的取出消息。

[root@master ~]# kubectl attach mysql-2388517676-588kb

kubernetes 默认 storageclass kubernetes 默认 容器_容器_14

  • 到现在,所创建 Nginx 和 MySQL 都只是 Deployment,并没有对应 Service 服务;
  • 所以现在还不能直接在外网进行访问 Nginx 和 MySQL 服务。

六、使用 Kubectl 管理集群中 Deployment 资源和 Service 服务

1.生成 Deployment 和 Service 服务的配置文件

使用 Deployment 方式启动 Nginx 的 Pod 和 Service:

[root@master ~]# vim nginx-deployment.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
      - name: nginx
        image:  docker.io/nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP

创建 Service:

[root@master ~]# vim nginx-svc.yaml							# 创建 Service
kind: Service
apiVersion: v1
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  type: NodePort
  ports:
  - protocol: TCP
    nodePort: 31001
    targetPort: 80
    port: 80
  selector:
    name: nginx

kubernetes 默认 storageclass kubernetes 默认 容器_Kubectl_15

2.创建 Deployment 和 Serveice

[root@master ~]# kubectl create -f nginx-deployment.yaml 
[root@master ~]# kubectl create -f nginx-svc.yaml

kubernetes 默认 storageclass kubernetes 默认 容器_kubernetes_16


查看:

[root@master ~]# kubectl get service
或者
[root@master ~]# kubectl get svc

kubernetes 默认 storageclass kubernetes 默认 容器_kubernetes_17


查看详细信息:

[root@master ~]# kubectl get pod -o wide

kubernetes 默认 storageclass kubernetes 默认 容器_kubernetes_18

  • 现在 Nginx Pod 的 80 端口已经映射到 Node 节点的 31001 端口上。

使用浏览器访问验证:

kubernetes 默认 storageclass kubernetes 默认 容器_kubernetes_19


尽管 Nginx Pod 是在 node1 运行的,但我们去访问任意 node,都可以正常访问 Nginx 的;因为已经做了负载均衡,所以在 node2 上也可以成功访问 Web 服务。

kubernetes 默认 storageclass kubernetes 默认 容器_kubernetes_20


修改一下默认主页:

[root@master ~]# kubectl get pod
[root@master ~]# kubectl exec -it nginx-1011335894-shsfx bash
root@nginx-1011335894-shsfx:/# echo Nginx > /usr/share/nginx/html/index.html     
root@nginx-1011335894-shsfx:/# exit

kubernetes 默认 storageclass kubernetes 默认 容器_容器_21


使用浏览器访问测试:

kubernetes 默认 storageclass kubernetes 默认 容器_运维_22