kubernetes 五种核心资源对象简介
Namespace
Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。
默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。
可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。
kubernetes在集群启动之后,会默认创建几个namespace
[root@k8s-master-01 ~]# kubectl get namespace NAME STATUS AGE default Active 72m # 所有未指定Namespace的对象都会被分配在default命名空间 kube-node-lease Active 72m # 集群节点之间的心跳维护,v1.13开始引入 kube-public Active 72m # 此命名空间下的资源可以被所有人访问(包括未认证用户) kube-system Active 72m # 所有由Kubernetes系统创建的资源都处于这个命名空间
namespace资源的具体操作
# 1. 查看所有的ns 命令:kubectl get ns
[root@k8s-master-01 ~]# kubectl get ns
NAME STATUS AGE
default Active 75m
kube-node-lease Active 75m
kube-public Active 75m
kube-system Active 75m# 2. 查看指定的ns 命令:kubectl get ns ns名称
[root@k8s-master-01 ~]# kubectl get ns default
NAME STATUS AGE
default Active 75m# 3. 指定输出格式 命令:kubectl get ns ns名称 -o 格式参数
# kubernetes支持的格式有很多,比较常见的是wide、json、yaml
[root@k8s-master-01 ~]# kubectl get ns default -o json
{"apiVersion": "v1","kind": "Namespace","metadata": {"creationTimestamp": "2021-08-05T10:20:27Z","labels": {"kubernetes.io/metadata.name": "default"},"name": "default","resourceVersion": "209","uid": "ea32b83d-3a22-46a0-8901-8183e4db4e47"},"spec": {"finalizers": ["kubernetes"]},"status": {"phase": "Active"}
}# 4. 查看ns详情 命令:kubectl describe ns ns名称
[root@k8s-master-01 ~]# kubectl describe ns default
Name: default
Labels: kubernetes.io/metadata.name=default
Annotations: <none>
Status: Active # Active 命名空间正在使用中 Terminating 正在删除命名空间# ResourceQuota 针对namespace做的资源限制
# LimitRange 针对namespace中的每个组件做的资源限制
No resource quota.
No LimitRange resource.# 创建namespace
[root@k8s-master-01 ~]# kubectl create ns dev
namespace/dev created# 删除namespace
[root@k8s-master-01 ~]# kubectl delete ns dev
namespace "dev" deleted
配置方式
# 首先准备一个yaml文件
[root@k8s-master-01 ~]# vim dev.yml
apiVersion: v1 # 版本号
kind: Namespace # 名称空间
metadata: # 名称空间的元数据name: dev# 然后就可以执行对应的创建和删除命令了
# 创建一个名称空间
[root@k8s-master-01 ~]# kubectl create -f dev.yml
namespace/dev created# 删除一个名称空间
[root@k8s-master-01 ~]# kubectl delete -f dev.yml
namespace "dev" deleted
Pod
Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。
kubernetes在集群启动之后,集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看:
# 查看kubernetes集群各个组件的Pod信息
[root@k8s-master-01 ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7d7778b79-dlvkp 1/1 Running 1 125m
coredns-7d7778b79-sdxkg 1/1 Running 1 125m
etcd-k8s-master-01 1/1 Running 1 125m
kube-apiserver-k8s-master-01 1/1 Running 1 125m
kube-controller-manager-k8s-master-01 1/1 Running 1 125m
kube-flannel-ds-5r7qf 1/1 Running 1 123m
kube-flannel-ds-jjrq5 1/1 Running 1 122m
kube-flannel-ds-qlh45 1/1 Running 1 122m
kube-proxy-srj9w 1/1 Running 1 122m
kube-proxy-vhk69 1/1 Running 1 122m
kube-proxy-zcfc2 1/1 Running 1 125m
kube-scheduler-k8s-master-01 1/1 Running 1 125m
kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的。
命令格式: kubectl run (pod名称) [参数] # --image 指定Pod的镜像 # --port 指定端口 # --namespace 指定namespace [root@k8s-master-01 ~]# kubectl run nginx --image=nginx --port=80 --namespace dev pod/nginx created
pod资源的具体操作
# 创建名称空间
[root@k8s-master-01 ~]# kubectl create ns dev
namespace/dev created# 创建一个pod节点,不指定pod控制器
[root@k8s-master-01 ~]# kubectl run nginx --image=nginx --port=80 --namespace dev
pod/nginx created# 查看Pod基本信息
[root@k8s-master-01 ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 3m40s# 查看Pod的详细信息
[root@k8s-master-01 ~]# kubectl describe pod nginx -n dev
Name: nginx
Namespace: dev
Priority: 0
Node: k8s-node-01/192.168.15.12
Start Time: Thu, 05 Aug 2021 21:49:40 +0800
Labels: run=nginx
Annotations: <none>
Status: Running
IP: 10.244.1.5
IPs:IP: 10.244.1.5
Containers:nginx:Container ID: docker://3d7d82534a251658d36d14d7e7ff3a1e9bef1bdc5205bfa9c8665baffeb57a59Image: nginxImage ID: docker-pullable://nginx@sha256:8f335768880da6baf72b70c701002b45f4932acae8d574dedfddaf967fc3ac90Port: 80/TCPHost Port: 0/TCPState: RunningStarted: Thu, 05 Aug 2021 21:49:59 +0800Ready: TrueRestart Count: 0Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-t8ktx (ro)
Conditions:Type StatusInitialized True Ready True ContainersReady True PodScheduled True
Volumes:kube-api-access-t8ktx:Type: Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds: 3607ConfigMapName: kube-root-ca.crtConfigMapOptional: <nil>DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 4m4s default-scheduler Successfully assigned dev/nginx to k8s-node-01Normal Pulling 4m3s kubelet Pulling image "nginx"Normal Pulled 3m45s kubelet Successfully pulled image "nginx" in 18.621044507sNormal Created 3m45s kubelet Created container nginxNormal Started 3m45s kubelet Started container nginx# 获取podIP
[root@k8s-master-01 ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 10m 10.244.1.5 k8s-node-01 <none> <none># 访问POD
[root@k8s-master-01 ~]# curl 10.244.1.5:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...# 删除指定Pod
[root@k8s-master-01 ~]# kubectl delete pod nginx -n dev
pod "nginx" deleted# 稍等片刻,再查询Pod,发现Pod被删除了
[root@k8s-master-01 ~]# kubectl get pods -n dev
No resources found in dev namespace.# 注意: 如果当前Pod是由Pod控制器创建的,控制器会监控Pod状况,一旦发现Pod死亡,会立即重建
# 此时要想删除Pod,必须删除Pod控制器
配置操作
# 创建一个pod-nginx.yaml
[root@k8s-master-01 ~]# vim pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: dev
spec:containers:- image: nginxname: podports:- name: nginx-portcontainerPort: 80protocol: TCP# 然后就可以执行对应的创建和删除命令了:
# 创建:
[root@k8s-master-01 ~]# kubectl create -f pod-nginx.yaml
pod/nginx created# 删除:
[root@k8s-master-01 ~]# kubectl delete -f pod-nginx.yaml
pod "nginx" deleted
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进行组合,使用逗号 “,” 进行分隔即可。例如:
name=slave,env!=productionname not in (frontend),env!=production
Label资源的具体操作
# 创建名称空间
[root@k8s-master-01 ~]# kubectl create ns dev
namespace/dev created# 创建一个pod节点,不指定pod控制器
[root@k8s-master-01 ~]# kubectl run nginx --image=nginx --port=80 --namespace dev
pod/nginx created# 为pod资源打标签
[root@k8s-master-01 ~]# kubectl label pod nginx version=1.0 -n dev
pod/nginx labeled# 为pod资源更新标签
[root@k8s-master-01 ~]# kubectl label pod nginx version=2.0 -n dev --overwrite
pod/nginx labeled# 查看标签
[root@k8s-master-01 ~]# kubectl get pod nginx -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 12m run=nginx,version=2.0# 筛选标签
[root@k8s-master-01 ~]# kubectl get pod -n dev -l version=2.0 --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 12m run=nginx,version=2.0[root@k8s-master-01 ~]# kubectl get pod -n dev -l version!=2.0 --show-labels
No resources found in dev namespace.# 删除标签
[root@k8s-master-01 ~]# kubectl label pod nginx version- -n dev
pod/nginx labeled
配置操作
# 创建一个pod-nginx.yaml
[root@k8s-master-01 ~]# vim pod-nginx.yaml
apiVersion: v1 # 版本号
kind: Pod # Pod资源
metadata: # Pod资源的元数据name: nginx # Pod资源的名字namespace: dev # Pod资源的名称空间 labels: # 模板定义的标签 version: "3.0" # 标签1:版本env: "test" # 标签2:环境
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。
Deployment资源的具体操作
# 创建一个pod
[root@k8s-master-01 ~]# kubectl create -f deploy-nginx.yml
deployment.apps/nginx created# 查看创建的Pod
[root@k8s-master-01 ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx-658f4cf99f-lnsjx 1/1 Running 0 62s
nginx-658f4cf99f-lvw6d 1/1 Running 0 62s
nginx-658f4cf99f-qmgxt 1/1 Running 0 62s# 查看deployment的信息
[root@k8s-master-01 ~]# kubectl get deploy -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 3/3 3 3 77s# UP-TO-DATE:成功升级的副本数量
# AVAILABLE:可用副本的数量
[root@k8s-master-01 ~]# kubectl get deploy -n dev -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx 3/3 3 3 108s nginx nginx run=nginx# 查看deployment的详细信息
[root@k8s-master-01 ~]# kubectl describe deploy nginx -n dev
Name: nginx
Namespace: dev
CreationTimestamp: Fri, 06 Aug 2021 19:47:57 +0800
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
Selector: run=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:Labels: run=nginxContainers:nginx:Image: nginxPort: 80/TCPHost Port: 0/TCPEnvironment: <none>Mounts: <none>Volumes: <none>
Conditions:Type Status Reason---- ------ ------Available True MinimumReplicasAvailableProgressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-658f4cf99f (3/3 replicas created)
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal ScalingReplicaSet 2m24s deployment-controller Scaled up replica set nginx-658f4cf99f to 3# 删除
[root@k8s-master-01 ~]# kubectl delete deploy nginx -n dev
deployment.apps "nginx" deleted
配置操作
# 创建一个deploy-nginx.yml
[root@k8s-master-01 ~]# vim deploy-nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxnamespace: dev
spec:replicas: 3selector:matchLabels:run: nginxtemplate:metadata:labels:run: nginxspec:containers:- image: nginxname: nginxports:- containerPort: 80protocol: TCP# 然后就可以执行对应的创建和删除命令了:
# 创建:kubectl create -f deploy-nginx.yml
# 删除:kubectl delete -f deploy-nginx.yml
测试高可用
# 查看pod节点的ip地址
[root@k8s-master-01 ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-658f4cf99f-45zxh 1/1 Running 0 56s 10.244.2.6 k8s-node-02 <none> <none>
nginx-658f4cf99f-7wl4t 1/1 Running 0 56s 10.244.1.3 k8s-node-01 <none> <none>
nginx-658f4cf99f-xdhb4 1/1 Running 0 56s 10.244.1.4 k8s-node-01 <none> <none># 访问测试
[root@k8s-master-01 ~]# curl 10.244.2.6:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>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># 删除一个pod节点
[root@k8s-master-01 ~]# kubectl delete pod nginx-658f4cf99f-45zxh -n dev
pod "nginx-658f4cf99f-45zxh" deleted# 再次查看pod节点的ip地址,新创建的pod节点IP地址发生了变化
[root@k8s-master-01 ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-658f4cf99f-7wl4t 1/1 Running 0 9m58s 10.244.1.3 k8s-node-01 <none> <none>
nginx-658f4cf99f-r2m5m 1/1 Running 0 45s 10.244.2.7 k8s-node-02 <none> <none>
nginx-658f4cf99f-xdhb4 1/1 Running 0 9m58s 10.244.1.4 k8s-node-01 <none> <none>
Service
上个小章节,已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务。
虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两个问题:
1. Pod IP 会随着Pod的重建产生变化2. Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问
这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。
Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
Service资源的具体操作
操作一:创建集群内部可访问的Service(ClusterIP)
# 暴露service ; ClusterIP类型只能在集群内部执行
[root@k8s-master-01 ~]# kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
service/svc-nginx1 exposed# 查看service
[root@k8s-master-01 ~]# kubectl get svc -n dev -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc-nginx1 ClusterIP 10.107.40.22 <none> 80/TCP 55s run=nginx# 这里产生了一个CLUSTER-IP,这就是service的IP,在Service的生命周期中,这个地址是不会变动的
# 可以通过这个IP访问当前service对应的POD
[root@k8s-master-01 ~]# curl 10.107.40.22:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
操作二:创建集群外部也可访问的Service(NodePort)
# 上面创建的Service的type类型为ClusterIP,这个ip地址只用集群内部可访问
# 如果需要创建外部也可以访问的Service,需要修改type为NodePort
[root@k8s-master-01 ~]# kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
service/svc-nginx2 exposed# 此时查看,会发现出现了NodePort类型的Service,而且有一对Port(80:30198/TCP)
[root@k8s-master-01 ~]# kubectl get svc -n dev -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc-nginx1 ClusterIP 10.107.40.22 <none> 80/TCP 23m run=nginx
svc-nginx2 NodePort 10.100.89.10 <none> 80:30198/TCP 2m43s run=nginx# 接下来就可以通过集群外的主机访问 节点的主机IP:31928访问服务了
# 例如在的电脑主机上通过浏览器访问下面的地址
http://192.168.15.11:30198/ # 删除service
[root@k8s-master-01 ~]# kubectl delete svc svc-nginx1 -n dev
service "svc-nginx1" deleted[root@k8s-master-01 ~]# kubectl delete svc svc-nginx2 -n dev
service "svc-nginx2" deleted
配置方式
# 创建一个svc-nginx.yml
[root@k8s-master-01 ~]# vim svc_nginx.yml
apiVersion: v1
kind: Service
metadata:namespace: devname: svc-nginx
spec:clusterIP: 10.10.10.123ports:- port: 80protocol: TCPtargetPort: 80selector:run: nginxtype: ClusterIP[root@k8s-master-01 ~]# kubectl create -f svc_nginx.yml
service/svc-nginx created# 然后就可以执行对应的创建和删除命令了:
# 创建:kubectl create -f svc-nginx.yml
# 删除:kubectl delete -f svc-nginx.yml
kubernetes 五种核心资源对象简介相关推荐
- Kubernetes — 核心资源对象 — Namespace
目录 文章目录 目录 Namespace 基于层级命名空间的多租户模型 使用示例 Namespace Namespace 提供了一种逻辑划分 Cluster Resources 的方法,K8s 具有以 ...
- 构建高性能J2EE应用的五种核心策略
对于J2EE,我们知道当开发应用时,在架构设计阶段的决定将对应用的性能和可扩展性产生深远的影响.现在当开发一个应用项目时,我们越来越多地注意到了性能和可扩展性的问题.应用性能的问题比应用功能的不丰富问 ...
- JSP最常用的五种内置对象
一.request对象 在作用域中管理属性 有时,在进行请求转发时,需要把一些数据带到转发后的页面进行处理.这时,就可以使用request对象的setAttribute()方法设置数据在request ...
- CoreDNS与k8s资源对象详解-Day03
1. K8s DNS 官网地址:https://github.com/coredns/coredns https://coredns.io/ https://coredns.io/plugins 1. ...
- redis五种数据类型的应用场景_Redis五种不同的数据类型
一.redis集群测试环境搭建 参考文章:https://www.jianshu.com/p/0a2f8f80983a redis-cli -c -h 10.96.87.129 -p 7001注意:- ...
- 图解 Redis 五种数据结构底层实现
Redis 是一个基于内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件.Redis 支持五种常见对象类型:字符串(String).哈希(Hash).列表(List).集合(Set)以及有序集 ...
- c++ 数组的数据保存二进制_Redis五种不同的数据类型
一.redis集群测试环境搭建 参考文章:https://www.jianshu.com/p/0a2f8f80983a redis-cli -c -h 10.96.87.129 -p 7001注意:- ...
- Redis五种基本数据类型底层详解(原理篇)
Redis五种基本数据类型底层详解 详细介绍Redis用到的数据结构 简单动态字符串 SDS和C字符串的区别 总结 链表 字典 哈希表 字典 哈希算法 解决键冲突 rehash(重点) 渐进式reha ...
- linux 五种IO模型 简介
Linux下主要的IO主要分为:阻塞IO(Blocking IO),非阻塞IO(Non-blocking IO),同步IO(Sync IO)和异步IO(Async IO). 同步:调用端会一直等待服务 ...
最新文章
- UVA - 1346 Songs (贪心+排序)
- Spring 详解(三):AOP 面向切面的编程
- 并发编程-08安全发布对象之发布与逸出
- tensorflow_yolo-v3笔记 IOU:Intersection over union 交并比
- rimraf --A deep deletion module for node (like `rm -rf`)
- Java中的异常处理机制的简单原理和应用
- CMDB整体项目梳理(1)
- Linux内核源代码分析——swap实现
- STC学习:光敏计数
- 计算机设备问题代码43,双击unknown device由于该设备有问题Windows已将其停止(代码 43)怎么办解决教程...
- Jmeter基础篇(01):如何进行post接口压力测试
- Python爬虫实战之爬取链家广州房价_01简单的单页爬虫
- 算法设计 分治法 快速排序 C语言实现
- Tkinter GUI设计中文文档
- 影子传文件到服务器,影子传说——文件超级隐身术
- 在繁杂的网页中揪出email地址
- 软件工程研究生在读一年总结
- Android桥方法设置GPS信号,android-GPS更新间隔更快,信号良好?
- Ninth season twentieth episode,Joey held a celebrities party but did not invited his friends!!!!!!
- C++实现内存“垃圾”回收机制