首页 > 其他分享 >Kubernetes

Kubernetes

时间:2024-03-19 17:02:05浏览次数:28  
标签:kubectl Kubernetes 容器 nginx 集群 Pod

Kubernetes

基本介绍

Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。

功能

以下是 Kubernetes 的一些主要功能:

  1. 自动化部署和扩展
    • Kubernetes 允许您定义应用程序的部署规范,包括容器镜像、副本数量和资源限制等。然后,Kubernetes 可以根据定义的规范自动部署和扩展应用程序,以满足应用程序的需求和负载变化。
  2. 服务发现和负载均衡
    • Kubernetes 提供了内置的服务发现机制,允许容器之间通过 DNS 名称进行通信,而无需关心容器的具体 IP 地址。此外,Kubernetes 还支持负载均衡,可以将流量分发到多个副本实例。
  3. 自动容错和自愈
    • Kubernetes 监控集群中的容器和节点,并在容器失败或节点不可用时进行自动恢复。它可以自动替换失败的容器实例,并在节点发生故障时重新调度容器。
  4. 存储编排
    • Kubernetes 提供了存储卷(Volumes)和存储卷声明(PersistentVolumeClaims)的概念,允许容器挂载持久化存储,并通过存储类(StorageClass)动态地管理存储资源。
  5. 自动伸缩
    • Kubernetes 支持水平自动伸缩,可以根据应用程序的负载自动增加或减少副本数量。您可以定义自动伸缩的规则和阈值,以满足应用程序的性能和可用性要求。
  6. 密钥和配置管理
    • Kubernetes 提供了 Secrets 和 ConfigMaps 等机制,用于安全地存储和管理敏感信息和配置数据,并将它们注入到容器中。
  7. 批处理和定时任务
    • Kubernetes 支持批处理作业(Jobs)和定时任务(CronJobs),允许您在集群中运行周期性任务或一次性任务。
  8. 多环境支持
    • Kubernetes 允许您在多个环境(如开发、测试和生产)中轻松部署和管理应用程序,通过使用命名空间和环境变量等功能来隔离不同环境的资源。

这些是 Kubernetes 的一些主要功能,它们使得在容器化环境中部署、运行和管理应用程序变得更加简单、高效和可靠。

组件介绍

下图为k8s架构图

以下是 Kubernetes 的主要组件及其功能介绍:

  1. kube-apiserver
    • Kubernetes API 的前端服务,负责提供集群管理的 REST API。
    • 处理对 API 对象的创建、修改、删除等操作。
  2. kube-controller-manager
    • 包含多个控制器,用于监控集群状态并进行自动化操作。
    • 例如 Node 控制器、Replication 控制器、Endpoint 控制器等。
    • 监控集群状态的变化,并根据预定义的期望状态进行调整和修复。
  3. kube-scheduler
    • 负责将 Pod 调度到集群中的节点上。
    • 根据 Pod 的资源需求、亲和性和防亲和性等策略选择合适的节点进行调度。
  4. kubelet
    • 运行在每个节点上的代理,负责管理本地节点上的容器。
    • 接收来自 kube-apiserver 的 Pod 规范,并确保节点上的容器按照规范运行。
  5. kube-proxy
    • 在每个节点上运行的网络代理,负责管理集群中的网络流量。
    • 提供服务发现和负载均衡功能,实现服务间的通信和网络访问。
  6. etcd
    • 分布式键值存储系统,用于存储 Kubernetes 集群的所有配置信息和状态数据。
    • 作为 Kubernetes 的数据存储后端,提供高可用性和一致性的数据存储服务。
  7. Container Runtime
    • 负责运行容器的软件组件,常用的容器运行时包括 Docker、containerd、CRI-O 等。
    • Kubernetes 通过 CRI(Container Runtime Interface)与容器运行时进行交互。

除了上述核心组件之外,Kubernetes 还包括一些附加的组件,如:

  • DNS 服务:用于为集群中的服务提供域名解析。
  • Dashboard:提供图形化界面,用于监控和管理 Kubernetes 集群。
  • Ingress Controller:提供 HTTP 和 HTTPS 路由功能,用于将外部流量路由到集群内部的服务。
  • 日志和监控工具:如 Prometheus、Grafana 等,用于收集、存储和可视化集群的日志和监控数据。

