一、kubectl命令

1.kubectl概述

kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口

kubectl 是官方的 CLI 命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径。

2.资源概述

kubernetes中所有内容都抽象为资源,可以通过一下内容查:

kubectl api-resources

Deployment、Service、Pod 是 k8s 最核心的 3 个资源对象

  • Deployment: 最常见的无状态应用的控制器,支持应用的扩缩容、滚动更新等操作
  • Service: 为弹性变动且存在生命周期的 Pod 对象提供了一个固定的访问接口,用于服务发现和服务访问
  • Pod: 是运行容器以及调度的最小单位。同一个 Pod 可以同时运行多个容器
资源分类资源名称缩写资源作用
集群级别资源nodesno集群组成部分
namespacesns隔离 Pod
pod 资源podspo装载容器
pod 资源控制器replicationcontrollersrc控制 pod 资源
replicasetsrs控制 pod 资源
deploymentsdeploy控制 pod 资源
daemonsetsds控制 pod 资源
jobs控制 pod 资源
cronJobscj控制 pod 资源
horizontalpodautoscalershpa控制 pod 资源
statefulsetssts控制 pod 资源
服务发现资源servicessvc统一 pod 对外接口
ingressing统一 pod 对外接口
存储资源volumeattachments存储
persistentvolumespv存储
persistentvolumeclaimspvc存储
配置资源configmapscm配置
secrets配置

3.客户端配置kubectl命令

master主机执行kube命令

kubectl get nodes

node主机执行kubectl命令

kubectl get nodes

  • 原因:kubectl 会将命令发送给 apiserver 接口,但 apiserver 部署在 master 节点上,因此在 node 节点执行 kubectl 命令时,无法将命令发送给 apiserver。
  • 解决思路:告诉 node 节点将 kubectl 命令发送给 master 主机的 apiserver 接口。
  • 实现方法:将 master 上的.kube文件复制到 node 节点上。

执行命令

scp -r $HOME/.kube node1:$HOME/

此时在node节点也能够执行kubectl命令了

4.kubectl常用命令

kubectl 是 kubernetes 集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl 命令的语法如下:

kubectl [command] [type] [name] [flags]

command:指定要对资源执行的操作,例如create、get、delete
type:指定资源类型,比如deployment、pod、service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数

其中kubectl常用命令

命令分类命令翻译命令作用
基本命令create创建创建一个资源
edit编辑编辑一个资源
get获取获取一个资源
patch更新更新一个资源
delete删除删除一个资源
explain解释展示资源文档
运行和调试run运行在集群中运行一个指定的镜像
expose暴露暴露资源为 Service
describe描述显示资源内部信息
logs日志输出容器在 pod 中的日志输出容器在 pod 中的日志
attach缠绕进入运行中的容器进入运行中的容器
exec执行容器中的一个命令执行容器中的一个命令
cp复制在 Pod 内外复制文件
rollout首次展示管理资源的发布
scale规模扩 (缩) 容 Pod 的数量
autoscale自动调整自动调整 Pod 的数量
高级命令applyrc通过文件对资源进行配置
label标签更新资源上的标签
其他命令cluster-info集群信息显示集群信息
version版本显示当前 Server 和 Client 的版本

示例:

1)示例创建删除查看pod命名空间

kubectl create namescpace dev
kubectl get namespaces
kubectl get ns
1.创建了一个namespaces名字为demo
2.在demo里面添加一个nginx的pod镜像
kubectl run nginx-pod --image=nginx:latest -n demo

3.查看命名空间的所有pod
# 这个节点的详细信息
kubectl get pods -n demo -o wide

# 这个节点的信息
kubectl get pods -n demo

访问也是能够访问的,在不同节点里面都也是能够访问的

4.查看这个pod节点的详细信息
kube describe pods nginx-pod -n demo

5.删除这个命名空间的指定的pod
kubectl delete pod nginx-pod -n demo
6.删除这个demo
因为pod是依赖于命名空间的,因此删除命名空间的时候会连同命名空间删除

这个命名空间就是用来隔离pod资源的,如果在创建pod的时候没有指定命名空间的话就会默认创建到default里面

2)练习

1. 查询所有的 node 节点的状态
kubectl get nodes

2. 查询所有的 deployment
kubectl get deployments

3. 查询所有的 namespace
kubectl get ns

4. 查询所有的 pods 的详细信息
kubectl get pods -o -wide -A

5. 查询指定 pod 的详细信息
kubectl get pod 

还可以用describe查看详细信息

kubectl describe pod nginx-pod -n demo

6. 查询指定 namespace 下面所有的 pod 的信息
kubectl get pods -n default

7. 查询所有 service 的信息

二、对象配置

所谓对象配置就是创建 deployment,service,namespace,pod 等信息,对象配置总共有以下两种方式:

  • 命令式配置
  • 声明式配置

1.命令式配置

kubectl create deployment nginx --image=nginx:latest           # 创建一个deployment并创建pod
kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort  # 创建service

2.声明式配置

