xone

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

资源管理

在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。

kubernetes的本质就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在
kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在pod中,而kubernetes一般也不会
直接管理Pod,而是通过Pod控制器来管理Pod的。
Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了Service资源实现这个功能。
当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种存储系统。

图片名称

学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、Service、存储等各种资源进行操作

Namespace

Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。
默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,
那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成
逻辑上的“组”,以方便不同的组的资源进行隔离使用和管理。
可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结
合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量,内存使用量等等,来实现租户可用资源的管理。

[root@dev-k8s-master1 ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   629d    #  所有未指定Namespace的对象都会被分配在default命名空间
kube-node-lease   Active   629d    #  集群节点之间的心跳维护,v1.13开始引入
kube-public       Active   629d    #  此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system       Active   629d    #  所有由kubernetes系统创建的资源都处于这个命名空间

# 查看ns详情  命令:kubectl describe ns ns名称
[root@dev-k8s-master1 ~]# kubectl describe ns default
Name:         default
Labels:       <none>
Annotations:  <none>
Status:       Active    # Active:命名空间正在使用中  Terminating:正在删除命名空间

# ResourceQuota 针对namespace做的资源限制
# ResourceLimits 针对namespace中的每个组件做的资源限制
No resource quota.
No resource limits.

创建
# 创建namespace
[root@dev-k8s-master1 ~]# kubectl create ns dev
namespace/dev created
删除
# 删除namespace
[root@dev-k8s-master1 ~]# kubectl delete ns dev
namespace "dev" deleted
配置方式

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

apiVersion: v1
kind: Namespace
metadata:
  name: dev

然后就可以执行对应的创建和删除命令了:
创建: kubectl create -f ns-dev.yaml
删除: kubectl delete -f ns-dev.yaml

Pod

Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容易必须存在于Pod中。
Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。
图片名称
kubernetes在集群启动后,集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看:

[root@dev-k8s-master1 ~]# kubectl get pod -n kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
coredns-94d74667-7pqtv                    1/1     Running   0          222d
coredns-94d74667-zdggn                    1/1     Running   0          222d
etcd-dev-k8s-master1                      1/1     Running   1          86d
etcd-dev-k8s-master2                      1/1     Running   67         86d
etcd-dev-k8s-master3                      1/1     Running   284        86d
kube-apiserver-dev-k8s-master1            1/1     Running   1          86d
kube-apiserver-dev-k8s-master2            1/1     Running   41         293d
kube-apiserver-dev-k8s-master3            1/1     Running   50         293d
kube-controller-manager-dev-k8s-master1   1/1     Running   1          86d
kube-controller-manager-dev-k8s-master2   1/1     Running   154        293d
kube-controller-manager-dev-k8s-master3   1/1     Running   153        293d
kube-flannel-ds-amd64-cgm44               1/1     Running   1          629d
kube-flannel-ds-amd64-dtnwt               1/1     Running   1          86d
kube-flannel-ds-amd64-vv8j5               1/1     Running   2          629d
kube-proxy-d48rj                          1/1     Running   0          293d
kube-proxy-rthxh                          1/1     Running   1          86d
kube-proxy-xrf4m                          1/1     Running   0          293d
kube-scheduler-dev-k8s-master1            1/1     Running   1          86d
kube-scheduler-dev-k8s-master2            1/1     Running   126        293d
kube-scheduler-dev-k8s-master3            1/1     Running   170        293d

创建并运行

kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的

# 命令格式: kubectl run (pod控制器名称)[参数]
# --image   指定Pod的镜像
# --port    指定端口
# --namespace    指定namespace
[root@dev-k8s-master1 ~]# kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace dev
deployment.apps/nginx created

配置操作

创建一个pod-nginx.yaml,内容如下:

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

Label

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

  • 一个Label会以key/value键值对的形式添加到各种对象上,如Node、Pod、Service等等
  • 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去
  • Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除

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

一些常用的Label示例如下:

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

标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector,即:
Label用于给某个资源对象定义标识
Label Selector用于查询和筛选拥有某些标签的资源对象
当前有两种Label Selector:

  • 基于等式的Label Selector
    name = slave: 选择所有包含Label中key="name"且value="slave"的对象
    env != production: 选择所有包括Label中的key="env"且value不等于"production"的对象
  • 基于集合的Label Selector
    name in (master,slave): 选择所有包含Label中的key="name"且value="master"或"slave"的对象
    name not in (frontend): 选择所有包含Label中key="name"且value不等于"frontend"的对象
    标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如:
# 创建标签
[root@dev-k8s-master1 ~]# kubectl label pods nginx -n dev version=1.0
pod/nginx labeled
# 查看标签
[root@dev-k8s-master1 ~]# kubectl get pods nginx -n dev --show-labels
NAME    READY   STATUS    RESTARTS   AGE     LABELS
nginx   1/1     Running   0          3h35m   version=1.0
[root@dev-k8s-master1 ~]# kubectl label pods nginx -n dev tier=back
pod/nginx labeled
[root@dev-k8s-master1 ~]# kubectl get pods nginx -n dev --show-labels
NAME    READY   STATUS    RESTARTS   AGE     LABELS
nginx   1/1     Running   0          3h36m   tier=back,version=1.0
# 更新标签
[root@dev-k8s-master1 ~]# kubectl label pods nginx -n dev version=2.0 --overwrite
pod/nginx labeled
[root@dev-k8s-master1 ~]# kubectl get pods nginx -n dev --show-labels
NAME    READY   STATUS    RESTARTS   AGE     LABELS
nginx   1/1     Running   0          3h36m   tier=back,version=2.0
# 筛选标签
[root@dev-k8s-master1 ~]# kubectl get pods -l "version=2.0" -n dev
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          3h41m
[root@dev-k8s-master1 ~]# kubectl get pods -l "version!=2.0" -n dev
NAME                                             READY   STATUS    RESTARTS   AGE
arachneexecutionengine-deploy-7bbbddd546-l84g8   1/1     Running   0          222d
# 删除标签
[root@dev-k8s-master1 ~]# kubectl label pods nginx -n dev tier-
pod/nginx labeled
配置方式
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
  labels:
    version: "3.0"
    env: "test"
spec:
  containers:
  - image: nginx:1.17.1
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

然后就可以执行对应的更新命令了:kubectl apply -f pod-nginx.yaml

Deployment

在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成
的。Pod控制用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。
在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。
图片名称

Service

通过上节课的学习,已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务。
虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两个问题:

  • Pod IP会随着Pod的重建产生变化
  • Pod IP仅仅是集群内可见的虚拟IP,外部无法访问
    这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。
    Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
    图片名称
posted on 2022-02-23 15:40  周小百  阅读(85)  评论(0编辑  收藏  举报