Kubernetes功能及核心概念(附带个Mysql.yaml文件)

Kubernetes功能及核心概念


可能本篇文章文字居多,但也希望能认真阅读,因为Kubernetes的概念相对来说比较重要,以及在大家学习的过程中也会感觉到略微抽象

一,首先什么是Kubernetes?

Kubernetes是一个开源的容器编排工具,用于自动部署,扩展和管理容器。可轻松的管理大规模的管理容器化的工作负载。以下简称就是k8s了(因为k与s之间有8个字符所以简称k8s)。

二,Kubernetes和Docker有什么不一样?

Docker属于容器化平台,提供了简单易用的容器化工具。可以对程序进行构建,打包,容器化。更侧重于容器的构建和运行。

Kubernetes则属于一种编排工具,更侧重于多个容器组成的应用程序的编排和管理,提供了更多的功能(如下)及概念(如下),帮助用户更轻松地管理复杂的容器化工作负载。

三,K8s的主要功能。

  1. **自动化部署:**可以自动化部署容器化的应用,并根据使用需求进行自动扩展和调度。
  2. 自我修复: k8s可以监控应用程序的健康状态,并在出故障时自动重启。就好比某个服务挂了,可以自动修复重启。
  3. **水平扩展:**k8s可根据当前服务器的负载,创建程序的副本数量。从而满足对资源的需求,也可以根据自定义的策略进行调整。
  4. 服务发现和负载均衡: k8s提供了内置的服务发现和负载均衡。可平衡流量的负载。用户可通过定义的服务来暴露程序。应用与路由及副本之间。
  5. 密钥和配置管理: k8s可安全存储敏感信息和应用程序的配置,将敏感信息存储在私密中,并配置在configMaps中,然后在容器中使用他们。这里打个比方比如环境变量或证书。
  6. **存储编排:**k8s支持持久化存储,根据需求自动挂载储存卷用户可通过定义PV(资源对象,好比数据)和PVC(声名pv的资源是某个节点上的)对象进行请求和持久化存储。
  7. 批处理执行: 可进行批量作用和定时任务执行,可根据用户的需求自动调度和管理批量处理任务。通过定义Job和CronJob来实现。

四,K8s核心概念。

  1. **Pod(Pod):**pod是k8s中最小的可部署单元,它可以包含一个或多个容器。这些容器共享网络和命名空间和持久卷,可与本地的主机进行进程间的通信。
  2. **Deployment(部署):**用于定义Pod的副本数量和更新策略。可确保指定数量的Pod开始终止运行,并控制如何进行滚动更新。功能如起名。
  3. **Service(服务):**可以定义一组Pod的访问方式,为Pod提供稳定的网络节点,并通过负载均衡分发流量。
  4. **Namespace(命名空间):**用于划分虚拟集群的机制,允许在同一个k8s集群中创建多个隔离的工作区,通俗说就是用命名空间对资源之间进行隔离,并且创建单独的工作区,跟k,v有的像。
  5. **Volume(存储卷):**是k8s中用于持久化的机制。可以持久化存储挂载到Pod中,并使得数据可以跨容器共享。持久化数据使用。
  6. **ConfigMap 和 Secret(配置映射和密钥):**用于存储信息和敏感数据和对象,可以在Pod中注入环境变量或文件,证书。并应用到程序中使用。
  7. **StatefulSet(有状态副本集):**用于运作有状态的应用程序的控制器。可以确保在集群中创建固定数量的副本,并为每个副本分配稳定的网络和持久化存储。
  8. Job 和 CronJob(作业和定时任务): Job 和 CronJob 是用于执行一次性或定时任务的对象。Job 用于运行一次性任务,而 CronJob 则用于按照指定的时间表运行任务。

Kubernetes指令与参数