这些组件共同协作,构成了 Kubernetes 的完整生态系统,为用户提供了高效、弹性和可扩展的容器化平台。

主要对象

在 Kubernetes 中,主要的对象包括:

  1. Pod(容器组):Pod 是 Kubernetes 中最小的调度单位,它可以包含一个或多个紧密关联的容器,并共享相同的网络命名空间、存储卷等资源。Pod 被用来运行应用程序的实例。Pod是k8s中最小的单元。它由一组、一个或者多个容器组成,每个Pod中包含一个Pause容器,
    Pause容器是Pod的父容器,主要负责僵尸进程的回收管理,通过Pause容器可以使同一个Pod里面的多个容器共享存储、网络、PID、IPC等。
  2. Service(服务):Service 定义了一组相同功能的 Pod 的访问方式,提供了一个稳定的网络端点,用于与应用程序交互。Service 可以通过标签选择器来选择要路由的 Pod,并提供负载均衡功能。
  3. Endpoints (端点集合):对象包含了一个或多个地址(IP 地址)和端口的列表,这些地址和端口是 Service 要代理的后端 Pod 的信息。当 Service 接收到请求时,它会根据 Endpoints 中的地址和端口信息将请求转发给相应的后端 Pod。
  4. Namespace(命名空间):Namespace 是 Kubernetes 中用来划分资源的一种方式,它提供了一种逻辑上的隔离机制,可以将集群中的资源划分为多个逻辑单元,不同的命名空间之间相互隔离。
  5. Deployment(部署):Deployment 定义了应用程序的部署策略,包括副本数量、更新策略等,并负责创建和管理 Pod 的副本集,以确保应用程序的稳定运行。
  6. ReplicaSet(副本集):ReplicaSet 是 Deployment 的一部分,用于创建和管理一组相同的 Pod 的副本,并确保它们的数量与期望的副本数量保持一致。
  7. StatefulSet(有状态服务集):StatefulSet 类似于 ReplicaSet,但用于部署有状态的应用程序,它可以确保每个 Pod 的标识符和网络标识符在重启和迁移时保持不变。
  8. ConfigMap(配置映射):ConfigMap 用于存储应用程序的配置信息,如环境变量、配置文件等,可以通过卷挂载或环境变量的方式注入到 Pod 中。
  9. Secret(密钥):Secret 用于存储敏感信息,如密码、证书等,可以安全地存储和管理这些信息,并将其注入到 Pod 中。
  10. PersistentVolume(持久化卷):PersistentVolume 是 Kubernetes 中用于存储数据的抽象层,它可以独立于 Pod 存在,并提供持久化的存储功能,以保证数据的持久性和可靠性。
  11. PersistentVolumeClaim(持久化卷声明):PersistentVolumeClaim 用于声明对持久化卷的需求,定义了 Pod 对存储资源的需求和要求,并负责与 PersistentVolume 进行动态绑定。

这些对象构成了 Kubernetes 中的核心组件,通过它们可以管理和运行容器化应用程序,并提供强大的资源管理和调度功能。

常用kubectl命令

