20221215 3. 快速入门 ns、pod、deploy、svc
NameSpace
简介
中文名称:命名空间。
可以认为namespaces是kubernetes集群中的虚拟化集群。在一个Kubernetes集群中可以拥有多个命名空间,它们在逻辑上彼此隔离。 可以为你提供组织,安全甚至性能方面的帮助!
Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace
大多数的Kubernetes中的集群默认会有一个叫default的namespace。实际上,应该是4个:
-
default:你的资源默认被创建于default命名空间
-
kube-system:kubernetes 系统组件使用
-
kube-node-lease:kubernetes集群节点租约状态,v1.13 加入
-
kube-public:公共资源使用。但实际上现在并不常用。所有用户均可以访问,包括未认证用户
这个默认(default)的namespace并没什么特别,但你不能删除它。这很适合刚刚开始使用kubernetes和一些小的产品系统。但不建议应用于大型生产系统。因为,这种复杂系统中,团队会非常容易意外地或者无意识地重写或者中断其他服务service。相反,请创建多个命名空间来把你的service(服务)分割成更容易管理的块。
作用:多租户情况下,实现资源隔离
-
属于逻辑隔离
-
属于管理边界
-
不属于网络边界
-
可以针对每个namespace做资源配额
使用
查看
# 查看所有命名空间
kubectl get namespace
kubectl get ns
# 查看所有命名空间的pod资源
kubectl get pod --all-namespaces
kubectl get pod -A
创建
# 创建
kubectl create namespace lagou
kubectl create ns lagou
删除
# 删除
kubectl delete namespace lagou
kubectl delete ns lagou
YAML
apiVersion: v1
kind: Namespace
metadata:
name: lagou
# 创建
kubectl apply -f lagounamespace.yml
# 删除
kubectl delete -f lagounamespace.yml
Pod
简介
Pod 是 kubernetes 集群能够调度的最小单元。Pod 是容器的封装
在Kubernetes集群中,Pod是所有业务类型的基础,也是K8S管理的最小单位级,它是一个或多个容器的组合。这些容器共享存储、网络和命名空间,以及如何运行的规范。
在Pod中,所有容器都被统一安排和调度,并运行在共享的上下文中。对于具体应用而言,Pod是它们的逻辑主机,Pod包含业务相关的多个应用容器。
K8s 一般不直接创建Pod。 而是通过控制器和模版配置来管理和调度
特点
-
网络:每一个Pod都会被指派一个唯一的Ip地址,在Pod中的每一个容器共享网络命名空间,包括 IP 地址和网络端口。在同一个Pod中的容器可以和 localhost 进行互相通信。当Pod中的容器需要与Pod外的实体进行通信时,则需要通过端口等共享的网络资源
-
存储:Pod 能够被指定共享存储卷的集合,在Pod中所有的容器能够访问共享存储卷,允许这些容器共享数据。存储卷也允许在一个Pod持久化数据,以防止其中的容器需要被重启
YAML 配置说明
重启策略 restartPolicy
spec.restartPolicy
在Pod中的容器可能会由于异常等原因导致其终止退出,Kubernetes提供了重启策略以重启容器。重启策略对同一个Pod的所有容器起作用,容器的重启由Node上的kubelet执行。
Pod支持三种重启策略,在配置文件中通过 restartPolicy
字段设置重启策略:
-
Always
:只要退出就会重启 -
OnFailure
:只有在失败退出(exit code不等于0)时,才会重启 -
Never
:只要退出,就不再重启
注意,这里的重启是指在Pod的宿主Node上进行本地重启,而不是调度到其它Node上
镜像下载策略 imagePullPolicy
spec.containers.imagePullPolicy
-
Always
:总是拉取 -
IfNotPresent
:如果本地有镜像,使用本地,如果本地没有镜像,拉取 -
Never
:只使用本地镜像,从不拉取
资源限制 resources
spec.containers.resources
Kubernetes通过cgroups限制容器的CPU和内存等计算资源,包括
-
requests
:请求,所需的最小计算资源量 -
limits
:上限,所允许的最大计算资源用量
使用
查看
# 查看default命名空间下的pods
kubectl get pod
# 多了 IP、Node 等信息
kubectl get pod -o wide
# 查看kube-system命名空间下的pods
kubectl get pods -n kube-system
# 查看所有命名空间下的pods
kubectl get pod --all-namespaces
kubectl get pod -A
创建
# 创建
kubectl run tomcat9-test --image=tomcat:9.0.20-jre8-alpine --port=8080
# 使用pod的IP访问容器
curl podIP:8080
删除
# 删除,根据pod名称
kubectl delete pod tomcat9-test
YAML
apiVersion: v1
kind: Pod
metadata:
name: tomcat9
labels:
app: tomcat9
spec:
containers:
- name: tomcat9
image: tomcat:9.0.20-jre8-alpine
imagePullPolicy: IfNotPresent
restartPolicy: Always
# 创建
kubectl apply -f tomcatpod.yml
# 删除
kubectl delete -f tomcatpod.yml
Deployment
YAML 配置说明
matchLabels
spec.selector.matchLabels
在 Deployment 中必须写 matchLables
在定义模板的时候必须定义labels ,因为 Deployment.spec.selector
是必须字段,而他又必须和 Deployment.spec.template.metadata.labels
对应
使用
查看
# 查看default命名空间下的deployment
kubectl get deploy
kubectl get deployment
kubectl get deployment -o wide
扩容
# 将deployment副本扩容至3个
kubectl scale --replicas=5 deployment/tomcat-deploy
YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deploy
labels:
app: tomcat-deploy
spec:
replicas: 3
template:
metadata:
name: tomcat-deploy
labels:
app: tomcat-pod
spec:
containers:
- name: tomcat-deploy
image: tomcat:9.0.20-jre8-alpine
imagePullPolicy: IfNotPresent
restartPolicy: Always
selector:
matchLabels:
app: tomcat-pod
# 创建
kubectl apply -f tomcatdeployment.yml
# 删除
kubectl delete -f tomcatdeployment.yml
Servcie
YAML 配置说明
selector
spec.selector
service.spec.selector.app
选择的内容仍然是 template.label.app
内容。而不是
deployment 控制器的 label 内容
type
spec.type
-
ClusterIP
:默认,分配一个集群内部可以访问的虚拟IP -
NodePort
:在每个Node上分配一个端口作为外部访问入口 -
LoadBalancer
:工作在特定的Cloud Provider上,例如 Google Cloud,AWS,OpenStack -
ExternalName
:表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务进行通信
ports
spec.ports
-
port
:Service 将公开的端口 -
targetPort
:在 Service 所针对的 Pod 上要访问的端口号或名称。 编号必须在 1 到 65535 的范围内 -
NodePort
:当类型为 NodePort 或 LoadBalancer 时,Service 公开在节点上的端口(30000-32767)
使用
查看
# 查看default命名空间下的service
kubectl get svc
kubectl get svc -o wide
创建
# 创建service
kubectl expose deployment tomcat9-test --name=tomcat9-svc --port=8888 --target-port=8080 --protocol=TCP --type=NodePort
YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deploy
labels:
app: tomcat-deploy
spec:
replicas: 1
template:
metadata:
name: tomcat-deploy
labels:
app: tomcat-pod
spec:
containers:
- name: tomcat-deploy
image: tomcat:9.0.20-jre8-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
restartPolicy: Always
selector:
matchLabels:
app: tomcat-pod
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
spec:
selector:
#标签选择必须是template.labels.app
app: tomcat-pod
ports:
- port: 8888 #对集群内其他服务暴露端口号
targetPort: 8080
nodePort: 30088
type: NodePort
# 创建
kubectl apply -f tomcatservice.yml
# 删除
kubectl delete -f tomcatservice.yml
# 测试
curl k8s-master ip:30088