3.1 Namespace

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

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

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

  kubernetes在集群启动之后,会默认创建几个namespace;

  default — 所有未指定的namesapce对象都会被分配到default命名空间中;

  kube-node-lease — 集群节点之间的心跳维护,v1.13开始引入;

  kube-public — 此命名空间下的资源可以被所有人访问,包括未认证的用户;

  kube-system — 所有由kubernetes系统创建的资源都处于该名称空间中;

  namesapce资源的操作:

  [1]. 命令式对象管理:

  1). 查看

  查看所有namespace: kubectl get ns

  查看指定的namespace: kubectl get ns default

  指定输出格式: kubectl get ns default -o wide/json/yaml

  查看namespace详细信息: kubectl describe ns default

  Active表示命名空间正在使用中,Terminating表示正在删除命名空间;

  No resource quota    ResourceQuota是针对namespace做的资源限制;

  No LimitRange resource    LimitRange是针对namespace中的每个组件做的资源限制;

  2). 创建

  创建namespace: kubectl create ns dev

  3). 删除

  删除namespace: kubectl delete ns dev

  [2]. 命令式对象配置:

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

apiVersion: v1
kind: Namespace
metadata:
    name: dev

  执行对应的创建和删除命令:

  kubectl create -f ns-dev.yaml

  kubectl delete -f ns-dev.yaml

3.2 Pod

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

  kubernetes在集群启动之后,集群中的各个组件都是以Pod方式运行的,可以通过以下命令查看:kubectl get pod -n kube-system

  Master节点中的组件:apiServer、scheduler、controller-manager、etcd;

  网络组件:kube-flannel

  DNS组件:coredns

  代理组件:kube-proxy

  Pod资源的操作:

  [1]. 命令式对象管理:

  1). 创建并运行

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

# 命令格式 kubectl run (Pod控制器名称) [参数]
# --image 指定Pod的镜像
# --port 指定端口
# --namespace 指定namespace
kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace dev 

  2). 查看Pod信息

# 查看Pod基本信息
kubectl get pods -n dev

# 查看Pod的详细信息
kubectl describe pod [pod-name] -n dev

  3). 访问Pod

# 获取Pod的IP地址
kubectl get pods -n dev -o wide

# 访问Pod,Pod的IP地址随着重新创建会发生变化;
curl http://Pod的IP地址:端口号

  4). 删除指定Pod

# 删除指定Pod
kubectl delete pod [pod-name] -n dev

# 查询名称空间下的Pod
kubectl get pod -n dev
#发现名称空间中重新拉起一个新的Pod,这是由于当前Pod是由Pod控制器创建的,控制器会监控Pod的状态,一旦发现Pod死亡,会立即重建一个新的Pod;如果想要删除Pod,只能通过删除Pod控制器的方式;

# 查询当前名称空间下的Pod控制器
kubectl get deploy -n dev

# 删除Pod控制器
kubectl delete deploy [Pod控制器名称] -n dev

# 查询名称空间下的Pod,Pod已经被删除
kubectl get pod -n dev

  [2]. 命令式对象配置:

  创建一个pod-nginx.yaml;

apiVersion: v1
kind: Pod
metadata:
  # 单独启动一个Pod,而不是依赖于Pod控制器,因此此处为Pod名称; name: nginx namespace: dev spec: containers: - image: nginx:
1.17.1 imagePullPolicy: IfNotPresent name: pod ports: - name: nginx-port containerPort: 80 portocol: TCP

  然后执行对应的创建和删除命令:

  kubectl create -f pod-nginx.yaml

  kubectl delete -f pod-nginx.yaml 

3.3 Label 

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

  Label的特点:

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

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

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

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

# 常用的Label标签示例:
版本标签:"version":"release","version":"stable"
环境标签:"environment":"dev","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):选择所有包含Lable中的key="name",且value="master"或”slave“的对象;

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

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

  标签的操作:

  [1]. 命令式对象管理:

# 为Pod资源打标签
kubectl label pod [pod-name] version=1.0 -n dev

#为Pod资源更新标签
kubectl label pod [pod-name] version=2.0 -n dev --overwrite

# 查看标签
kubectl get pod [pod-name] -n dev --show-labels

# 筛选标签
kubectl get pod -n dev -l version=2.0 --show-labels

# 删除标签
kubectl label pod [pod-name] [key]- -n dev

  [2]. 声明式对象配置

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

3.4 Deployment  

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

  Kubernetes中的Pod控制器有很多种,而Deployment只是其中的一种。

  Deployment的操作:

  [1]. 命令式对象管理:

# 命令格式 kubectl run deployment名称 [参数]
--image  指定Pod镜像
--port  指定端口
--replicas  指定创建Pod的数量
--namespace  指定namespace
kubectl run nginx --image=nginx:1.17.1 --port=80 --replicas=1 -n dev

#查看创建的Pod
kubeclt get pod -n dev

#查看deployment的信息
kubectl get deploy -n dev
kubectl describe deploy nginx -n dev

# 删除
kubectl delete deploy nginx -n dev

  [2]. 命令式对象配置

apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx
    namespace: dev
spec:
    replicas: 3
    selector:
        matchLables:
            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

3.5 Service

  虽然每个Pod都会分配一个单独的Pod IP,然后却存在以下两个问题:

    1). Pod IP会随着Pod的重建而产生变化;

    2). Pod IP仅仅是集群内可见的虚拟IP,外部无法进行访问;

  如此对访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题;

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

  Service的操作:

  [1]. 命令式对象管理

# 创建集群内部可访问的Service(Service在其整个生命周期中,IP地址不会发生变化)
# 暴露Service
kubectl expose deploy nignx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev

# 查看Service
kubectl get svc svc-nginx n dev -o wide

# 这里产生的Cluster-IP,就是Service的IP,在Service的整个生命周期中,这个地址是不会发生变化的,可以通过访问该IP地址访问当前Service对应的Pod;
curl IP地址:端口号
# 创建集群外部也可以访问的Service
# 上面创建的Service的type类型为ClusterIP,这个IP地址只能在kubernetes集群内部访问;如果需要创建集群外部也可以访问的Service,则需要将Service的类型修改为NodePort
kubectl expose deploy --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev

#此时查看,会发现出现了NodePort类型的Service,而且有一对Port;
kubectl get svc svc-nginx2 -n dev -o wide

#接下来便可以通过集群外的主机访问该Service
# 删除Service
kubectl delete svc svc-nginx1 -n dev
kubectl delete svc svc-nginx2 -n dev

  [2]. 命令式对象配置

apiVersion: v1
kind: Service
metadata:
    name: svc-nginx
    namespace: dev
spec:
    clusterIP: x.x.x.x
    ports:
    - port: 80
      protocol: TCP
      targetPort: 80
    selector:
      run: nginx
    type: ClusterIP

  然后执行对应的创建和删除命令:

  kubectl create -f svc-nginx.yaml

  kubectl delete -f svc-nginx.yaml

posted on 2023-11-20 16:23  VaeSSAQ  阅读(7)  评论(0)    收藏  举报