云原生之Kubernetes资源管理,Namespace、Pod、Label、Deployment、Service基本使用

2022年05月12日 阅读数:2
这篇文章主要向大家介绍云原生之Kubernetes资源管理,Namespace、Pod、Label、Deployment、Service基本使用,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

资源管理介绍

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

命令式对象管理:只能操做活动对象,没法审计、跟踪,用法nginx

命令式对象配置:项目大的时候,配置文件多,操做麻烦api

Namespace

  • Namespace是kubernetes系统中一种很是重要的资源,它的主要做用是用来实现多套系统的资源隔离或者多租户的资源隔离浏览器

  • 默认状况下,kubernetes集群中的全部Pod都是能够相互访问的。可是在实际中,可能不想让两个Pod之间进行互相的访问,那么此时就能够将两个Pod划分到不一样的Namespace下。kubernetes经过将集群内部的资源分配到不一样的Namespace中,能够造成逻辑上的“组”,以方便不一样的组的资源进行隔离使用和管理。app

  • 能够经过kubernetes的受权机制,将不一样的Namespace交给不一样租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不一样租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理负载均衡

 kubernetes在集群启动以后,会默认建立几个namespacecurl

kubectl get namespace  #查看
default:全部未指定的Namespace的对象都会被分配在default命名空间。
kube-node-lease:集群节点之间的心跳维护,v1.13开始引入。
kube-public:此命名空间的资源能够被全部人访问(包括未认证用户)。
kube-system:全部由kubernetes系统建立的资源都处于这个命名空间ide

Pod

  • Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。url

  • Pod能够认为是容器的封装,一个Pod中能够存在一个或多个容器。spa

kubernetes在集群启动以后,集群中的各个组件也是以Pod方式运行的,能够经过下面的命令查看:

kubectl get pods -n kube-system

建立并运行Pod,主要是经过Pod控制器来实现

kubectl run (Pod的名称) [参数]  没有单独运行
# --image 指定Pod的镜像
# --port 指定端口
# --namespace 指定namespace
kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace=dev
查询全部Pod的基本信息
kubectl get pods -n dev
查看Pod的详细信息
kubectl describe pod nginx -n dev
访问Nginx的Pod
kubectl get pods -n dev -o wide
curl 10.244.2.7:80  #ip加端口
删除Nginx的Pod
kubectl delete pod nginx -n dev

命令式对象配置,新建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

执行建立和删除命令

kubectl create -f pod-nginx.yaml
kubectl delete -f pod-nginx.yaml

Label

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

Label的特色:

  • 一个Label会以key/value键值对的形式附加到各类对象上,如Node、Pod、Service等。
  • 一个资源对象能够定义任意数量的Label,同一个Label也能够被添加到任意数量的资源对象上去。
  • Label一般在资源对象定义时肯定,固然也能够在对象建立后动态的添加或删除。
  • 能够经过Label实现资源的多纬度分组,以便灵活、方便地进行资源分配、调度、配置和部署等管理工做,好比版本标签、环境标签等

为资源打标签

kubectl label pod xxx key=value [-n 命名空间]
为Nginx的Pod打上标签
kubectl label pod nginx version=1.0 -n dev
更新资源的标签
kubectl label pod xxx key=value [-n 命名空间] --overwrite
kubectl label pod nginx version=2.0 -n dev --overwrite
显示Nginx的Pod的标签
kubectl get pod nginx -n dev --show-labels
筛选标签
kubectl get pod -l version=2.0 -n dev --show-labels
删除标签
kubectl label pod nginx version- -n dev

命令式对象配置

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

执行建立和删除命令

kubectl create -f pod-nginx.yaml
kubectl delete -f pod-nginx.yaml

Deployment

  • 在kubernetes中,Pod是最小的控制单元,可是kubernetes不多直接控制Pod,通常都是经过Pod控制器来完成的。

  • Pod控制器用于Pod的管理,确保Pod资源符合预期的状态,当Pod的资源出现故障的时候,会尝试进行重启或重建Pod,新建立的ip地址与原来的不同。

Deployment建立pod时会在pod上打标签,经过标签选择器选择须要管理的pod

#建立2个pod管理nginx命名空间为dev
kubectl run nginx --image=nginx:1.17.1 --replicas=2 --port=80 --namespace dev
#查看
kubectl get deployment,pods -n dev
#查看nginx详细描述
kubectl describe deploy nginx -n dev
#查看标签
kubectl get pods -n dev --show-lables
#删除
kubectl delete deploy nginx -n dev

命令式对象配置,建立一个deploy-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: dev
#副本数  选择器
spec:
  replicas: 3
  selector:
    matchLabels:
      run: nginx
  #pod模板    
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - image: nginx:1.17.1
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
#执行建立和删除命令
kubectl create -f deploy-nginx.yaml
kubectl delete -f deploy-nginx.yaml
#查看建立的Pod
kubectl get pods [-n 命名空间]
#查看名称为dev的namespace下经过deployment建立的3个Pod
kubectl get pods -n dev
#查看deployment的信息
kubectl get deployment [-n 命名空间]
kubectl get deployment -n dev
kubectl describe deployment nginx -n dev
#删除deployment
kubectl delete deployment nginx -n dev

Service

  • 咱们已经可以利用Deployment来建立一组Pod来提供具备高可用性的服务,虽然每一个Pod都会分配一个单独的Pod的IP地址,可是却存在以下的问题:

  • Pod的IP会随着Pod的重建产生变化。
  • Pod的IP仅仅是集群内部可见的虚拟的IP,外部没法访问

service能够看作是一组同类的Pod对外的访问接口,借助Service,应用能够方便的实现服务发现和负载均衡

#暴露Service
kubectl expose deployment xxx --name=服务名 --type=ClusterIP --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空间]
# 新建时借助pod控制器找到对应的pod
#暴露名为test的namespace下的名为nginx的deployment,并设置服务名为svc-nginx1
kubectl expose deployment nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n test
#查看Service
kubectl get service -n test
#访问
curl 对应集群ip

从新建立集群外部可访问的Service

kubectl expose deployment xxx --name=服务名 --type=NodePort --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空间]
# 会产生一个外部也能够访问的Service
kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n test
#查看名为test的命名空间的全部Service
kubectl get service -n test
#浏览器访问 查出来的ip与端口号
#删除服务
kubectl delete service svc-nginx1 -n test

对象配置方式,新建svc-nginx.yaml

apiVersion: v1
kind: Service
metadata:
  name: svc-nginx
  namespace: dev
spec:
  clusterIP: 10.109.179.231
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  type: ClusterIP
执行建立和删除命令
kubectl  create  -f  svc-nginx.yaml
kubectl  delete  -f  svc-nginx.yaml