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
posted @ 2022-12-22 14:47  流星<。)#)))≦  阅读(99)  评论(0编辑  收藏  举报