k8s pod分类、核心组件、网络模型、kubectl常用命令

K8s基本概念

pod分类

自主式pod

  • 自我管理的pod,创建以后仍然需要提交给apiserver,由apiserver接收以后借助于调度器将其调度至指定的node节点,由node启动此pod
  • 如果此pod出现故障,需要重启容器则由kubelet来完成
  • 如果node节点故障了,那么此pod将会消失。便无法实现全局调度。所以不推荐使用此种pod

控制器管理的pod

  • ReplicationController:当启动一个pod时,这个pod如果不够用可以再启一个副本,而后由控制器来管理同一类pod的各种副本与对象。一旦副本少了就会自动增加。采取多退少补的规则,精确符合我们所定义的期望;支持滚动更新

  • ReplicaSet:由一个名叫Deployment的声明式更新的控制器来管理

  • Deployment:Deployment只能管理无状态的应用

  • StateFulSet:有状态副本集,可以管理有状态的应用

  • DaemonSet:如果需要在每个node上运行一个副本的时候可以用DaemonSet

  • Job:它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务

  • Cronjob:它创建的Pod负责周期性任务控制,不需要持续后台运行;以上所有控制器都是用来实现一种特定的应用管理的。

核心组件

HPA

  • Deployment还支持二级控制器
    HPA(HorizontalPodAutoscaler,水平pod自动伸缩控制器)
  • —般情况下我们可以确保一个node上有2个pod在运行,万一用户访问流量增加,2个pod不足以承载这么多访问量怎么办?此时我们就应该要增加pod资源,那么到底应该加几个?
  • HPA控制器可自动监控pod、自动进行扩展。

service

  • 假如有2个pod,pod有其生命周期,万一pod所在的节点宕机了,那么此pod将应该要在其他的节点上重建,而重建完的pod与原来的pod已经不是同一个pod了,只是两者都是运行的同一个服务而已。且每个容器都有其IP地址,重建的pod中的容器其P地址与之前的pod中容器的IP地址是不一样的,如此一来就会存在一个问题,客户端如何访问这些pod中的容器呢?

  • 措施:服务发现:就比如集贸市场的注册摊位和声明地址,注册摊位就是买东西的摊位,有一天这个摊位的商贩换地方了,就会在原来的摊位上留下一个摊位声明告诉顾客自己换地方了,但是它出售的商品还是一样的。只是换个地方买而已,这就是服务发现

  • pod是有生命周期的,一个pod随时都有可能离去,随时都有可能会有其他pod加进来,假如它们提供的是同―种服务,客户端是无法通过固定的手段来访问这些pod的,因为pod本身是不固定的,它们随时可能被替换掉,无论使用主机名还是IP地址,都随时会被替换掉。

  • 为了尽可能的降低客户端与pod间协调的复杂度,k8s为每一组提供同类服务的pod和其客户端之间添加了一个中间层,这个中间层是固定的,这个中间层就叫service

  • service只要不被删除,其地址与名称皆是固定的,当客户端需要在其配置文件中写上访问某个服务时,它不再需要自动发现,只需要在配置文件中写明service的名称即可,而这个service是个调度器,其不但能够提供一个稳定的访问入口,还可以做反向代理,当service接收到客户端的请求后,会将其代理到后端的pod之上,一旦pod宕机了会立即新建一个pod,这个新建的pod会立即被service关联上,作为service后端的可用pod之一

  • 客户端程序访问服务都是通过IP+端口或者主机名+端口的方式来实现的。而service关联后端的pod不是靠它的lIP和主机名,而是靠pod的标签选择器。只要创建的pod的label是统一的,无论P地址和主机如何改变,其都能被service所识别。如此一来,只要pod属于标签选择器,只要其在service的管理范围之内,则其就会被关联到service中,当这个动态的pod关联到service中之后,再进行动态的探测此pod的IP地址、端口,再将其作为自己后端可调度的可用服务器主机对象。因此,客户端的请求发送到service,然后由service代理到后端真实的pod中的容器进行响应。

  • service不是一个程序,也不是一个组件,它只是一个iptables的dnat规则

  • service作为k8s的对象,有其自身的名称,而service的名称相当于服务的名称,而这个名称可以被解析。

