Namespace命名空间
namespace 是 kubernetes 中非常重要的资源,它的作用是用来实现多套环境的资源隔离或者多租户的资源隔离默认情况下,kubernetes 集群中所有的pod都是可以相互访问的,但是实际中,可能不想让两个pod之间进行互相访问,那此时就可以将两个 pod 划分到不同的 namespace 下 k8s 通过将集群内部资源分配到不同的 namespace 中,可以形成逻辑上的分组可以通过 kubernetes 中的授权机制,将不同的 namespace 交给不同租户进行管理,这样就实现了多租户的资源隔离,比如开发和测试,这些都属于多租户,还能结合 k8s 的资源配合限制,限定不同组合能占用的资源,例如 CPU 使用量、内存使用量等,来实现租户可用资源的管理
k8s 集群默认的命名空间
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
default Active 6h56m //所有未指定namespace的对象都会被分配在default命名空间
kube-node-lease Active 6h56m //集群节点之间的心跳维护,从1.13版本之后开始引入
kube-public Active 6h56m //此命名空间下的资源可用被所有人访问
kube-system Active 6h56m //所有由kubernetes系统创建的资源都处于这个命名空间下
查看命名空间信息
1.查看所有的namespace
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
cattle-system Active 5h16m
default Active 6h56m
kube-node-lease Active 6h56m
kube-public Active 6h56m
kube-system Active 6h56m
2.查看某个namespace的yaml文件
[root@k8s-master ~]# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
name: default
spec:
finalizers:
- kubernetes
status:
phase: Active
3.查看namespace的详细信息
[root@k8s-master ~]# kubectl describe ns default
Name: default
Labels: field.cattle.io/projectId=p-4msvm
Annotations: cattle.io/status:
{"Conditions":[{"Type":"ResourceQuotaInit","Status":"True","Message":"","LastUpdateTime":"2021-02-20T04:04:44Z"},{"Type":"InitialRolesPopu...
field.cattle.io/projectId: c-5h6z6:p-4msvm
lifecycle.cattle.io/create.namespace-auth: true
Status: Active #active状态表示正在使用,Terminating状态表示正在删除命名空间
No resource quota. #ResourceQuota针对namespace做的资源限制
No LimitRange resource. #LimitRange针对每个组件做得资源限制
管理命名空间
创建
[root@k8s-master ~]# kubectl create ns dev
删除
[root@k8s-master ~]# kubectl delete ns dev
通过声明式对象创建命名空间
1.编写配置文件
[root@k8s-master ~]# vim test.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
2.创建ns
[root@k8s-master ~]# kubectl create -f test.yaml
3.删除ns
[root@k8s-master ~]# kubectl delete -f test.yaml
POD 资源
Pod (容器组) 是一个k8s中一个抽象的概念,用于存放一组 container(可包含一个或多个 container 容器,即图上正方体),以及这些 container (容器)的一些共享资源。这些资源包括:
- 共享存储,称为卷(Volumes),即图上紫色圆柱
- 网络,每个 Pod(容器组)在集群中有个唯一的 IP,pod(容器组)中的 container(容器)共享该IP地址
- container(容器)的基本信息,例如容器的镜像版本,对外暴露的端口等
Pod(容器组)是 k8s 集群上的最基本的单元。当我们在 k8s 上创建 Deployment 时,会在集群上创建包含容器的 Pod (而不是直接创建容器)。每个Pod都与运行它的 worker 节点(Node)绑定,并保持在那里直到终止或被删除。如果节点(Node)发生故障,则会在群集中的其他可用节点(Node)上运行相同的 Pod(从同样的镜像创建 Container,使用同样的配置,IP 地址不同,Pod 名字不同)。
TIP
重要:
- Pod 是一组容器(可包含一个或多个应用程序容器),以及共享存储(卷 Volumes)、IP 地址和有关如何运行容器的信息。
- 如果多个容器紧密耦合并且需要共享磁盘等资源,则他们应该被部署在同一个Pod(容器组)中。
创建一个 POD 资源
命令格式:kubectl run (pod名称)参数
-image:指定pod的镜像
-port:指定端口
-namespace::指定namespace
1.创建namespace
[root@k8s-master ~]# kubectl create ns dev
namespace/dev created
2.创建deployment类型的nginx pod
[root@k8s-master ~]# kubectl run nginx --image=ninx:1.15 --port=80 --namespace dev
pod/nginx created
3.查看pod是否创建成功
[root@k8s-master ~]# kubectl get pod -n dev
查看 POD 信息
1.查看pod基本信息
[root@k8s-master ~]# kubectl get all -n dev
NAME READY STATUS RESTARTS AGE
pod/nginx 1/1 Running 0 59s
2.查看pod ip地址
[root@k8s-master ~]# kubectl get all -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx 1/1 Running 0 79s 10.244.2.12 k8s-node2
3.查看pod详细信息
[root@k8s-master ~]# kubectl describe pod nginx -n dev
删除 POD
如果是 deployme 控制器创建的 pod,需要先把控制器删除,再进行 pod 的是删除,否则 pod 删除过程中会启动一个新的 pod,再将当前的 pod 删除,反反复复,不等到删除 pod,新的 pod 就已经创建了
[root@k8s-master ~]# kubectl delete pod nginx -n dev
pod "nginx" deleted
使用 yaml 创建 pod 资源
1.编写yaml文件
[root@k8s-master ~]# vim nginx.yaml
apiVersion: v1 #api版本
kind: Pod #控制器类型
metadata: #元数据,也就是定义pod控制的信息
name: nginx-pod #设置pod名称
namespace: dev #设置pod的命名空间
spec: #定义pod资源的属性
containers: #容器信息
- image: nginx:1.15 #容器的镜像
name: nginx-pod #容器的名称,也相当于是容器的主机名
ports: #开放的端口
- name: nginx-port #给开放的端口起一个名称
containerPort: 80 #要开放什么端口
protocol: TCP #端口属于什么协议
2.通过yaml文件创建nginx pod
[root@k8s-master ~]# kubectl create -f pod-nginx.yaml
pod/nginx-pod created
3.查看pod
[root@k8s-master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 8s
4.删除pod
[root@k8s-master ~]# kubectl delete -f pod-nginx.yaml
pod "nginx-pod" deleted
Label 标签
官方介绍
标签(Labels) 是附加到 Kubernetes 对象(比如 Pod)上的键值对。 标签旨在用于指定对用户有意义且相关的对象的标识属性,但不直接对核心系统有语义含义。 标签可以用于组织和选择对象的子集。标签可以在创建时附加到对象,随后可以随时添加和修改。 每个对象都可以定义一组键/值标签。每个键对于给定对象必须是唯一的。
个人理解
Label 其实就一对 key/value ,被关联到对象上,比如 Pod,标签的使用我们倾向于能够标示对象的特殊特点,Labels 的值对系统本身并没有什么含义,只是对用户才有意义。同一个资源对象的labels属性的key必须唯一,labels 可以附加到各种资源对象上,如 Node,Pod,Service,RC 等。一个资源拥有多个标签,可以实现不同维度的管理。标签 (Label) 的组成: key=value。Label 可以在创建对象时就附加到对象上,也可以在对象创建后通过API进行额外添加或修改。
Label 命名规范
- 必须为 63 个字符或更少(可以为空)
- 除非标签值为空,必须以字母数字字符(
[a-z0-9A-Z]
)开头和结尾 - 包含破折号(
-
)、下划线(_
)、点(.
)和字母或数字
label的特点
一个abel会以key/value键值对的形式附加到各种对象上,例如node、pod、service等,可以通过标签将一个pod固定运行在一个node节点上,也可以通过标签将一组pod与deployment、service资源进行关联
一个资源对象可以定义多个abel,同一个abel标签也可以添加到多个资源上,比如一个app:nginx的标签可以定义在pod里,也可以定义在deployment资源里更可以定义在service资源label通常在资源对象定义时确定,当然也可以在对象创建后动态添加和删除label
可以通过label实现资源的多维度分组,跑着相同应用的pod厘于一个分组,以便灵活、方便地对资源进行分配、调度、配置和部署等管理工作
常用的label标签示例
版本标签:“version”.“release”,“version"stable
环境标签:“environment”."dev”,“environment”."test”
应用标签:“app ."nginx”,“app”"mysql
标签定义完毕之后,还需要考虑到标签的选择,这就要使用到 label selector,即标签选择器 label 用于给某个资源对象定义标识,比如给 nginx pod 定义 app:nginxlabel selector 用于查询和筛选拥有某些标签的资源对象,即关联某个资源的标识
两种 label selector 定义格式
基于等式的 label selector
- name=a 当 name 标签等于 a
- name != a 当 name 标签不等于 a
基于集合的 label selector
- name in (masterslave) 当 name 标签值为 master 或者 slave 时
- name notin (aaa) 当 name 标签值不为 aaa 时
标签选择条件可以使用多个,此时将多个abel selector进行组合,使用逗号”,进行分割即可,例如 name=slave ,env!=abc
语法格式: (-n namespase写在标签命令后面和前面都可以)
添加一个标签: kubectl label 资源 资源名 标签=标签值 -n namespace
查看标签: kubectl get 资源 资源名 --show-labels -n namespace
更新一个标签: kubectl label 资源 资源名 标签=标签值 --overwrite -n namespace
删除一个标签: kubectl label 资源 资源名 标签- -n namespace
筛选一个标签: kubectl get 资源 I标签=标签值 --show-lables -n namespace
通过命令对 label 标签进行使用
1.给pod资源加一个版本标签
[root@k8s-master ~]# kubectl create -f pod-nginx.yaml
[root@k8s-master ~]# kubectl label pod nginx-pod version=1.0 -n dev
pod/nginx-pod labeled
2.查看一个pod资源的所有标签
[root@k8s-master ~]# kubectl get pod nginx-pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 4m13s version=1.0
3.更新一个标签
更新标签和打标签的语法一样,只是在最后加一个 overwrite 参数
[root@k8s-master ~]# kubectl label pod nginx-pod -n dev version=2.0 --overwrite
pod/nginx-pod labeled
4.删除一个标签
[root@k8s-master ~]# kubectl label pod nginx-pod -n dev version-
pod/nginx-pod labeled
通过命令对 label 标签进行删选
1.再次增加一个nginx pod
[root@k8s-master ~]# kubectl create -fpod-nginx.yaml
pod/nginx-pod2 created
2.给新的pod增加一个标签
[root@k8s-master ~]# kubectl label pod nginx-pod2 -n dev version=1.0
pod/nginx-pod2 labeled
3.查看所有pod的标签,会发现每个pod都有自己的标签
[root@k8s-master ~]# kubectl get pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 11m version=2.0
nginx-pod2 1/1 Running 0 74s version=1.0
4.筛选出 version 等于 2.0 标签的pod
[root@k8s-master ~]# kubectl get pod -n dev -l version=2.0 --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 17m version=2.0
5.筛选出 version 不等于 2.0 标签的 pod
[root@k8s-master ~]# kubectl get pod -n dev -l version!=2.0 --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod2 1/1 Running 0 8m20s version=1.0
通过 yaml 定义标签
1.编写yaml
[root@k8s-master ~]# vimpod-nginx.yaml
[root@k8s-master ~]# vim pod-nginx.yaml
apiVersion: v1 #api版本
kind: Pod #控制器类型
metadata: #元数据,也就是定义pod控制的信息
name: nginx-pod #设置pod名称
namespace: dev #设置pod的命名空间
labels: #定义标签
version: "3.0" #version标签值为3.0
app: "nginx" #app标签值为nginx
spec: #定义pod资源属性
containers: #容器信息
- image: nginx:1.15 #容器的镜像
name: nginx-pod #容器的名称,也相当于是容器的主机名
ports: #开放的端口
- name: nginx-port #给开放的端口起一个名称
containerPort: 80 #要开放什么端口
protocol: TCP #端口属于什么协议
2.创建pod并查看标签
#由于我们之前已经创建了一个nginx-pod,因此这里使用apply更新配置
[root@k8s-master ~]# kubectl apply -f pod-nginx.yaml
pod/nginx-pod configured
[root@k8s-master ~]# kubectl get pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 33m app=nginx,version=3.0
nginx-pod2 1/1 Running 0 23m
Deployment 控制器资源
Deployment 是 kubernetes 中最常用的资源对象,为 ReplicaSet 和 Pod 的创建提供了一种声明式的定义方法,在 Deployment 对象中描述一个期望的状态,Deployment 控制器就会按照一定的控制速率把实际状态改成期望状态,通过定义一个 Deployment 控制器会创建一个新的 ReplicaSet 控制器,通过ReplicaSet 创建 pod,删除 Deployment 控制器,也会删除 Deployment 控制器下对应的 ReplicaSet 控制器和 pod 资源。
生产环境一般都是通过 Deployment 创建
Deployment资源清单文件详解
apiVersion: apps/v1 ##版本
kind: Deployment ##类型
metadata: ## Deployment 的元数据
name: httpd ## Deployment 的名字
labels: ##标签
app: httpd ##标签 app=httpd
spec: ##Pod 的信息
replicas: 3 ##Pod 的副本数
selector: ##标签选择器
matchLabels: ##查找匹配的标签
app: httpd ## app = httpd
template: ## Pod 的模板信息,根据模板信息来创建 Pod
metadata: ## Pod 的元数据
labels: ## Pod 的标签
app: httpd ##标签 app=httpd
spec: ##容器的信息
containers: ##容器
- name: httpd ##容器名
image: httpd ##容器所需的镜像
ports: ##端口
- containerPort: 80 ##容器暴露的端口
当我们不知道该怎么写时可以通过命令来查看更多详细内容:
查看Deployment资源对象由哪几部分组成
kubectl explain deployment
创建的deployment资源命令格式:
kubectl run deployment名称[参数-image 指定pod的镜像
-port 指定端口
-replicas 指定创建pod的数量
-namespace 指enamespace
使用命令创建删除 Deployment 资源
1.创建一个nginx的deployment资源
#k8s1.18版本之前直接使用kubectl run默认就是deployment资源
kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2
deployment.apps/nginx-deployment created
#1.18版本以上需要使用kubectl create创建deployment
kubectl create deployment nginx-deploy --image=nginx:1.15 --replicas=3 -n dev
deployment.apps/nginx-deploy created
2.查看deployment控制器创建的pod
#可以看到我们刚刚制定了副本数为3,就启动了3个pod
[root@k8s-master ~]# kubectl get deploy,pod -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 3/3 3 3 5m39s
NAME READY STATUS RESTARTS AGE
pod/nginx-deploy-75fbdff8c-fjc47 1/1 Running 0 5m39s
pod/nginx-deploy-75fbdff8c-sjm5f 1/1 Running 0 5m39s
pod/nginx-deploy-75fbdff8c-xlh2q 1/1 Running 0 5m39s
#UP-TO-DATE:成功升级的副本数量(也就是本次更新成功的副本数)
#AVAILABLE:可用副本的数量
3.查看deployment资源的详细信息
[root@k8s-master ~]# kubectl get deploy,pod -n dev -o wide
4.查看deployment资源创建过程信息
使用 Yaml 创建 Deployment
1.编写yaml
[root@k8s-master ~]# vimnginx.yaml
apiVersion: apps/v1 #deployment资源支持的版本号
kind: Deployment #控制器类型为Deployment
metadata: #元数据信息
name: nginx-deploy #定义deployment资源的名称
namespace: dev #定义deployment资源所在的命名空间
spec: #定义deployment资源的属性
replicas: 3 #pod副本数为3,即启动3个pod
selector: #标签选择器
matchLabels:
app: nginx #匹配标签app为nginx的pod模板
template: #定义pod资源模板
metadata: #元数据
labels: #定义标签
app: nginx #定义app标签为nginx
spec: #定义pod属性
containers: #定义容器信息
- image: nginx:1.15 #定义docker镜像
name: nginx-pod #定义pod的名称
ports: #定义容器的端口号
- name: nginx-port #给端口号起个名字
containerPort: 80 #容器要启动的端口
protocol: TCP #端口属于什么协议
2.创建yaml
[root@k8s-master ~]# kubectl create -f nginx.yaml
deployment.apps/nginx-deploy created
3.查看pod
[root@k8s-master ~]# kubectl get deploy,pod -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 3/3 3 3 5m53s
NAME READY STATUS RESTARTS AGE
pod/nginx-deploy-7dd5c8f664-6qh2k 1/1 Running 0 5m52s
pod/nginx-deploy-7dd5c8f664-bmlpn 1/1 Running 0 5m52s
pod/nginx-deploy-7dd5c8f664-zbd8k 1/1 Running 0 5m52s
查看 Deployment 更新记录
kubectl rollout history deployment nginx-deployment --revision=2