kubectl 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互和管理。通过 kubectl 可以执行各种操作,包括创建、删除、管理 Kubernetes 资源对象,以及查看集群状态、调试应用程序等。以下是一些常用的 kubectl 命令:

  1. kubectl create:创建资源对象,如 Pod、Service、Deployment 等。
    • 示例:kubectl create deployment my-deployment --image=my-image –-replicas=1
  2. kubectl apply:根据配置文件创建或更新资源对象。
    • 示例:kubectl apply -f my-manifest.yaml
  3. kubectl get:获取资源对象的信息。
    • 示例:kubectl get pods
  4. kubectl describe:获取资源对象的详细信息。
    • 示例:kubectl describe pod my-pod
  5. kubectl logs:获取容器的日志信息。
    • 示例:kubectl logs my-pod
  6. kubectl exec:在容器内执行命令。
    • 示例:kubectl exec -it my-pod -- /bin/bash
  7. kubectl delete:删除资源对象。
    • 示例:kubectl delete pod my-pod
  8. kubectl scale:调整 Deployment、ReplicaSet 等控制器的副本数量。
    • 示例:kubectl scale deployment my-deployment --replicas=3
  9. kubectl rollout:管理 Deployment 的滚动更新。
    • 示例:kubectl rollout status deployment/my-deployment
  10. kubectl port-forward:将本地端口与 Pod 的端口进行转发。
    • 示例:kubectl port-forward my-pod 8080:80
  11. kubectl create secret:创建密钥、密码等敏感信息的 Secret 对象。
    • 示例:kubectl create secret generic my-secret --from-literal=username=myuser --from-literal=password=mypass
  12. kubectl expose:创建一个名称为nginx-deployment的service端口是8888代理容器端口80,并实现了负载均衡。
    • 示例:**kubectl expose deployment nginx-deployment –port=8888 –target-port=80**

安装部署

Kubernetes 可以使用两种主要的部署方式:单节点集群和多节点集群。

  1. 单节点集群部署
    单节点集群是在单个计算机上模拟一个完整的 Kubernetes 集群。这种部署方式通常用于开发和测试目的,或者在资源有限的环境中进行本地开发和调试。常见的单节点集群工具包括:
    • Minikube:Minikube 是一个用于在本地机器上快速部署 Kubernetes 的工具,它会在虚拟机中启动一个单节点 Kubernetes 集群。
    • Docker Desktop:Docker Desktop for Mac 和 Docker Desktop for Windows 提供了一个内置的 Kubernetes 集成,可以方便地在本地机器上启动一个单节点 Kubernetes 集群。
  2. 多节点集群部署
    多节点集群是在多台计算机上部署一个真实的 Kubernetes 集群,每个节点都运行一个 Kubernetes 组件。这种部署方式通常用于生产环境和大规模的应用部署。常见的多节点集群部署
    • kubeadm:kubeadm 是一个用于在现有的 Linux 发行版上部署 Kubernetes 集群的命令行工具。它可以方便地在多个节点上快速部署一个简单的 Kubernetes 集群。
    • 二进制部署:二进制部署是一种手动方式,在每个节点上手动下载、配置和安装 Kubernetes 组件的二进制文件,并手动配置和启动 Kubernetes 集群的各个组件。二进制部署提供了更多的灵活性和可定制性,用户可以根据特定的需求对 Kubernetes 架构和组件进行更细粒度的调整和配置。

本次学习和演示用,我们用 Docker Desktop for Windows 集成 ****Kubernetes,安装如下图所示:

部署

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

该命令是从Github上拉取recommended.yaml文件并运行。

验证

查看pod的状态为running说明dashboard部署成功

kubectl get svc,pods  -n kubernetes-dashboard

查看代理是否正确安装部署

kubectl cluster-info

启用代理

kubectl proxy

输入上述命令后,光标一直在闪,命令行中无法继续输入其他命令。此时千万不要关闭命令窗口!一定要保持命令窗口不动,并打开浏览器。输入URL

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

需要获取token。

Token获取

新建dashboard-adminuser.yaml配置文件

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: dashboard-admin
  namespace: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kubernetes-dashboard  

应用dashboard-adminuser.yaml

kubectl create -f dashboard-adminuser.yaml

获取token,在登录使用。

kubectl create token dashboard-admin --namespace kubernetes-dashboard

k8s界面如下所示:

服务构建示例

参考k8s官方文档:https://kubernetes.io/zh-cn/docs/tasks/run-application/run-stateless-application-deployment/

deployment.yaml 内容

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # 告知 Deployment 运行 2 个与该模板匹配的 Pod
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

创建 deployment

kubectl apply -f https://k8s.io/examples/application/deployment.yaml

kubectl 扩缩容命令

kubectl scale -n default deployment nginx-deployment --replicas=5

dashboad 页面展示

Service创建