AddOns附件

  • 装完k8s后第一件事就需要在k8s集群上部署一个dns pod,以确保各service的名称能够被解析
  • 可以动态改变,包括动态创建、动态删除、动态修改
  • 比如把service的名称改了,dnspod会自动触发,将dns解析记录中的名称也给改掉;假如我们手动把service的ip地址给改了,改完以后会自动触发,将dns服务中的解析记录给改掉。
  • 如此一来,客户端去访问pod资源的时候可以直接访问service的名称,然后由集群中专用的dns服务来负责解析。
  • 这种pod是k8s自身的服务就需要用到的pod,所以我们把它称为基础性的系统架构级的pod对象,而且它们也被称为集群附件

K8s的三种网络模型

  • 节点网络
  • service集群网络
  • pod网络

K8s的三种网络模型分属于三个网段,由此延伸出来三个问题
在这里插入图片描述

同一pod内的多个容器间如何通信?
答:用lo网卡

各pod之间如何通信?
答:物理桥桥接 规模大的情况下会产生广播风暴;Overlay Network 通过隧道的方式转发报文

pod与service之间如何通信?
答:首先各节点之间是相互通信的,节点也就是真机之间的通信,因为service网络是一个iptables规则,且与真机是相连的,而pod和service是我们初始化的时候通过flannel网络进行互联,且属于同一网段。

Flannel
Flannel是CoreOS团队针对Kubernetes设计的一个网络规划实现,简单来说,它的功能有以下几点:

  • 使集群中的不同Node主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
  • 建立一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器。覆盖网络是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将一个分组封装在另一个分组内来将网络服务与底层基础设施分离。在将封装的数据包转发到端点后,将其解封装。
  • 创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(vxlan)。
  • 路由信息一般存放到etcd:多个node上的Flanneld依赖一个etcd cluster来做集中配置服务,etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化
  • Flannel首先会在Node上创建一个名为flannel0的网桥(vxlan类型的设备),并且在每个Node上运行一个名为flanneld的代理.每个node上的flannel代理会从etcd上为当前node申请一个CIDR地址块用来给该node上的pod分配地址。
  • Flannel致力于给k8s集群中的nodes提供一个3层网络,他并不控制node中的容器是如何进行组网的,仅仅关心流量如何在node之间流转。

kubectl常用操作

kubectl命令官方文档

kubeconfig配置文件

[root@master ~]# kubectl config
选项:
Available Commands:
  current-context 显示 current_context
  delete-cluster  删除 kubeconfig 文件中指定的集群
  delete-context  删除 kubeconfig 文件中指定的 context
  delete-user     Delete the specified user from the kubeconfig
  get-clusters    显示 kubeconfig 文件中定义的集群
  get-contexts    描述一个或多个 contexts
  get-users       Display users defined in the kubeconfig
  rename-context  Renames a context from the kubeconfig file.
  set             设置 kubeconfig 文件中的一个单个值
  set-cluster     设置 kubeconfig 文件中的一个集群条目
  set-context     设置 kubeconfig 文件中的一个 context 条目
  set-credentials 设置 kubeconfig 文件中的一个用户条目
  unset           取消设置 kubeconfig 文件中的一个单个值
  use-context     设置 kubeconfig 文件中的当前上下文
  view            显示合并的 kubeconfig 配置或一个指定的 kubeconfig 文件

Usage:
  kubectl config SUBCOMMAND [options]

Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).



[root@master ~]# kubectl config view
//集群
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.129.250:6443
  name: kubernetes
//集群上下文
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
//当前上下文
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
//客户端认证
users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

kubectl管理命令

