文章目录
- Namespace
- Pod
- Label
- Deployment
- Service
Namespace
在Kubernetes系统中,Namespace是一种至关重要的资源类型,其主要功能在于实现多套环境的资源隔离或者多租户的资源隔离,默认情况下所有的Pod都能够相互访问,但如果不想让两个Pod之间存在互相访问,就可以把这两个Pod分别划分到不同的Namespace当中,Kubernetes可以把集群内部的资源分配至不同的Namespace,在逻辑上构建出一个个组,从而能够对不同组的资源进行隔离式的使用和管理。
查看所有命名空间
[root@k8s-master ~]# kubectl get namespace
- default:未指定Namespace的pod对象都会被分配在default命名空间
- dev:自己建的命令空间
- kube-flannel:主要用于部署和管理Flannel网络插件,Flannel是Kubernetes集群中常用的网络解决方案,负责为Pod提供网络通信能力
- kube-node-lease:用于集群节点之间的心跳维护
- kube-public:该命名空间下的资源可以被所有人访问
- kube-system:由Kubernetes系统创建的资源都处于这个命名空间
查看指定命令空间
kubectl get ns default
指定输出格式,kubernetes支持的格式有很多,比较常见的是wide、json、yaml
查看namespace详情 命令:kubectl describe ns ns名称
创建
kubectl create ns test
删除
kubectl delete ns test
操作配置文件
vim ns-test2.yaml
apiVersion: v1
kind: Namespace
metadata:name: test2
创建
kubectl create -f ns-test2.yaml
删除
kubectl delete -f ns-test2.yaml
Pod
Pod是k8s集群管理的最小单元,Pod里面包含一个或多个容器,而程序运行部署在容器中,Pod可以认为是容器的封装。
查询指定namespace的pod
kubectl get pod -n kube-system
创建并运行
kubectl run pod2 nginx --image=nginx:1.17.1 --port=80 --namespace dev
查看pod的信息及详情
kubectl get pod -n dev
kubectl describe pod pod -n dev
删除指定的Pod
kubectl delete pod pod2 -n dev
配置文件操作pod
vim a.yaml
apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: dev
spec:containers:- image: nginx:1.17.1name: podports:- name: nginx-portcontainerPort: 80protocol: TCP
创建pod
kuebectl create -f a.yaml
删除pod
kubectl delete -f a.yaml
查看pod详情
kubectl describe pod nginx -n dev
Label
Label在Kubernetes中是标签,主要用于在各类资源上添加特定的标识,从而实现对这些资源的区分与选择。
Label具有以下特点:
- Label是以键值对(key/value)的形式添加到各种不同的对象上的,像Node(节点)、Pod(容器组)、Service(服务)等对象都可以添加Label。
- 一个资源对象可以定义多个Label,一个Label也能够被添加到多个资源对象上。
- Label的标记通常是在资源对象定义的时候完成的,也可以在对象创建之后对其进行添加或者删除操作。
- 通过Label能够实现资源的多维度分组,在进行资源的分配、调度、配置以及部署等一系列管理工作时,就可以更加灵活、便捷地操作。
在完成标签的定义后,还需要对标签进行选择,这时候就要用到Label Selector了。
Label的作用是给指定的资源对象打标记;而Label Selector的主要功能是查询和筛选那些具有特定标签的资源对象。
Label Selector主要有以下两种类型:
一、基于等式的Label Selector
- 当使用“name = master”这种形式的表达式时,会挑选出键(key)为“name”并且值(value)为“master”的对象。
- 若表达式为“env!= dev”,则会选择键(key)为“env”且值(value)不等于“dev”的对象。
二、基于集合的Label Selector
- 对于“name in (master,slave)”这样的表达式,则会选取键(key)为“name”并且值(value)是“master”或者“slave”的对象。
- 要是表达式为“name not in (master)”,就会选择键(key)为“name”且值(value)不等于“master”的对象。
给pod打标签
kubectl label pod nginx version=1.0 -n dev
查看pod标签
kubectl get pod nginx -n dev --show-labels
更新pod标签
kubectl label pod nginx version=2.0 -n dev --overwrite
筛选标签
kubectl get pod -l version=2.0 -n dev --show-labels
删除标签
kubectl label pod nginx version- -n dev
配置文件方式
apiVersion: v1
kind: Pod
metadata:name: nginx2namespace: devlabels:version: "3.0"env: "test"
spec:containers:- image: nginxname: podports:- name: nginx-portcontainerPort: 80protocol: TCP
Deployment
在Kubernetes里,Pod是最小的控制单元,可以通过Pod控制器来对pod进行控制,Pod控制器的主要作用是对Pod进行管理,保证Pod资源处于预期的状态,一旦Pod资源出现问题,比如发生故障,Pod控制器就会尝试重启或者重新构建Pod。
Kubernetes中的Pod控制器有多种,较为常见的有以下几种:
- ReplicationController:这是最早期的Pod控制器,如今已经被废弃,其功能由ReplicaSet代替。
- ReplicaSet:能保证Pod的数量在期望的水平,同时,它还支持对Pod数量进行扩缩容操作以及镜像版本的升级。
- Deployment:通过控制ReplicaSet来间接管理Pod,还具备滚动升级和回退版本的功能。
- Horizontal Pod Autoscaler:可以根据集群的实际负载情况,自动对Pod的数量进行调整,能在集群负载高峰时增加Pod数量,低谷时减少Pod数量,从而实现削峰填谷的效果。
- DaemonSet:会在集群中指定的Node节点上运行,并且每个指定节点上仅运行一个副本,通常用于执行守护进程类的任务。
- Job:由它创建出来的Pod在完成任务后会立即退出,主要用于执行一次性任务。
- Cronjob:它所创建的Pod主要负责周期性任务的执行。
- StatefulSet:专门用于管理有状态的应用程序,能够为每个应用实例提供稳定的网络标识和持久化存储。
其中 Deployment 是最常用的pod控制器。
# 命令格式: kubectl run deployment [参数]
# --image 指定pod的镜像
# --port 指定端口
# --replicas 创建pod的数量
# --namespace 指定namespace
创建deployment
kubectl create deployment my-deploy --image=nginx --port=80 --replicas=3 -n dev
查看创建的Pod以及deployment信息
kubectl get pod -n dev
kubectl get deploy -n dev
查看deployment的详细信息
kubectl describe deploy my-deploy -n dev
配置文件操作
vim deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxnamespace: dev
spec:replicas: 3selector:matchLabels:run: nginxtemplate:metadata:labels:run: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80protocol: TCP
创建deployment
kubectl create -f deploy-nginx.yaml
删除
kubectl delete deploy nginx -n dev
Service
可以通過Deployment来创建一组Pod,以提供高可用性的服务,但是每个Pod都会被分配一个独立的Pod IP,这会出现一些问题,比如当Pod进行重建时,其对应的Pod IP会发生变化;此外,Pod IP是仅在集群内部可见的虚拟IP,外部环境无法对其进行访问,针对以上问题,可以通过Service来解决。
Service可以为理解为是一组相同类型Pod对外提供服务的访问接口,通过Service应用程序能够实现服务发现以及负载均衡的功能。
创建集群内部可访问的Service
kubectl expose deploy my-deploy --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
kubectl get svc svc-nginx -n dev -o wide
CLUSTER-IP是service的IP,在Service的生命周期中该地址是不会变动的,可以通过这个IP访问当前service对应的pod
创建集群外部也可访问的Service
Service的type类型为ClusterIP,该ip地址只在集群内部可访问,如果需要创建外部可以访问的Service,需要修改type为NodePort。
kubectl expose deploy my-deploy --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
kubectl get svc svc-nginx2 -n dev -o wide
此时可以通过集群外的主机访问 节点IP:30681访问服务了
删除service
kubectl delete svc svc-nginx2 -n dev
配置文件
vim svc-nginx.yaml
apiVersion: v1
kind: Service
metadata:name: svc-nginxnamespace: dev
spec:clusterIP: 10.109.179.231ports:- port: 80protocol: TCPtargetPort: 80selector:run: nginxtype: ClusterIP
kubectl get svc svc-nginx -n dev -o wide