指令与参数:(按核心概念划分)

  1. Pod(Pod):

    • 创建一个 Pod:kubectl create pod <pod_name> --image=<image>
      • --restart:设置 Pod 的重启策略。
      • --env:设置环境变量。
      • --limits--requests:设置容器的资源限制和请求。
      • --command--args:指定容器的启动命令和参数。
      • --port:指定容器监听的端口。
      • --labels:为 Pod 添加标签。
      • --annotations:为 Pod 添加注释。
      • --namespace:指定 Pod 所属的命名空间。
      • --stdin--stdout--tty:设置容器的标准输入、输出和伪终端。
    • 获取 Pod 列表:kubectl get pods
    • 查看 Pod 的详细信息:kubectl describe pod <pod_name>
    • 删除一个 Pod:kubectl delete pod <pod_name>

  2. Deployment(部署):

    • 创建一个 Deployment:kubectl create deployment <deployment_name> --image=<image>
      • --replicas:设置 Deployment 的副本数量。
      • --port:指定容器监听的端口。
      • --labels:为 Deployment 添加标签。
      • --namespace:指定 Deployment 所属的命名空间。
      • --restart:设置 Deployment 的重启策略。
      • --env:设置环境变量。
      • --limits--requests:设置容器的资源限制和请求。
      • --strategy:设置 Deployment 的更新策略。
    • 获取 Deployment 列表:kubectl get deployments
    • 查看 Deployment 的详细信息:kubectl describe deployment <deployment_name>
    • 编辑 Deployment 的配置:kubectl edit deployment <deployment_name>
    • 扩展 Deployment 的副本数量:kubectl scale deployment <deployment_name> --replicas=<replica_count>
    • 更新 Deployment:kubectl apply -f <deployment_yaml>

  3. Service(服务):

    • 创建一个 Service:kubectl create service <service_type> <service_name> --tcp=<port>:<target_port>
      • --type:指定服务的类型。
      • --labels:为 Service 添加标签。
      • --protocol:指定端口的协议。
      • --node-port:指定 NodePort 服务的节点端口范围。
      • --external-ip:指定 LoadBalancer 类型的服务的外部 IP 地址。
      • --cluster-ip:指定 ClusterIP 类型的服务的集群 IP 地址。
      • --namespace:指定 Service 所属的命名空间。
      • --selector:定义 Service 所选择的 Pod 的标签选择器。
      • --port-name:为端口指定名称。
    • 为 Deployment 暴露一个服务:kubectl expose deployment <deployment_name> --target-port=<target_port> --type=<service_type>
      • --port=<port>:指定服务的端口,即你希望其他应用程序或用户访问的端口(你想开放的端口)。
      • --target-port=<target_port>:指定服务所指向的 Deployment 中容器的端口。这是 Deployment 中容器正在监听的端口(就是内部端口暴露在外)。
      • --type=<service_type>:指定服务的类型,常见的类型有 ClusterIP(默认)、NodePort、LoadBalancer 等。
    • 获取 Service 列表:kubectl get services
    • 查看 Service 的详细信息:kubectl describe service <service_name>
    • 删除一个 Service:kubectl delete service <service_name>

  4. Namespace(命名空间):

    • 创建一个 Namespace:kubectl create namespace <namespace_name>
    • 获取 Namespace 列表:kubectl get namespaces
    • 查看 Namespace 的详细信息:kubectl describe namespace <namespace_name>
    • 删除一个 Namespace:kubectl delete namespace <namespace_name>

  5. Volume(存储卷):

    • 创建一个 PersistentVolume:kubectl create pv <pv_name> --capacity=<storage_capacity> --hostPath=<path>
      • --access-modes:指定 PersistentVolume 的访问模式。
      • --storage-class:指定 PersistentVolume 的存储类。
      • --reclaim-policy:指定 PersistentVolume 的回收策略。
      • --labels:为 PersistentVolume 添加标签。
      • --annotations:为 PersistentVolume 添加注释。
      • --namespace:指定 PersistentVolume 所属的命名空间。
    • 获取 PersistentVolume 列表:kubectl get pv
    • 查看 PersistentVolume 的详细信息:kubectl describe pv <pv_name>
    • 删除一个 PersistentVolume:kubectl delete pv <pv_name>

  6. ConfigMap 和 Secret(配置映射和密钥):

    • 创建一个 ConfigMap:kubectl create configmap <configmap_name> --from-file=<file_path>
      • --from-env-file:从环境变量文件创建 ConfigMap。
      • --dry-run:执行命令时,不会创建实际的资源对象。
      • --labels:为 ConfigMap 添加标签。
      • --namespace:指定 ConfigMap 所属的命名空间。
    • 创建一个 Secret:kubectl create secret generic <secret_name> --from-literal=<key>=<value>
    • 获取 ConfigMap 列表:kubectl get configmaps
    • 获取 Secret 列表:kubectl get secrets
    • 查看 ConfigMap 的详细信息:kubectl describe configmap <configmap_name>
    • 查看 Secret 的详细信息:kubectl describe secret <secret_name>
    • 删除一个 ConfigMap:kubectl delete configmap <configmap_name>
    • 删除一个 Secret:kubectl delete secret <secret_name>

  7. StatefulSet(有状态副本集):

    • 创建一个 StatefulSet:kubectl create statefulset <statefulset_name> --image=<image>
    • 获取 StatefulSet 列表:kubectl get statefulsets
    • 查看 StatefulSet 的详细信息:kubectl describe statefulset <statefulset_name>
    • 扩展 StatefulSet 的副本数量:kubectl scale statefulset <statefulset_name> --replicas=<replica_count>
    • 删除一个 StatefulSet:kubectl delete statefulset <statefulset_name>

  8. Job 和 CronJob(作业和定时任务):

    • 创建一个 Job:kubectl create job <job_name> --image=<image>
    • 创建一个 CronJob:kubectl create cronjob <cronjob_name> --image=<image>
    • 获取 Job 列表:kubectl get jobs
    • 获取 CronJob 列表:kubectl get cronjobs
    • 查看 Job 的详细信息:kubectl describe job <job_name>
    • 查看 CronJob 的详细信息:kubectl describe cronjob <cronjob_name>
    • 删除一个 Job:kubectl delete job <job_name>
    • 删除一个 CronJob:kubectl delete cronjob <cronjob_name>

