命令行

NameSpace

顾名思义成为“命名空间”,在一个k8s集群中可以拥有多个命名空间,在逻辑上彼此隔离。
namespace是一组资源和抽象的集合,可以用系统内部对象划分不同的项目组或用户组。常见的pods,services,replication,controllers,deployments等都是属于某一个namespace的(默认为default)
而node,persistentVolumes等则不属于任何namespace。
k8s中自带的namespace:

  • default:资源默认被创建的命名空间
  • kube-system:k8s组件使用
  • kube-node-lease:k8s集群中的租约状态(v1.13加入)
  • kube-public:公共资源使用

默认是default的namespace并不能删除。创建多个namespace容易将服务分割成容易管理的块。
作用:

  • 多租户的情况下,实现资源隔离
  • 属于逻辑隔离
  • 属于管理边界
  • 可以针对每一个namespace做到资源分配
#查看所有namespace
kubectl get namespace

#查询集群中的所有pod,带有namespace
kubectl get pods --all-namespaces
kubectl get pod -A

#查看所有namespace,简写命令
kubectl get ns

#创建namespace
kubectl create namespace zoro

#创建namespace,简写
kubectl create ns zoro

#删除namespace
kubectl delete namespace zoro

#删除namespace,简写
kubectl delete ns zoro

Pod

pod是kubernetes中的最小单位,pod是容器的封装,是所有业务类型的基础。pod是通过deployment控制器来管理的
pod可以由一个或多个容器组合,这些容器共享存储、网络和命名空间以及如何运行规范。所有容器都是统一安排和调度,并运行在共享上下文中。相对具体的应用而言,pod是它们的逻辑主机,pod包括业务中相关的多个应用容器。
pod的特点:

  • 网络

每一个pod都会被指派一个唯一的ip,在pod中每一个容器共享网络的命名空间,包括ip地址和端口。当pod中中的容器需要与外部的实体进行通信时,则需要通过端口等共享网络资源。

  • 存储

pod能够被指定共享存储卷的集合,在pod所有的容器都能访问共享的存储卷,允许这些容器共享数据。存储卷也允许在一个pod中持久化数据,以防止其中的容器被重启。
pod的工作方式
k8s通过控制器和模版配置来管理和调度。

  • pod模版
  • pod重启

在pod中容器可能由于异常等原因导致其终止退出。
pod支持3种重启策略:

     - Always:只要退出就会重启
     - OnFailure:只要在失败退出时(exit code不等于0),才会重启
     - Never:只要退出,就不再重启

上述策略可在配置文件中通过restartPolicy进行配置重启策略。
重启策略对同一个pod的所有容器起作用,容器的重启由node上的kubelet进行执行。

  • 资源限制

k8s是通过cgroups限制容器的cpu和内存等计算资源,包括requests(调度器保证请求能调度到资源充足的node上)和 limits 等。

#运行pod,这里的image是基于docker的镜像
#kubectl run deployment控制器名称 --image=docker镜像 --port=端口
kubectl run tomcat9-test --image=tomcat:9.0.20-jre8-alpine --port=8080

#查看pod
kubectl get pod
#查看pod,更加详细的信息
kubectl get pod -o wide

#查看deployment控制器,pod是通过deployment控制器来管理的
kubectl get deployment
#查看deployment控制器详情
kubectl get deployment -o wide

#删除deployment控制器
#kubectl delete deployment.apps 控制器name
kubectl delete deployment.apps tomcat9-test

#扩容
#kubectl scale --replicas=10 deployment deployment的name
kubectl scale --replicas=10 deployment tomcat9-test

deployment上有一层service,它的作用是给集群外的一些地址进行服务,集群外的就可以通过service来访问pod里的容器了。

#创建服务
#kubectl expose deployment deloyment的name --name=定义service的name --port=service对集群内其他的应用暴露端口 --target-port=pod内的目标端口 --protocol=TCP --type=NodePort
#使用NodePort方式能让集群外的应用进行访问
kubectl expose deployment tomcat9-test --name=tomcat9-svc --port=8888 --target-port=8080 --protocol=TCP --type=NodePort

