❄️5. Kubernetes核心资源之名称空间和Pod实战
Namespace是k8s系统中的一种非常重要资源,它的主要作用是用来实现**多套环境的资源隔离**或者**多用户的资源隔离
·
**什么是名称空间Namespace: **
- Namespace是k8s系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多用户的资源隔离。
- 默认情况下,k8s集群中的所有的Pod都是可以相互访问的。
- 但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。
- k8s通过将集群内部的资源分配到不同的Namespace中,形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。
- 可以通过k8s的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。
- 结合k8s的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。
Kubernetes 会创建四个初始NameSpace名称空间:
- default
- 没有指明使用其它名字空间的对象所使用的默认名字空间
- kube-system
- Kubernetes 系统创建对象所使用的名字空间
- kube-public
- 是自动创建的,命名空间下的资源可以被所有人访问(包括未认证用户)
- kube-node-lease
- 集群节点之间的心跳维护
查看所有命名空间: kubectl get namespace
缩写: kubectl get ns
命名空间操作:
# 创建新命名空间
kubectl create ns dev
# 查看命名空间详情
kubectl describe ns dev
# 指定输出格式 命令:kubectl get ns ns名称 -o 格式参数, 常见的是wide、json、yaml
# 输出命名空间详细信息
kubectl get ns dev -o yaml
# 删除命名空间
kubectl delete ns dev
# 基于配置文件方式 namespace-dev.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
创建:kubectl create -f namespace-dev.yaml
创建:kubectl apply -f namespace-dev.yaml
删除:kubectl delete -f namespace-dev.yaml
- 自主创建:直接创建出来的Pod,这种pod删除后就没有了,也不会自动重建
- 控制器创建:通过控制器创建的pod,这类Pod删除了之后还会自动重建
Pod运行容器数量
- 每个Pod中一个容器,,Pod是容器的简单封装,K8S管理Pod而不是直接管理容器
- 一个Pod中同时运行多个需要互相协作的容器,它们共享资源
Pod网络
- 一个 pod 包含一组容器,一个 pod 不会跨越多个工作节点
- 每个Pod都会被分配一个唯一的IP地址,Pod中的所有容器共享网络空间
- 包括IP地址和端口, Pod内 部的容器可以使用localhost互相通信
Pod存储
- Volume 也可以用来持久化Pod中的存储资源,以防容器重启后文件丢失
- Pod中 的所有容器都可以访问共享的Volume
**命令: **
kubectl get pod -n kube-system
#查看创建的资源
kubectl get pod,deploy
# 删除nginx pod,如果是靠deploy控制器创建的pod, 直接删除则会自动创建新的;
kubectl delete pod pod名称 -n 名称空间
#通过控制器创建pod,则删除控制器即可
kubectl delete pod控制器名称 -n 名称空间
# 运行pod,指定名称空间
kubectl run xdclass-nignx-pod --image=nginx:1.23.0 --port=80 --namespace dev
# 通过 deployment控制器导出yaml文件,指定名称空间
kubectl create deployment xdclass-nginx --image=nginx:1.23.0 --namespace dev -o yaml --dry-run=client > nginx.yaml
#一次性部署3个pod,修改nginx.yaml 下面的从 1 改为 3
#使用 kubectl apply -f nignx.yaml
spec:
replicas: 3
**访问: **
#查看某个名称空间下 pod 更多信息
kubectl get pod -n dev -o wide
#访问pod,同个集群下面,master和node节点都可以访问(同个K8S内部网络)
curl 10.244.1.20
#备注,如果使用了Service,即NodePort端口,开放了网络安全组则外网也可以访问
LabelSelector标签选择器:
**操作: **
# 通过 deployment控制器导出yaml文件,指定名称空间
kubectl create deployment xdclass-nginx --image=nginx:1.23.0 --namespace dev -o yaml --dry-run=client > nginx.yaml
#命令默认不会列出任何标签
kubectl get pods
# 使用 --show-labels 选项来查看
kubectl get pod -n dev --show-labels
# 查看 deploy控制器标签
kubectl get deploy -n dev --show-labels
# 查看 pod 标签
kubectl get pod -n dev --show-labels
# 查看node节点标签
kubectl get node --show-labels
#给Pod资源打标签
kubectl label pod pod名称 -n dev version=1.0
例子:kubectl label pod xdclass-nginx-859bdb9994-kglj8 -n dev version=1.0
#给Pod资源更新标签
kubectl label pod pod名称 -n dev version=2.0 --overwrite
例子:kubectl label pod xdclass-nginx-859bdb9994-kglj8 -n dev version=2.0 --overwrite
#使用标签选择器
kubectl get pod -l "version=2.0" -n dev --show-labels
kubectl get pod -l "version!=2.0" -n dev --show-labels
#删除标签 语法 kubectl label pod pod名称 -n dev 标签名-
kubectl label pod pod名称 -n dev version-
例子
kubectl label pod xdclass-nginx-859bdb9994-kglj8 -n dev version-
NodeSelector标签选择器实战:
**配置文件: **
apiVersion: v1
kind: Pod
metadata:
name: xdclass-nginx
spec:
containers:
- name: nginx
image: nginx:1.23.0
imagePullPolicy: IfNotPresent
nodeSelector:
env: test
**操作: **
# 查看node节点标签
kubectl get node --show-labels
#创建pod
kubectl apply -f nginx.yaml
#查看pod资源
kubectl get pod
# 当Pod 一直处于 Pending 状态时,说明该 Pod 还未被调度到某个节点上
# Pod 中 nodeSelector 指定了节点 Label,调度器将只考虑调度 Pod 到包含该 Label 的 Node 上
# 当不存在符合该条件的 Node 时,Pod 将无法被调度
#给Node资源打标签,不能给master打标签
kubectl label node node名称 env=test
kubectl label node izwz90pegu9budx5tk4rv0z env=test
#删除 node的标签 kubectl label node 删除指定的labels(标签 key 接 - 号即可)
kubectl label node node名称 env-
kubectl label node izwz90pegu9budx5tk4rv0z env-
更多推荐
已为社区贡献4条内容
所有评论(0)