Service 是由 kube-proxy 组件,加上 iptables 来共同实现的。Service 用于在 Kubernetes 集群内部暴露应用程序,使得应用程序能够被其他组件或者其他应用程序访问。

创建Service的方法有两种:

1.通过kubectl expose创建

kubectl expose deployment nginx-deployment --port=88 --type=NodePort --target-port=80 --name=nginx-service

2.通过yaml文件创建

创建一个名为nginx-service的服务,将在端口80接收请求并将链接路由到具有标签选择器是app=nginx的pod的9376端口上。使用kubectl create来创建serivice

 apiVersion: v1
  kind: Service
  metadata:
    name: nginx-service
    namespace: default
  spec:
    type: ClusterIP
    selector:
      app: nginx
    ports:
    - name: http
      # 自己想暴露出的端口
      port: 30001
      # 对应容器暴露的端口
      targetPort: 80

kubectl get svc 查看service 信息

nginx-service   NodePort    10.100.84.239   <none>        88:30498/TCP   139m

dashboad显示如下

Ingress创建

Ingress 用于在 Kubernetes 集群外部暴露应用程序,使得应用程序可以通过外部网络访问。

kubectl create -f ingress.yml

配置文件内容如下

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  rules:
  - host: nginx.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80

kubectl get ing 命令查看Ingress运行情况

nginx-ingress   <none>   nginx.example.com             80      64s

CI/CD

jenkins从代码到镜像,k8s从镜像到服务,CI(持续集成)和CD(持续交付/持续部署)。

通过使用 Jenkins 和 Kubernetes 来构建一个端到端的 CI/CD 流水线,将代码从版本控制系统(如 Git)中构建成 Docker 镜像,然后部署到 Kubernetes 集群中。

Helm

Helm 是 Kubernetes 的一个包管理工具,用于定义、安装和管理 Kubernetes 应用程序的配置。

1.Helm的三个基本概念

Chart:Helm应用(package),包括该应用的所有Kubernetes manifest模版,类似于YUM RPM或Apt dpkg文件

Repository:Helm package存储仓库

Release:chart的部署实例,每个chart可以部署一个或多个release

2.Helm工作原理

Helm把Kubernetes资源(比如deployments、services或 ingress等) 打包到一个chart中,而chart被保存到chart仓库。通过chart仓库可用来存储和分享chart。Helm使发布可配置,支持发布应用配置的版本管理,简化了Kubernetes部署应用的版本控制、打包、发布、删除、更新等操作。

Helm包括两个部分,helm客户端和tiller服务端。

3.helm客户端

helm客户端是一个命令行工具,负责管理charts、reprepository和release。它通过gPRC API(使用kubectl port-forward将tiller的端口映射到本地,然后再通过映射后的端口跟tiller通信)向tiller发送请求,并由tiller来管理对应的Kubernetes资源。

4.tiller服务端

tiller接收来自helm客户端的请求,并把相关资源的操作发送到Kubernetes,负责管理(安装、查询、升级或删除等)和跟踪Kubernetes资源。为了方便管理,tiller把release的相关信息保存在kubernetes的ConfigMap中。tiller对外暴露gRPC API,供helm客户端调用。

Rancher

Rancher 是一个开源的容器管理平台,用于简化 Kubernetes 和其他容器编排引擎的操作。方便管理多个K8s集群。

下载运行rancher/rancher:stable镜像

 docker run -d --restart=unless-stopped --privileged --name rancher -p 80:80 -p 443:443 rancher/rancher:stable

浏览器打开localhost

执行命令获取密码, grep命令在 Windows PowerShell 中不可用。Select-String这个命令在 Unix 或 Linux 系统上是有效的。

docker logs container-id 2>&1 | grep "Bootstrap Password:"
docker logs container-id 2>&1 | Select-String "Bootstrap Password:"

输入初始密码后,初次登录需要修改密码

标签:kubectl,Kubernetes,容器,nginx,集群,Pod
From: https://www.cnblogs.com/caohuajin/p/18083380