#查看service
kubectl get service

#查看service,简写
kubectl get svc

常用命令

语法:kubectl [command][TYPE][NAME][flags]

#查看集群状态信息
kubectl cluster-info

#查看运行的状态
kubectl get cs

#查看节点运行状态
kubectl get nodes

#查看命名空间
kubectl get namespace

#查看service
kubectl get service

#查看namespace为kube-system下的service
kubectl get svc -n kube-system

#显示一个或多个资源的详细状态
kubectl describe [type][name]

#删除所有pod
kubectl delete pod --all

#进入容器
kubectl exec -it pod的name sh

#查看日志
kubectl logs -f pod的name

#查看模版信息, 将pod信息格式化输出到一个yaml文件
kubectl get pod pod的name -o yaml

#强制删除
kubectl delete pod pod的name --force--grace-period=0

资源缩写
在这里插入图片描述

使用资源文件

1.创建namespace

创建一个namespace-test.yml文件上传到服务器

apiVersion: v1
kind: Namespace
metadata:
  name: xiaofei
#执行namespace-test.yml文件
kubectl apply -f namespace-test.yml

查看执行结果
在这里插入图片描述

#删除
kubectl delete -f namespace-test.yml

2.创建pod

创建一个pod-test.yml文件上传到服务器

apiVersion: v1
kind: Pod
metadata:
  name: tomcat-pod
  labels:
    app: tomcat-pod
spec:
  containers:
    - name: mytest
      image: tomcat:9.0.20-jre8-alpine
      imagePullPolicy: IfNotPresent
  restartPolicy: Always

镜像下载策略(imagePullPolicy)

  • Always:总是拉取 pull
  • IfNotPresent:如果本地有镜像,使用本地,如果本地没有镜像,下载镜像
  • Never:只使用本地镜像,从不拉取
#执行文件创建pod
kubectl apply -f pod-test.yml

结果
在这里插入图片描述

注:通过资源文件创建的pod是不会创建deployment控制器的,所有删除只有没有控制器再次拉起。

#删除
kubectl delete -f pod-test.yml

3.创建deployment

创建一个tomcat-deployment.yml文件上传到服务器

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
  labels:
    app: tomcat-deployment
spec:
  replicas: 1
  template:
    metadata:
      name: tomcat-deployment
      labels:
        app: tomcat-pod
    spec:
      containers:
        - name: tomcat-deployment
          image: tomcat:9.0.20-jre8-alpine
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
  selector:
    matchLabels:
      app: tomcat-pod

注:在deployment资源文件中必须写matchLabels,而它又与template.labels是对应的

#执行文件创建deployment
kubectl apply -f tomcat-deployment.yml

结果
在这里插入图片描述

#删除deployment
kubectl delete -f tomcat-deployment.yml 

控制器类型
在这里插入图片描述

在这里插入图片描述

4.创建Service

创建一个tomcat-service.yml文件上传到服务器
多个资源用“—”进行分隔

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

service类型(spec.type)

  • ClusterIP:默认,分配一个集群内部可以访问的虚拟IP
  • NodePort:在每个Node上分配一个端口作为外部访问入口
  • LoadBalancer:工作在特定的Cloud Provider上,例如Google Cloud,AWS,OpenStack
  • ExternalName:表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务 进行通信

service参数

  • port :访问service使用的端口
  • targetPort :Pod中容器端口
  • nodePort: 通过Node实现外网用户访问k8s集群内service(30000-32767)
#执行tomcat-service.yml文件
kubectl apply -f tomcat-service.yml 

结果
在这里插入图片描述
在这里插入图片描述

上图可以看到tomcat部署在node1的节点上,但如下图通过访问不同节点的ip都能访问到tomcat,这因为k8s内部的负载均衡的原因。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