namespace
namespace(命名空间),主要用多环境资源隔离或者多租户资源隔离。
默认情况下,k8s集群中的所有pod是可以互相访问的。通过建立namespace的方式进行资源分配,做到逻辑上的组分离从而实现资源隔离和管理。
可以通过k8s的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户资源隔离,还可以结合k8s的资源配额机制,限定不同租户能占用的资源,比如内存,cpu使用量,来实租户可用资源的管理。
k8s在集群启动后会创建几个namespace:
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
default Active 116d 所有未指定namespace的对象都会分配在这
kube-node-lease Active 116d 集群节点间的心跳维护
kube-public Active 116d 此命名空间下可以被所有人访问
kube-system Active 116d 所有由k8s系统创建的资源都在这里
创建namespace
kubectl create ns [nsname]
删除namespace(会删除该ns中所有pod)
kubectl delete ns [nsname]
pod
pod是K8s集群进行管理的最小单元,程序的运行必须在容器内,而容器必须存在于pod内。pod可以看作是对容器的一种封装,一个pod可以有一个或多个容器。
k8s在集群启动之后,集群的各个组件也都是以pod的方式运行
[root@k8s-master ~]# kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7f9c544f75-9kfz9 1/1 Running 48 116d
coredns-7f9c544f75-nd8f6 1/1 Running 48 116d
etcd-k8s-master 1/1 Running 4 116d
kube-apiserver-k8s-master 1/1 Running 4 116d
kube-controller-manager-k8s-master 1/1 Running 4 116d
kube-flannel-ds-8d5jl 1/1 Running 4 116d
kube-flannel-ds-bhh9j 1/1 Running 4 116d
kube-flannel-ds-gl766 1/1 Running 4 116d
kube-proxy-t278c 1/1 Running 5 116d
kube-proxy-x4gqf 1/1 Running 4 116d
kube-proxy-xs6ms 1/1 Running 5 116d
kube-scheduler-k8s-master 1/1 Running 4 116d
创建并运行
k8s并没有提供单独运行pod的命令,都是通过pod控制器来实现的
#创建一个名未nginx的pod控制器,使用的镜像未ngix,端口未80,并指定命名空间
kubectl run nginx --image=nginx:1.21.5 --port=80 -n [nsname]
kubectl run pod控制器名称
--image 镜像
--port 端口
-n 指定命名空间
查看指定命名空间下的所有pod信息
kubectl get po -n [nsname]
查看pod详细信息
kubectl describe po [poname] -n [nsname]
删除pod
kubectl delete po [poname] -n [nsname]
#这里只是删除pod本身,如果该pod是由pod控制器控制则删除后会立即创建一个新的pod
查询pod控制器
kubectl get deploy -n [nsname]
删除pod控制器
kubectl delete deploy [deploymentname] -n [nsname]
-- 删除pod控制器后,其对应的pod会被完全删除掉
创建一个pod.yaml脚本
创建一个nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
spec:
containers:
- image: nginx:1.21.5
imagePullPolicy: IfNotPresent
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
基于yaml创建和删除
创建
kubectl create -f nginx-pod.yaml
删除
kubectl delete -f nginx-pod.yaml
Label
它的作用是在资源上添加标识,用来做区分和选择
Label特点:
- 一个Label会以键值对的形式存在附加在各种资源上。如pod,node,service等等。
- 一个资源对象可以定义任意数量的label,而同一个label也可以被添加到任意资源上。
- Label通常在资源定义时确定,也可以在后续添加或删除。
使用label可以方便灵活地对资源进行管理,资源分配,调度,部署等。
一些常用的label示例
版本标签:"version":"release","version":"GA"
环境标签:"environment":"dev","environment":"test","environment":"pro"
架构标签:"tier":"frontend","tier":"backed"
标签定义完以后还要考虑到标签的选择,这就使用到Label Selector
label是用于给某个资源对象定义标识。
label selector用于查询和筛选拥有某些标签的资源对象。
当前有两种Label Selector
- 基于等式:
- name = slave,选择标签key为name,value为slave的资源。
- env != production,选择标签key为env,value不为production。
- 基于集合
- name in (master,slave),选择标签key为name,value包含master或者slave的资源。
- name not in (master,slave),选择标签key为name,value不包含master或slave的资源。
标签的选择条件可以使用多个,用“,”进行分割即可。
name=slave,env!=productionm
name not in (forntend),env!=productionm
常用命令
打标签
kubectl label pod nginx [key]=[value] -n [nsname]
更新标签
kubectl label pod nginx [key]=[value] --overwrite -n [nsname]
查看标签
kubectl get po -n [nsname] --show-labels
筛选标签
kubectl get po -n dev -l [key]=[value] kubectl get po -n dev -l [key]!=[value] kubectl get po -n dev -l [key] in ([value1],[value2]) kubectl get po -n dev -l [key] not in ([value1],[value2])
删除标签
kubectl label po nginx -n dev [key]-
deployment
pod是k8s中最小的控制单元,一般通过pod控制器来完成对pod的控制,deployment就是pod控制器中的一种。
deployment通过标签选择器和pod进行关联创建
```bash kubectl run [deployment] —image=[image] —port=[port] —replicas=[rs] -n [nsname] —deplyment:deployment的名称 —image:镜像地址 —port:容器内端口号 —replicas:副本数 —nsname:命名空间 示例: kubectl run nginx —image=nginx:1.21.5 —port=3 —replicas=3 -n dev
<a name="PAYS4"></a>
## 查看
```bash
kubectl get deploy -n [nsname]
删除
kubectl delete deploy [deploy] -n [nsname]
脚本
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:latest
name: nginx
ports:
- containerPort: 80
protocol: TCP
Service
每一个pod都会对其分配一个ip,然而缺存在两个问题
- Pod IP会随pod的重建产生变化。
- Pod IP只可以在集群内部访问。
这样就给访问服务带来困难,于是k8s设计了service来解决这个问题
service可以看作是一组同类Pod对外的访问接口,借助service,应用可以方便的访问服务。
创建集群内部可访问的Service
创建集群内service
kubectl expose deploy [deploy] --name=[svcname] --type=[ClusterIP,NodeIP] --port=[port] --target-port=[target-port] -n [nsname]
--deploy deployment的name
--name service的name
--type ClusterIP集群内可见,NodeIP所有剋按
--port 访问端口
--target-port 目标pod端口
示例:
kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
查看service
kubectl get svc -n [nsname]
在service的生命周期中,service的ip是不可变的。
删除service
kubectl delete svc [svcname] -n [nsname]
配置方式
apiVersion: v1
kind: Service
metadata:
name: svc-nginx
namespace: dev
spec:
clusterIP: 10.109.179.231 #固定svc的内网ip,可以不写,不写由系统分配
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: ClusterIP