声明式配置主要是通过配置文件的方式来运行,类似与我们之前服务编排写的 compose 文件,文件的类型也主要是 yaml 类型

1)模板文件

apiVersion: v1                   # 文档的版本
kind: Namespace                  # 资源对象的类型:deployment, namespace, pod等
metadata:                        # 元数据,用于描述资源
  name: dev                      # 指定资源的名称
---
apiVersion: v1                   # 文档的版本
kind: Pod                        # 资源对象的类型:deployment, namespace, pod等
metadata:
  name:                          # 名称
  namespace:                     # 使用的命名空间
spec:                            # 规约,就是创建资源时相关的要求
  containers:                    # 容器信息
  - name:                        # 容器的名称
    image:                       # 容器的镜像
    imagePullPolicy:             # 镜像拉取策略
    command:                     # 指定容器启动命令

其中拉去镜像的三种方式

策略值英文名称核心行为
Always总是拉取每次启动容器都从仓库拉取,无论本地是否存在
IfNotPresent本地不存在时拉取本地有镜像直接使用,无镜像则从仓库拉取(默认策略)
Never永不拉取仅使用本地已存在镜像,不尝试远程拉取;本地无镜像则启动失败

查询资源对应的属性和值

kubectl explain pod.spec.containers

3)练习

需求:使用声明式的方式创建资源,具体的要求如下:

  1. 创建一个 namespace 名字为 dev
  2. 创建一个 pod,运行 nginx 的最新版本
  3. 指定镜像的拉取策略是本地有就使用本地的,没有就从远程拉取
  4. 指定 nginx 非后台运行
  5. 指定暴露的端口为 80
  6. 运行容器之后切换到 /user/share/nginx 目录
# 创建一个存放yml文件的目录
cd
mkdir pods
vim nginx-pod.yml
apiVersion: v1
kind: Namespace
metadata:
  name: nginx-ns
---
apiVersion: v1
kind: Pod
metadata:
  name: nginxpod
  namespace: nginx-ns
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    command:
    - nginx
    - -g
    - 'daemon off;'
    ports:
    - name: http
      containerPort: 80
      protocol: TCP
    workingDir: /usr/share/nginx
# 执行
kubectl apply -f nginx-pod.yml

删除整个创建的命名空间以及里面的容器

三、案例演示

1.Namespace

Namespace 是 kubernetes 系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。

默认情况下,kubernetes 集群中的所有的 Pod 都是可以相互访问的。但是在实际中,可能不想让两个 Pod 之间进行互相的访问,那此时就可以将两个 Pod 划分到不同的 namespace 下。kubernetes 通过将集群内部的资源分配到不同的 Namespace 中,可以形成逻辑上的 “组”,以方便不同的组的资源进行隔离使用和管理。

可以通过 kubernetes 的授权机制,将不同的 namespace 交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合 kubernetes 的资源配额机制,限定不同租户能占用的资源,例如 CPU 使用量、内存使用量等等,来实现租户可用资源的管理。

kbuernetes在集群启动后,会默认创建结果namespace

kubectl get namespace

NAME              STATUS   AGE
default           Active   45h    # 所有未指定Namespace的对象都会被分配在default命名空间
kube-flannel      Active   17h    # flannel插件创建的命名空间
kube-node-lease   Active   45h    # 集群节点之间的心跳维护,v1.13开始引入
kube-public       Active   45h    # 此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system       Active   45h    # 所有由Kubernetes系统创建的资源都处于这个命名空间

1)查看namespace资源的具体操作

# 1.查看所有的ns  命令:kubectl get ns
kubectl get ns

# 2.查看指定的ns 命令:kubectl get ns ns的名字
kubectl get ns demo

# 3.指定输出格式 命令:kubectl get ns ns名称 -o 参数歌手
# 其中常见的参数格式有很多常见的就有json,yaml, wide
kubectl get ns demo -o yaml

# 4.查看命名空间的详情
kubectl describe pod demo-pod

2)创建namespace

kubectl get ns demo

3)删除namespace

kubectl delete ns demo

4)配置方式

首先准备一个yaml文件:ns-demo.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: ns-demo

执行命令就能够创建

2.Pod

Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。

1)创建pod

通常情况下pod是不会单独创建pod的,一般都是创建一个deployment

kubectl run nginx-pod --image=nginx:latest --port=80 -n demo

2)查看pod的信息

# 查看pod信息
kubectl get pod nginx-pod -n demo

# 查看详细的pod信息
kubectl describe pod nginx-pod -n demo -o wide

# 查看所有pod的信息
kubectl get pods --all-namespaces
kubectl get pods -A

3)访问pod

# 先查询到pod的信息,在访问pod
kubectl get pods -n demo -o wide

4)删除指定的pod

# 删除pod节点里面的nginxpod
kubectl delete pod nginxpod -n demo

5)配置操作

创建一个nginx.yml文件

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
spec:
  containers:
  - image: nginx:latest
    name: nginx
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

执行文件里面的操作

kubectl apply -f nginx.yml
kubectl delete -f nginx.yml

3.Label

Label 是 kubernetes 系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。

Label特点