类型命令描述
基础命令create
expose
run
expose
set
explain
get
edit
delete
通过文件名或标准输入创建资源;
为Deployment,Pod创建Service;
在集群中运行一个特定的镜像;
在对象上设置特定的功能;
文档参考资料;
显示一个或多个资源;
使用系统编辑器编辑一个资源;
通过文件名,标准输入,资源名称或标签选择器来删除资源
部署命令rollout
rolling-update
scale
autoscale
管理Deployment,Daemonset资源的发布(例如状态、发布记录、回滚等);
滚动升级,仅限ReplicationController;
对Deployment、ReplicaSet、RC或Job资源扩容或缩容Pod数量;
为Deploy,RS,RC配置自动伸缩规则(依赖metrics-server和hpa)
集群管理命令certificate
cluster-info
top
cordon
uncordon drain
taint
修改证书资源;
显示集群信息;
查看资源利用率(依赖metrics-server);
标记节点不可调度;
标记节点可调度;
驱逐节点上的应用,准备下线维护;
修改节点taint标记

kubectl帮助

用kubectl help可以查看kubectl相关的命令

[root@master ~]# kubectl --help
kubectl controls the Kubernetes cluster manager.
 
Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/
 
Basic Commands (Beginner):
  create         Create a resource from a file or from stdin.
  expose         使用 replication controller, service, deployment 或者 pod 并暴露它作为一个新的Kubernetes Service
  run            在集群中运行一个指定的镜像
  set            为 objects 设置一个指定的特征
 
Basic Commands (Intermediate):
  explain        查看资源的文档
  get            显示一个或更多 resources
  edit           在服务器上编辑一个资源
  delete         Delete resources by filenames, stdin, resources and names, or by resources and label selector
 
Deploy Commands:
  rollout        Manage the rollout of a resource
  scale          为 Deployment, ReplicaSet, Replication Controller 或者 Job 设置一个新的副本数量
  autoscale      自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量
 
Cluster Management Commands:
  certificate    修改 certificate 资源.
  cluster-info   显示集群信息
  top            Display Resource (CPU/Memory/Storage) usage.
  cordon         标记 node 为 unschedulable
  uncordon       标记 node 为 schedulable
  drain          Drain node in preparation for maintenance
  taint          更新一个或者多个 node 上的 taints
 
Troubleshooting and Debugging Commands:
  describe       显示一个指定 resource 或者 group 的 resources 详情
  logs           输出容器在 pod 中的日志
  attach         Attach 到一个运行中的 container
  exec           在一个 container 中执行一个命令
  port-forward   Forward one or more local ports to a pod
  proxy          运行一个 proxy 到 Kubernetes API server
  cp             复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.
  auth           Inspect authorization
 
Advanced Commands:
  diff           Diff live version against would-be applied version
  apply          通过文件名或标准输入流(stdin)对资源进行配置
  patch          使用 strategic merge patch 更新一个资源的 field(s)
  replace        通过 filename 或者 stdin替换一个资源
  wait           Experimental: Wait for a specific condition on one or many resources.
  convert        在不同的 API versions 转换配置文件
 
Settings Commands:
  label          更新在这个资源上的 labels
  annotate       更新一个资源的注解
  completion     Output shell completion code for the specified shell (bash or zsh)
 
Other Commands:
  alpha         Commands for features in alpha
  api-resources  Print the supported API resources on the server
  api-versions   Print the supported API versions on the server, in the form of "group/version"
  config         修改 kubeconfig 文件
  plugin         Provides utilities for interacting with plugins.
  version        输出 client 和 server 的版本信息
 
Usage:
  kubectl [flags] [options]
 
Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).

kubectl命令使用

kubectl命令官方文档

create命令

语法:
kubectl create deployment NAME --image=image -- [COMMAND] [args...]
选项:
--image 指定镜像
--replicas  创建指定数目的pod

[root@master ~]# kubectl create deployment test1 --image busybox
deployment.apps/test1 created		#使用busybox镜像创建一个test1的pod
[root@master ~]# kubectl get pod
NAME                     READY   STATUS             RESTARTS   AGE
nginx-6799fc88d8-4k6rc   1/1     Running            2          27h
test1-78d64fd9b9-n2f79   0/1     CrashLoopBackOff   3          115s		#可以看到处于退出状态,因为busybox使用的是sh,没有任务就会退出

//创建名为test2的部署,用于运行 busybox 映
[root@master ~]# kubectl create deployment test2 --image busybox -- sleep 60
deployment.apps/test2 created

