K8S各资源之间的关系

在K8S中一切都是资源。而这些资源包含了很多,如Namespace、Pod、Label、Deployment、Service。这些资源之间又有相互的联系。

Namespace

Namespace是K8S中比较重要的资源,主要用于多套环境的资源隔离,如dev环境,test环境,prod环境等。
在默认情况下K8S中的Pod是可以相互访问的,在实际情况中,可能希望两个Pod之间不能进行通信,这个时候就需要使用Namespace进行环境隔离。

kubernetes在集群启动之后,会默认创建如下namespace

NAME 说明
default 所有未指定Namespace的对象都会被分配在default命名空间
kube-flannel Kubernetes网络配置
kube-node-lease 集群节点之间的心跳维护
kube-public 此命名空间下的资源可以被所有人访问
kube-system 所有由Kubernetes系统创建的资源都处于这个命名空间

查看

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

# 2 查看指定的ns   命令:kubectl get ns ns名称

# 3 指定输出格式  命令:kubectl get ns ns名称  -o 格式参数

# 4 查看ns详情  命令:kubectl describe ns ns名称

创建

# 创建namespace 命令:kubectl create ns dev

删除

# 删除namespace 命令:kubectl delete ns dev

配置方式

首先准备一个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是K8S集群管理的最小单元,程序运行在容器中,而容器运行在Pod中,一个Pod可以运行一个或者多个容器。K8S不直接操作Pod,而都是操作Pod控制器。K8S在集群启动之后,集群中的各个组件也都是以Pod方式运行的。

创建并运行

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

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

示例:kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace dev 

查看pod信息

# 查看Pod基本信息,命令:kubectl get pods -n dev

# 查看Pod的详细信息,使用describe ,命令:kubectl describe pod nginx -n dev

访问Pod

# 使用wide获取Pod额外信息,命令:kubectl get pods -n dev -o wide

删除指定Pod

# 删除指定Pod,命令:kubectl delete pod nginx -n dev
# 删除之后又会产生新的Pod
# 这是因为当前Pod是由Pod控制器创建的,控制器会监控Pod状况,一旦发现Pod死亡,会立即重建
# 此时要想删除Pod,必须删除Pod控制器

配置操作

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

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

然后就可以执行对应的创建和删除命令了:

​ 创建:kubectl create -f pod-nginx.yaml

​ 删除:kubectl delete -f pod-nginx.yaml

Label

Label的作用是在资源上添加标识,用来对它们进行区分和选择。以key/value键值对的形式添加到各种资源上。一个资源可以多个标签。
Label用于给某个资源对象定义标识
Label Selector用于查询和筛选拥有某些标签的资源对象
Label Selector:
基于等式的Label Selector,如:name=salve,或者name!=salve
基于集合的Label Selector,如: name in (salve,master),或者name not in (salve,master)

命令方式

# 为pod资源打标签,示例:kubectl label pod nginx-pod version=1.0 -n dev

# 为pod资源更新标签,示例:kubectl label pod nginx-pod version=2.0 -n dev --overwrite

# 查看标签,示例:kubectl get pod nginx-pod  -n dev --show-labels

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

#删除标签,示例:kubectl label pod nginx-pod 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
    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的控制器分很多种,比如deployment.

命令操作

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

在K8S 1.80.0版本之后没有replicas这个命令参数了,但是可以通过yaml文件的方式创建

配置操作

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

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

Deployment可用于创建一组Pod来提供具有服务,而一个控制器和pod之前的关联关系就是使用label标签进行关联的。Pod控制器会监控pod,如果pod发生异常,会重建pod,这导致了pod的Ip每次都会发生变化,而且Pod外部网络无法访问,故而出现了service.

Service

Service可以看作是一组同类Pod对外的访问接口
使用Service对外提供接口,请求走到Service,会到pod控制器,然后根据标签选择器负载均衡选择对应的pod提供程序。
Service提供的操作
操作一:创建集群内部可访问的Service
操作二:创建集群外部也可访问的Service
这两个的操作仅仅区分在type上。
Type=ClusterIP只能在集群内部访问,
Type=NodePort可以通过外部网络访问。
配置方式

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

apiVersion: v1
kind: Service
metadata:
  name: svc-nginx
  namespace: dev
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  type: ClusterIP #只能在集群内部访问,NodePort可以通过外部网络访问

然后就可以执行对应的创建和删除命令了:

​ 创建:kubectl create -f svc-nginx.yaml

​ 删除:kubectl delete -f svc-nginx.yaml

posted @ 2022-12-29 12:58  swayer  阅读(638)  评论(0编辑  收藏  举报