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