Kubernetes指令运行示例及流程分析


**第一步:**创建 Deployment(部署),该 Deployment 中包含 Pod,Pod 中包含了容器。

ini 复制代码
kubectl create deployment nginx-deployment --image=nginx

**第二步:**为 Deployment 暴露一个服务,允许外部访问。你可以选择不同的 Service 类型,如 ClusterIP、NodePort 或 LoadBalancer。这里我们选择 NodePort 类型。

css 复制代码
kubectl expose deployment nginx-deployment --port=8888 --target-port=80 --type=NodePort

**第三步:**检查服务状态和获取服务详情你可以使用 kubectl get svc 命令来查看服务的状态,并获取服务的 NodePort 端口号。也可以使用 kubectl describe service <service_name> 命令来获取详细的服务信息。再不济用kubectl logs <pod_name>查看Pod的日志。

sql 复制代码
kubectl get svc
kubectl describe service nginx-deployment
kubectl logs <pod_name>

这个映射出来的端口号就是我们所需要的服务,然后 IP:端口号 就可以访问到服务了。运行是运行成功了,但对于刚接触比较陌生。我们现在就刨析一下,以及那些我们必然用到的指令。

流程分析:

我们创建一个Deployment对象,这个对象管理着Pod的副本。这是我们就要查看Deployment和Pod。

kubectl get deployment:查看deployment

vbnet 复制代码
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1/1     1            1           109m
  • NAME : Deployment 的名称,在这个例子中,名称是 nginx-deployment
  • READY : 表示 Deployment 中运行的 Pod 的就绪状态。格式为 <已就绪 Pod 数量>/<总 Pod 数量>。在这个例子中,1/1 表示有 1 个 Pod 已经就绪。
  • UP-TO-DATE: 表示当前 Deployment 中处于最新版本的 Pod 的数量。在这个例子中,值为 1,表示 1 个 Pod 是最新版本。
  • AVAILABLE: 表示在当前 Deployment 的 Pod 集合中处于可用状态的 Pod 的数量。在这个例子中,值为 1,表示 1 个 Pod 是可用的。
  • AGE: Deployment 被创建后经过的时间。在这个例子中,表示 Deployment 已经存在 109 分钟。

kubectl get pod:查看Pod

sql 复制代码
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6d6565499c-mxh9p   1/1     Running   0          114m
  • NAME : Pod 的名称。在这个例子中,Pod 的名称是 nginx-deployment-6d6565499c-mxh9p
  • READY : 表示 Pod 的就绪状态。格式为 <已就绪容器数>/<总容器数>。在这个例子中,1/1 表示 Pod 中的 1 个容器已经就绪。
  • STATUS : 表示 Pod 的状态。在这个例子中,状态为 Running,表示 Pod 正在运行。
  • RESTARTS: 表示 Pod 重启的次数。在这个例子中,值为 0,表示 Pod 没有发生过重启。
  • AGE: Pod 被创建后经过的时间。在这个例子中,表示 Pod 已经存在 114 分钟。

然后我们通过指令暴露了服务,因为采用的是NodePort 类型所以需要查看服务。

kubectl get svc:查看svc,这里svc是简称,全称:service