1.一个 Label 会以key/value键值对的形式附加到各种对象上,如 Node、Pod、Service 等等

2.一个资源对象可以定义任意数量的 Label,同一个 Label 也可以被添加到任意数量的资源对象上去

3.Label 通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除

可以通过 Label 实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。

常见的标签

  • 版本标签: "version":"release", "version":"stable"...
  • 环境标签: "environment":"dev", "environment":"test", "environment":"pro"
  • 架构标签: "tier":"frontend", "tier":"backend"

当前有两种 Label Selector:

1.基于等式的 Label Selector

name = slave: 选择所有包含 Label 中 key="name" 且 value="slave" 的对象

env != production: 选择所有包括 Label 中的 key="env" 且 value 不等于 "production" 的对象

2.基于集合的Label Selector

name in (master, slave): 选择所有包含 Label 中的 key="name" 且 value="master" 或 "slave" 的对象

name not in (frontend): 选择所有包含 Label 中的 key="name" 且 value 不等于 "frontend" 的对象

3.多种组合选择

标签的选择条件可以使用多个,此时将多个 Label Selector 进行组合,使用逗号,进行分隔即可。例如:

name=slave,env!=production
name not in (frontend),env!=production

1)常用命令

# 为pod资源打标签
[root@master001 ~]# kubectl label pod nginx-pod version=1.0 -n dev
pod/nginx-pod labeled

# 为pod资源更新标签
[root@master001 ~]# kubectl label pod nginx-pod version=2.0 -n dev --overwrite
pod/nginx-pod labeled

# 查看标签
[root@master001 ~]# kubectl get pod nginx-pod -n dev --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          10m   version=2.0

# 筛选标签
[root@master001 ~]# kubectl get pod -n dev -l version=2.0 --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          17m   version=2.0

[root@master001 ~]# kubectl get pod -n dev -l version!=2.0 --show-labels
No resources found in dev namespace.

# 删除标签
[root@master01 pods]# kubectl label pod nginx-pod -n dev env-
pod/nginx-pod unlabeled

[root@master01 pods]# kubectl get pod nginx-pod -n dev --show-labels
NAME        READY   STATUS    RESTARTS   AGE     LABELS
nginx-pod   1/1     Running   0          4m52s   version=2.0

2)配置方式

# 创建xml文件或者yaml文件 vim label-pod.xml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: nginx-ns
  labels:
    env: "por"
    version: "1.0"
spec:
  containers:
  - image: nginx:latest
    name: nginx-container
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP



###########################
执行文件:
kubectl apply -f label-pod.xml

执行过后查看

4.deployment

在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。

在kubernetes中Pod控制器的种类有很多这里使用Deployment。

1)常用命令

# 命令格式:kubectl create deployment 名称 [参数]
# --image  指定pod的镜像
# --port   指定端口
# --replicas  指定创建pod数量
# --namespace  指定namespace
kubectl create deployment nginx --image=nginx:latest --port=80 --replicas=3 -n nginx-ns
# deployment.apps/nginx created

# 查看创建的Pod
kubectl get pod -n dev
# NAME                     READY   STATUS    RESTARTS   AGE
# nginx-8d545c96d-58vnf     1/1     Running   0          20s
# nginx-8d545c96d-7q2bf     1/1     Running   0          20s
# nginx-8d545c96d-x2mmc     1/1     Running   0          20s

# 查看deployment的信息
kubectl get deploy -n dev
# NAME    READY   UP-TO-DATE   AVAILABLE   AGE
# nginx   3/3     3            3           43s

# UP-TO-DATE: 成功升级的副本数量
# AVAILABLE: 可用副本的数量
kubectl get deploy -n dev -o wide
# NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
# nginx   3/3     3            3           67s   nginx        nginx:latest   app=nginx

2)配置方式

创建一个Deploy-nginx.yml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: nginx-ns
spec:
  replicas: 3
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - image: nginx:latest
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP

同样直接用kubectl apply命令执行就可以了

5.Service

1)创建集群内部可访问的Service

kubectl expose deploy nginx --name=nginx-svc --port=80 --target-port=80 -n nginx-ns

此时用curl加ip地址就能够访问到nginx服务

2)创建集群外部可以访问到的nginx服务

kubectl expose deploy nginx --name=nginx-svc --port=80 --target-port=80 --type=NodePort -n nginx-ns

执行命令之后会随机给你分配一个端口

直接粘贴到游览器即可访问

3)删除Service

kubectl delete svc nginx-svc -n nginx-ns

## service "nginx-svc" deleted

4)配置方式

同样创建yml文件

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: nginx-ns
spec:
  clusterIP: 10.101.67.27
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
    type: NodePort

同样用kubectl apply执行即可创建

6.进入pod容器的方式

# 查询命名空间中创建的容器名
kubectl describe pod -n nginx-ns

这就是自定义的容器名,查询到了直接进入容器

kubectl exec -it nginx-64b7c758f4-22cx7 -c nginx /bin/bash -n nginx-ns

此时进入容器就可以修改源码以及执行操作等等

更多推荐