[root@master ~]# kubectl get pods
NAME                     READY   STATUS             RESTARTS   AGE
test1-78d64fd9b9-n2f79   0/1     CrashLoopBackOff   4          3m12s
test2-7c95bf5bcb-s7wzk   1/1     Running            0          49s		#运行中


//创建一个名为web的部署,该部署运行具有 3 个副本的 nginx 映像
[root@master ~]# kubectl create deployment web --image nginx --replicas 3
deployment.apps/web created
[root@master ~]# kubectl get pods
NAME                     READY   STATUS             RESTARTS   AGE
web-96d5df5c8-f9t9x      1/1     Running            0          62s
web-96d5df5c8-m4fnb      1/1     Running            0          62s
web-96d5df5c8-stgdp      1/1     Running            0          62s

//查看pod运行的节点位置
[root@master ~]# kubectl get pods -o wide
NAME                     READY   STATUS             RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
web-96d5df5c8-f9t9x      1/1     Running            0          115s    10.244.1.9    node1   <none>           <none>
web-96d5df5c8-m4fnb      1/1     Running            0          115s    10.244.1.10   node1   <none>           <none>
web-96d5df5c8-stgdp      1/1     Running            0          115s    10.244.1.8    node1   <none>  

//创建一个名为 web01 的部署,该部署运行 nginx映像并公开端口 80
[root@master ~]# kubectl create deployment web01 --image nginx --port=80
deployment.apps/web01 created
[root@master ~]# kubectl get pods
NAME                     READY   STATUS             RESTARTS   AGE
web01-59859fb9db-tksjv   1/1     Running            0          18s

get命令

//以 ps 输出格式列出所有 Pod
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-4k6rc   1/1     Running   2          27h
web-96d5df5c8-64z76      1/1     Running   0          82s
web-96d5df5c8-pggdj      1/1     Running   0          82s
web-96d5df5c8-vjv6x      1/1     Running   0          82s
web01-59859fb9db-tksjv   1/1     Running   0          17m


//查看你指定类型的pod,类型加pod名
[root@master ~]# kubectl get deployment web
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
web    3/3     3            3           2m25s

//以 ps 输出格式列出所有 Pod,并提供更多信息(例如节点名称)
[root@master ~]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE    IP            NODE    NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-4k6rc   1/1     Running   2          27h    10.244.1.5    node1   <none>           <none>
web-96d5df5c8-64z76      1/1     Running   0          2m5s   10.244.1.13   node1   <none>           <none>
web-96d5df5c8-pggdj      1/1     Running   0          2m5s   10.244.1.12   node1   <none>           <none>
web-96d5df5c8-vjv6x      1/1     Running   0          2m5s   10.244.1.14   node1   <none>           <none>
web01-59859fb9db-tksjv   1/1     Running   0          17m    10.244.1.11   node1   <none>           <none>


//以 ps 输出格式列出所有复制控制器和服务
[root@master ~]# kubectl get rc,svc
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    27h
service/nginx        ClusterIP   10.102.213.63   <none>        8080/TCP   6m20s		#svc是service简写,也可以写全拼

kubectl get cs                          # 查看集群状态
kubectl get nodes                       # 查看集群节点信息
kubectl get ns                          # 查看集群命名空间
kubectl get svc -n kube-system          # 查看指定命名空间的服务
kubectl get pod <pod-name> -o wide      # 查看Pod详细信息
kubectl get pod <pod-name> -o yaml      # 以yaml格式查看Pod详细信息
kubectl get pods                        # 查看资源对象,查看所有Pod列表
kubectl get rc,service                  # 查看资源对象,查看rc和service列表
kubectl get pod,svc,ep --show-labels    # 查看pod,svc,ep能及标签信息
kubectl get all --all-namespaces        # 查看所有的命名空间

expose命令

选项:
 --port  要映射的宿主机端口
 --target-port  映射给那个容器端口
 
//为复制的nginx创建一个服务,该服务在端口8080上服务并连接到端口80上的容器
[root@master ~]# kubectl expose deployment nginx --port 8080 --target-port 80
service/nginx exposed
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    27h
nginx        ClusterIP   10.102.213.63   <none>        8080/TCP   20s