相关文章

  • 今天去面试,面试官问我什么是容器编排工具?Kubernetes
    今天去面试,面试官问我什么是容器编排工具?KubernetesKubernetes(简称k8s)是一个开源的容器编排平台,用于自动化应用程序部署、扩展和管理。它提供了一种高效的方式来管理容器化应用程序,使得开发人员和运维人员可以更好地协同工作。本文将介绍Kubernetes的集群架构和组件,并通过......
  • K8s(Kubernetes)-Tips
    K8S中文官网https://www.kubernetes.org.cn/Kubernetes集群组件结构一个kubernetes集群主要是由控制节点(master)、**工作节点(node)**构成,每个节点上都会安装不同的组件。master:集群的控制平面,负责集群的决策(管理)ApiServer:资源操作的唯一入口,接收用户输......
  • Hero Talk|无缝扩展:Kubernetes 上的 Amazon Aurora 分片和流量管理
    亚马逊云科技DataHero潘娟正在打开开源之门。作为“2020中国开源先锋人物”以及“2021OSCAR尖峰开源人物”奖项获得者,她致力于赋能数据领域的开发者,助力他们把握先机。在亚马逊云科技re:Invent2023大会上,潘娟就Kubernetes上的 Amazon Aurora 分片和流量管理发表了精......
  • Kubernetes 新手实战指南 - 多节点集群部署
    简介Kubernetes是一个用于管理容器化应用程序的开源平台。它提供了一种声明式的方式来部署、管理和扩展应用程序,同时确保高可用性和可扩展性。在本文中,我们将逐步指导您设置一个Kubernetes多节点集群,即使您是Kubernetes的新手。先决条件至少三台具有root权限的Li......
  • kubernetes的kubectl命令介绍
    前言:kubectl是Kubernetes命令行工具,用于与Kubernetes集群进行交互。它允许用户执行各种操作,包括管理容器、部署应用程序、查看集群状态等。kubectl是操作k8s集群的命令行工具,安装在k8s的master节点,kubectl在$HOME/.kube目录中查找一个名为config的文件,你可以通过设置Kube......
  • kubernetes中的内存表示单位Mi和M的区别
    官网解释:Meaningofmemory,Mi表示(1Mi=1024x1024),M表示(1M=1000x1000)(其它单位类推,如Ki/KGi/G)创建两个pod,一个申请1Mi,另一个申请1MTRANSLATEwithxEnglishArabicHebrewPolishBulgarianHindiPortugueseCatalanHmongDawRomanianChines......
  • 通过 Metrics Server 查看 Kubernetes 资源指标
    1.简介MetricsServer是一个用于Kubernetes集群的监控工具,它用于收集、存储和提供关于集群中各种资源的度量数据。MetricsServer是Kubernetes中一个核心的指标收集器,可以提供关于CPU和内存使用情况、节点资源利用率以及其他重要指标的信息。它主要用于水平自动扩展(Horiz......
  • 掌握 Kubernetes 故障排除技巧:kubectl命令的基本指南
    Kubernetes彻底改变了容器编排,简化了应用程序的管理和扩展。然而,与任何复杂系统一样,Kubernetes集群也会遇到问题,需要及时解决才能保持最佳性能和可靠性。在本文中,我们将深入探讨必要的kubectl命令,这些命令是诊断和排除Kubernetes集群问题不可或缺的工具。无论您是新手还是经......
  • 初识kubernetes
    目录kubernetes简要概述1、kubernetes功能简介服务发现和负载均衡存储编排自动部署和回滚自动完成装箱计算自我修复2、Kubernetes架构及组件kube-apiserveretcdkube-schedulerkube-controller-managercloud-controller-managerNode组件:节点组件在每个节点上......
  • 数据库不应放在容器中?- B站Kubernetes有状态服务实践(Elasticsearch/Clickhouse)
    本期作者前言云原生时代下,Kubernetes已成为容器技术的事实标准, 使得基础设施领域应用下自动化运维管理与编排成为可能。对于无状态服务而言, 业界早已落地数套成熟且较完美的解决方案。可对于有状态的服务, 方案的复杂度就以几何倍数增长, 例如分布式应用多个实例间的依......