scss 复制代码
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP          129d
nginx-deployment   NodePort    10.108.90.209   <none>        8888:32596/TCP   90m
  • NAME : 服务的名称。在这个例子中,有两个服务,一个是 kubernetes,另一个是 nginx-deployment
  • TYPE : 服务的类型。在这个例子中,kubernetes 服务的类型是 ClusterIP,而 nginx-deployment 服务的类型是 NodePort
  • CLUSTER-IP : 服务的 Cluster IP 地址。在这个例子中,kubernetes 服务的 Cluster IP 地址是 10.96.0.1,而 nginx-deployment 服务的 Cluster IP 地址是 10.108.90.209
  • EXTERNAL-IP : 服务的外部 IP 地址。在这个例子中,没有外部 IP 地址,所以显示为 <none>
  • PORT(S) : 服务暴露的端口。在这个例子中,kubernetes 服务暴露了 443/TCP 端口,而 nginx-deployment 服务暴露了 8888:32596/TCP 端口。这表示 nginx-deployment 服务监听在 8888 端口,并且将流量转发到 Pod 的 32596 端口。

最后测试结束想删除的把get换成delete,开始你部署的deployment------service。删除就service------deployment

Kubernetes配置文件编写


一,介绍:

Kubernetes 配置文件是用来定义和描述 Kubernetes 资源对象的文本文件,通常以 YAML 格式编写。这些资源对象可以包括 Deployment、Service、Pod、ConfigMap、Secret 等。配置文件通过声明式语法描述了应用程序或服务在 Kubernetes 集群中的部署、配置和管理方式。在配置文件中,可以指定各种属性和规范,例如容器镜像、副本数量、服务端口、环境变量、持久化存储、网络策略等。

二,配置文件和指令有什么不一样。

很鲜明的一点就是一个采用编写YAML进行配置,一种是指令。所以自然而然YAML更适合比较复杂的环境,而指令更适合用于快速建造资源对象,短期这种的。解读性也是YAML更加直观。从持久性出发配置文件可以持久保存在文件系统中,指令更偏向临时操作。

三,再说一下Service的三种类型,免得搞混淆。

  1. ClusterIP

    ClusterIP 是默认的服务类型,这种类型的服务只能在集群内部使用,无法从集群外部直接访问。它会为 Service 分配一个集群内部 IP 地址,并且只能通过该 IP 地址在集群内部访问该服务。意思就是外面访问不到。

  2. NodePort

    NodePort 类型的服务会在每个节点上打开一个端口,将该端口的流量转发到 Service 中指定的 Pod。这种类型的服务允许外部流量通过节点的 IP 地址和指定的端口访问服务。在大多数情况下,你需要通过 NodePort 来访问在集群外部运行的服务。

  3. LoadBalancer

    LoadBalancer 类型的服务通常用于公共云平台,比如 AWS、Azure 或 GCP。在这种类型的服务中,云提供商会在后台创建一个负载均衡器,并分配一个外部 IP 地址。外部用户可以通过该 IP 地址访问服务,负载均衡器会将流量分发到集群中的各个节点上。

文件前缀:

  1. apiVersion:指定 Kubernetes API 版本。
  2. kind:指定 Kubernetes 资源类型,如 Pod、Service、Deployment 等。
  3. metadata:指定资源的元数据,包括名称、命名空间、标签等。
  4. spec:指定资源的规格,如容器配置、端口映射、存储卷等。
  5. status:用于描述资源的当前状态,通常由 Kubernetes 控制器自动填充。
  6. data:用于指定 ConfigMap 或 Secret 中的数据。
  7. selector:用于指定 Service 或者 ReplicationController 选择器。
  8. ports:用于指定 Service 的端口映射。
  9. volumevolumes:用于指定 Pod 中的存储卷。
  10. containercontainers:用于指定 Pod 中容器的配置。
  11. resources:用于指定 Pod 或容器的资源请求和限制。
  12. tolerations:用于指定 Pod 对污点容忍的配置。
  13. affinity:用于指定 Pod 的亲和性和反亲和性规则。
  14. strategy:用于指定 Deployment 或 StatefulSet 的更新策略。
  15. annotations:用于为资源添加注释信息。
  16. labels:用于为资源添加标签信息。
  17. status:用于描述资源的当前状态。