[root@master ~]# curl 10.102.213.63:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

delete命令

[root@master ~]# kubectl get pods
NAME                     READY   STATUS             RESTARTS   AGE
b3-76df468677-r2ctd      0/1     CrashLoopBackOff   5          3m53s
nginx-6799fc88d8-4k6rc   1/1     Running            2          27h
test1-78d64fd9b9-n2f79   0/1     CrashLoopBackOff   6          11m
test2-7c95bf5bcb-s7wzk   0/1     CrashLoopBackOff   4          9m3s
web-96d5df5c8-f9t9x      1/1     Running            0          6m31s
web-96d5df5c8-m4fnb      1/1     Running            0          6m31s
web-96d5df5c8-stgdp      1/1     Running            0          6m31s
web01-59859fb9db-tksjv   1/1     Running            0          3m15s
[root@master ~]# kubectl delete deployment test1
deployment.apps "test1" deleted

[root@master ~]# kubectl delete deployment web
deployment.apps "web" deleted
[root@master ~]# kubectl get pods
NAME                     READY   STATUS             RESTARTS   AGE
b3-76df468677-r2ctd      0/1     CrashLoopBackOff   6          7m8s
nginx-6799fc88d8-4k6rc   1/1     Running            2          27h
test2-7c95bf5bcb-s7wzk   0/1     CrashLoopBackOff   5          12m
web01-59859fb9db-tksjv   1/1     Running            0        

// 删除service类型的pod
[root@master ~]# kubectl delete svc nginx
service "nginx" deleted
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   27h

//删除所有pod
[root@master ~]# kubectl delete pods --all 

//强制删除pod节点
[root@master ~]# kubectl delete pod foo --force  

run命令

语法:
$ run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...]

选项:
--image 指定镜像
--port  暴露容器端口
--labels key=value 指定标签

//启动一个 nginx pod
[root@master ~]#  kubectl run nginx --image nginx
pod/nginx created
[root@master ~]# kubectl get pods -o wide
NAME                     READY   STATUS              RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
nginx                    0/1     ContainerCreating   0          6s      <none>        node1   <none>           <none>
nginx-6799fc88d8-4k6rc   1/1     Running             2          27h     10.244.1.5    node1   <none>           <none>

//删除nginx
[root@master ~]# kubectl delete pods nginx
pod "nginx" deleted

// 暴露容器的80端口号
[root@master ~]# kubectl run nginx --image nginx --port 80 
pod/nginx created

//启动 nginx 并在容器中设置环境变量“app=nginx”和“env=prod”
[root@master ~]# kubectl run nginx --image nginx --labels "aap=nginx,env=prod"
pod/nginx created

//详细信息
[root@master ~]# kubectl describe pod nginx 
Name:         nginx
Namespace:    default
Priority:     0
Node:         node1/192.168.129.135
Start Time:   Sun, 19 Dec 2021 20:18:10 +0800
Labels:       aap=nginx
              env=prod
Annotations:  <none>
Status:       Running
IP:           10.244.1.17
IPs:
  IP:  10.244.1.17
Containers:
  nginx:
    Container ID:   docker://3c2f5b9a0fef36c00e0e08209d6bd0889620971e2964b2d1a57faf7b3b6678f3
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sun, 19 Dec 2021 20:18:12 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-ck7n4 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-ck7n4:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-ck7n4
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  44s   default-scheduler  Successfully assigned default/nginx to node1
  Normal  Pulling    45s   kubelet            Pulling image "nginx"
  Normal  Pulled     43s   kubelet            Successfully pulled image "nginx" in 1.286464367s
  Normal  Created    43s   kubelet            Created container nginx
  Normal  Started    43s   kubelet            Started container nginx

//测试(干跑)
[root@master ~]# kubectl run nginx --image nginx --dry-run client		#不会真正运行
W1219 20:19:43.254143   85424 helpers.go:553] --dry-run is deprecated and can be replaced with --dry-run=client.
pod/nginx created (dry run)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值