前言: Kubernetes是一个帮助我们更轻松地管理和运行应用程序的工具。它会帮助我们自动地将应用程序分配到合适的服务器上,并确保它们一直在运行,还可以自动地增加或减少应用程序的数量,以适应流量的变化。还具有帮助应用程序进行负载均衡,管理和保护敏感数据,以及在不同的云平台上部署应用程序等。总的来说,Kubernetes可以帮助我们更方便地管理和运行容器化的应用程序。

一、核心概念

一台服务器就是一个节点,一个节点下面可能有多个pod,一个pod下面有多个容器。当我们输入一条k8s的指令时,实际上是与主节点的api-server进行通信,向其发送指令或请求,然后主节点的api-server会接受指令并验证合法性,然后下发给对应的工作节点。

1、传统部署的演变历史

传统部署:服务都部署到一台服务器上,问题:环境不隔离

虚拟机部署:服务器上开多个虚拟机,服务部署到虚拟机上,(每台虚拟机有自己的操作系统)问题:占用资源过多

容器化部署:用的是(宿主机)原有操作系统(cpu、网络、磁盘、进程),解决了上述的问题。新问题:操作系统受到攻击,所有容器会受影响。也会相互竞争内存、网络等资源。

2、k8s的特点

K8s部署:自我修复(delete pod)弹性伸缩、服务发现和负载均衡、存储编排(由虚拟"磁盘映射到真正的物理磁盘)可以通过resource给每个pod配置资源

3、集群架构与组件

控制面板(master节点): 负责集群管理和控制,包括资源分配和调度,监控等

api-server (核心组件): k8s的一个中心,甚于rest风格开放k8s的接口服务。

Kube-controller-manage: 控制器管理器,针对k8s的各种资源进行管理

cloud-controller-manage:云控制器管理器,第三方平台提供的控制器APL对接管理功能。

Kube-schedule调度器负责将pod基于定算法,将其调度到更合适的节点(服务器)上

Etcd理解为k8s的数据库,键值对存储的分布式数据库,提供基于raft算法的集群高可用节点(Node):工作节点,服务运行容器并提供服务,接受主节点指令和调度决策

Kubelet:负责pod的生命周期、存储、网络

Kube-proxy:网络代理。负责Service的服务发现负载均衡,pod之间以及pod与外部通信

Contain-runtime:容器运行时环境docker.、containerd 、CRI-O中选一个

附加组件

Kube-dns: 域名解析的组件

Dashboard可以理解为一个可视化访问工具

4、资源和对象

资源的分类
spec:“规约”,spec是必须的,它描述了对象的期望状态有哪些。当创建kubernetes对象时,必须提供对象的规约,用来描述对象的理想状态及基本信息,如名称

在这里插入图片描述

4.1 资源/命名空间级 —— 工作负载型:pod

pod本身就是一种资源,可以通过deploment等文件等去定义pod

在这里插入图片描述

RC:帮助我们动态更新副本数(弃用)
RS:帮助我们动态更新副本数,根据selector来标记pod的复制模版。
Deployment:具备RS 的功能外,还提供滚动升级/回滚,比如我们修改了nacos配置,可以delete pod实现滚动更新。在原pod基础上复制一份启用,然后在将原pod删除,这样用户是无感知的

pod详细描述
在这里插入图片描述

1、pod相关
1.1 K8s的网络模型 pod是k8s的最小运行单位。假定所有的pod都在一个扁平的网络空间,pod与pod之间可以直接访问。一个pod里可以有多个服务,每个服务的端口不可以冲突。
1.2 pod的分类
自主式 pod:不通过Deployment文件定义,直接在k8s的节点上通过静态配置文件进行配置,不受控制器控制,pod退出,此类型的pod不会被创建
管理器控制的pod: 一般通过Deployment文件来定义,Deployment用于定义应用程序的部署规范,包括副本数、容器镜像、资源配置等。它描述了如何创建和管理Pod。

4.2资源/命名空间级 —— 服务发现:Ingress和Service

在这里插入图片描述

NodePort是Kubernetes中的一种Service类型,用于将集群内部的一个服务公开到集群外部。当创建一个NodePort Service时,Kubernetes会分配一个高端口号(30000-32767)并将它映射到集群中某个节点上的特定端口。这意味着可以使用集群中任何节点的IP地址和分配的NodePort来访问Service。
要创建一个NodePort Service,首先需要编写一个Service定义文件,例如:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30080

k8s的service里有什么?

在Kubernetes的Service中,通常包含以下几个重要的部分:

1. Cluster IP(集群IP):Service会分配一个Cluster IP,它是一个虚拟的内部IP地址,用于在集群内部定位Service。其他Pod或Service可以通过该Cluster IP来访问Service提供的服务。
2. Port(端口):Service会暴露一个或多个端口,用于监听来自其他Pod或外部的请求。这些端口可以是TCP或UDP协议的,用于不同类型的服务访问。
3. Selector(标签选择器):Service通过标签选择器来关联一组Pod。当请求到达Service时,根据Service的选择器匹配相应的Pod,将请求转发给这些Pod来处理。
4. Endpoints(终节点):Service维护一个Endpoints列表,记录了与Service关联的Pod的IP地址和端口信息。当Service接收到请求时,根据选择器匹配的Pod会被自动添加到Endpoints列表中。
5. Service Type(Service类型):Service可以定义不同的类型,包括ClusterIP、NodePort、LoadBalancer和ExternalName等。不同类型的Service可以提供不同的访问方式和暴露方式。
总的来说,Kubernetes的Service是一种抽象概念,用于将一组Pod打包成一个服务,并暴露给其他Pod或外部应用访问。通过Service,可以实现负载均衡、服务发现、内部通信等功能,是Kubernetes中非常重要的一部分。
4.3资源/命名空间级 —— 特殊类型存储:ConfigMap

Kubernetes的ConfigMap是一种用于存储配置数据的机制。它将配置数据以键值对的形式保存,并可以注入到容器中,下面是使用ConfigMap的示例:

#1、创建ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  key1: value1
  key2: value2

#2、将ConfigMap注入到Pod中的容器:
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-image
      envFrom:
        - configMapRef:
            name: my-config

在上述示例中,首先创建了一个名为"my-config"的ConfigMap,并定义了"key1"和"key2"两个键值对。然后,在Pod的配置中,通过"envFrom"字段将ConfigMap注入到了名为"my-container"的容器中。
这样,容器内的应用程序可以通过读取环境变量"key1"和"key2"来获取ConfigMap中定义的值。

#获取名称空间下所有的ConfigMap
kubectl get cm -n <名称空间>
#查看具体的ConfigMap的配置内容
kubectl describe cm  <ConfigMap名称>  -n <名称空间>

下面是一个示例的Kubernetes YAML文件,包含Deployment和Service的定义:

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example-app
  template:
    metadata:
      labels:
        app: example-app
    spec:
      containers:
        - name: example-container
          image: nginx:latest
          ports:
            - containerPort: 80

上述文件定义了一个名为 “example-deployment” 的Deployment,它将3个Pod副本部署到集群中。使用的镜像是Nginx,并在容器的80端口暴露服务。

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector:
    app: example-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

上述文件定义了一个名为 “example-service” 的Service,它的selector指定为 “app: example-app”,与上面的Deployment中的标签匹配。该Service监听80端口,并将流量转发到后端Pod的80端口。类型(type)为ClusterIP,表示该Service将通过集群内部IP暴露。

在Kubernetes的Deployment和Service中,通常情况下会选择将matchLabels和labels中的指定字段取相同的名字是为了实现关联和匹配。

二、常用命令

若是默认的namespace,下面所有命令中的 -n '名称空间' 不用添加

1、查看pod

k8s里的namespace和nacos里的namespace不是一个概念,k8s的namespace默认是default,可以自己自定义名称;

#查看指定命名空间下的所有pod
kubectl get pods -n  '名称空间'
#查看某一个pod的详细配置
kubectl describe pod  'pod名称'   -n  '名称空间'  
# 查看pod下的日志
kubectl logs  'pod名称'  -n '名称空间'
#查看某个容器的日志
#(如果只有一个容器  -c '容器名称' 可以不用加)
kubectl logs 'pod名称'  -n '名称空间' -c '容器名称'

注意: 我们拉取镜像尽量不要用latest,因为在不同时期的latest是不同的,会导致容器每次启动都会去拉取最新的。

2、容器内部命令

kubectl exec 是 Kubernetes 命令行工具 kubectl 的一个子命令,用于在一个正在运行的容器内部执行命令,在执行 kubectl exec 命令时,需要在 - - 后面指定要在容器内部执行的命令

#命令顺序
kubectl exec -it  -n '名称空间' <pod-name>  -c <container-name>  -- <command>
其中:
-it 表示以交互式的方式进入容器。
-c <container-name> 是可选的,用于指定要执行命令的容器的名称。

#在使用 kubectl exec 命令时,你可以在 <command> 部分输入任何容器内可执行的有效命令。
查看当前目录下所有文件(包括隐藏文件):ls -a
查看文件内容:cat <file>
在文件中搜索指定字符串:grep <pattern> <file>
启动一个 Shell 终端:bash 或 sh
运行一个命令行工具,如 vimnano 来编辑文件
运行一个网络工具,如 ping、curl 或 wget 来进行网络测试或下载文件

注意:。例如:

kubectl exec -it <pod-name> -- ls
#进入容器内,启动一个shell终端
kubectl exec -it <pod-name>   -n '名称空间'  /bin/bash
#根目录下查找文件
find / -iname '文件名称'
# 实时查看日志(tail为最新日志,默认10行)
tail  -300f  '日志文件'
3、删除pod
#如果我们更新了nacos里的yaml配置,直接删除pod即可,k8s会自动启动新pod
kubectl delete pod  <pod-name>  -n '名称空间'
4、查看所有端口
#kubectl get svc命令用于获取当前Kubernetes集群中的所有Service(服务)的信息,包括服务的名称、类型、Cluster IP和已使用的端口
kubectl get services  -n '名称空间'
#导出Service配置:使用kubectl get svc命令和参数-o yaml
kubectl get services <serviceName>  -n '名称空间'  -o yaml

clusterIP是Kubernetes(K8s)特有的服务类型之一,是服务暴露给集群内部的虚拟IP地址,它负责将请求路由到后端的Pod。当clusterIP挂掉时,服务将无法通过clusterIP进行访问。

5、curl命令
# curl命令不是k8s的专属命令,可用于发送HTTP、HTTPS、FTP等请求
curl ip:port
6、打包docker镜像
#查看pod信息,找到docker镜像 
#docker images命令可能会找不到镜像,所以根据pod信息找
kubectl describe pod <pod-name>  -n '名称空间'
docker pull "docker镜像"
#重命名
docker save "docker镜像" -o "xxx.tar"
#下载到本地
sz "xxx.tar"    

Logo

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

更多推荐