**YAM文件示例:**起什么名字都可以,我这里示例是mysql.yaml

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment  # 设置 Deployment 的名称
spec:
  replicas: 1  # 设置副本数量为 1
  selector:
    matchLabels:
      app: mysql  # 匹配标签为 app=mysql 的 Pod
  template:
    metadata:
      labels:
        app: mysql  # Pod 的标签为 app=mysql
    spec:
      containers:
        - name: mysql  # 容器名称为 mysql
          image: mysql:8.0  # 使用的 MySQL 镜像版本为 8.0
          ports:
            - containerPort: 3306  # 容器监听的端口为 3306
          env:
            - name: MYSQL_ROOT_PASSWORD  # 设置 MySQL root 用户的密码
              value: "123456"  # 密码为 123456
          volumeMounts:
            - name: mysql-data  # 挂载卷的名称
              mountPath: /var/lib/mysql  # 挂载路径
      volumes:
        - name: mysql-data  # 卷的名称
          persistentVolumeClaim:
            claimName: mysql-pvc  # 指定 PersistentVolumeClaim 的名称
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service  # 设置 Service 的名称
spec:
  selector:
    app: mysql  # 匹配标签为 app=mysql 的 Pod
  ports:
    - protocol: TCP
      port: 3306  # Service 监听的端口为 3306
      targetPort: 3306  # 将流量转发到 Pod 的端口为 3306
  type: NodePort  # 设置服务类型为 NodePort
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc  # 设置 PersistentVolumeClaim 的名称
spec:
  accessModes:
    - ReadWriteOnce  # 设置访问模式为读写一次
  resources:
    requests:
      storage: 1Gi  # 请求的存储容量大小,可以根据需要进行调整

运行指令: kubectl apply -f mysql.yaml能看见一下就说明成功了。之后查看各种状态就算是成了。在这里就不演示了。(有需要,评论区留言)

bash 复制代码
kubectl apply -f mysql.yaml
deployment.apps/mysql-deployment created
service/mysql-service created
persistentvolumeclaim/mysql-pvc created

Kubernetes有什么弊端或隐患

  1. 复杂性: Kubernetes 是一个复杂的系统,部署和管理 Kubernetes 集群需要深入的理解和专业知识。配置文件和概念繁多,比较抽象。因此对于初学者来说可能存在一定的学习曲线。
  2. 运维成本: 维护 Kubernetes 集群需要不少资源和时间投入。需要有专门的团队负责管理和维护集群的运行,这增加了运维成本。
  3. 安全风险: 错误的配置和管理可能导致安全漏洞。如果不正确地配置了权限和访问控制,可能会导致敏感数据泄露或系统被攻击。
  4. 资源消耗: Kubernetes 集群本身需要大量的计算和存储资源来运行。此外,部署和维护 Kubernetes 集群可能需要额外的人力和时间成本。
  5. 网络配置复杂: 管理 Kubernetes 集群的网络通常是一个挑战,特别是在跨多个节点和集群的情况下。网络配置可能需要额外的工作和专业知识。
  6. 单点故障: Kubernetes 的某些组件可能存在单点故障的风险,例如控制平面组件的故障可能会导致整个集群的不可用性。
  7. 版本升级问题: Kubernetes 的版本升级可能会面临一些挑战,包括配置兼容性、应用程序稳定性和服务中断等问题。
  8. 依赖云服务商: 对于托管在云平台上的 Kubernetes 集群,存在对云服务商的依赖性。如果云服务商出现故障或服务中断,可能会影响到 Kubernetes 集群的稳定性和可用性。

即使k8s存在问题,但通过合适的规划减少这些风险,并确保 Kubernetes 集群的安全、稳定和高效运行。此外,Kubernetes 还带来了许多功能及优势。


综上所述,我觉得以上内容。能让刚接触K8s的人有一个初步的认知,及小范围的使用。示例部分可能也有所欠缺。但现如今也有针对k8s的一些工具,以后有机会,我也会出相对应的文章。结尾附带一个官网查看

[kubernetes.io/zh-cn/docs/...]:

相关推荐
福大大架构师每日一题2 小时前
22.1 k8s不同role级别的服务发现
容器·kubernetes·服务发现
weixin_453965003 小时前
[单master节点k8s部署]30.ceph分布式存储(一)
分布式·ceph·kubernetes
weixin_453965003 小时前
[单master节点k8s部署]32.ceph分布式存储(三)
分布式·ceph·kubernetes
tangdou3690986553 小时前
1分钟搞懂K8S中的NodeSelector
云原生·容器·kubernetes
later_rql6 小时前
k8s-集群部署1
云原生·容器·kubernetes
weixin_453965008 小时前
[单master节点k8s部署]31.ceph分布式存储(二)
分布式·ceph·kubernetes
大G哥11 小时前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes
妍妍的宝贝11 小时前
k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载
nginx·微服务·kubernetes
福大大架构师每日一题13 小时前
23.1 k8s监控中标签relabel的应用和原理
java·容器·kubernetes
程序那点事儿13 小时前
k8s 之动态创建pv失败(踩坑)
云原生·容器·kubernetes