java docker总结-k8s

时间:2025-08-28 13:18:02来源:互联网

下面小编就为大家分享一篇java docker总结-k8s,具有很好的参考价值,希望对大家有所帮助。

简介

Kubernetes(通常简称为K8s)是一个开源的容器编排和管理平台,使用k8s可以对容器进行自动化部署、资源调度,扩展/缩减实例数量,负载均衡,快速运维等

特点:

1. 容器编排:Kubernetes允许您定义和管理容器化应用程序的部署和运行方式。您可以使用Kubernetes的清晰的声明式语法来描述应用程序的期望状态,然后Kubernetes会自动处理底层的资源调度和管理。

2. 自动化扩展:Kubernetes可以根据应用程序的负载情况自动扩展或缩减容器实例数量。这样可以确保应用程序始终具有足够的资源来满足流量需求,并在负载减少时节省资源。

3. 服务发现和负载均衡:Kubernetes提供了内置的服务发现和负载均衡机制。您可以将应用程序打包为一个服务,并通过服务名称来访问它。Kubernetes会自动分配一个唯一的网络地址给每个服务,并通过负载均衡将流量分发到后端的容器实例。

4. 存储管理:Kubernetes提供了多种存储选项,包括本地存储、网络存储和云存储。您可以根据应用程序的需求选择适合的存储解决方案,并将其挂载到容器中。

5. 自愈能力:Kubernetes具有自愈能力,可以自动检测和恢复容器或节点的故障。如果一个容器或节点发生故障,Kubernetes会自动重新启动容器或迁移工作负载到其他可用节点上。

6. 配置和密钥管理:Kubernetes提供了一种集中管理应用程序配置和密钥的机制。您可以使用ConfigMap来存储配置信息,使用Secret来存储敏感信息,然后在应用程序中引用它们。

7. 扩展性和可插拔性:Kubernetes具有高度可扩展和可插拔的架构。您可以根据需要添加自定义的插件和扩展,以满足特定的需求。

 

容器编排概念

容器编排是指通过使用特定的工具或平台,自动化地管理和协调容器化应用程序的部署、运行和扩展过程。容器编排的目标是简化和优化容器化应用程序的管理,容器编排工具或平台提供了一种声明式的方式来描述应用程序的期望状态,例如定义应用程序的副本数量、资源需求、网络配置等。它们负责将这些声明转化为实际的容器部署和管理操作,包括创建、启动、停止、扩展、监控和自动恢复等。‘

优点:简化容器的管理工作,避免人为错误情况。

常见的容器编排工具包括Kubernetes(K8s)、Docker Swarm、Apache Mesos等。

 

服务发现

服务发现是指在Kubernetes集群中自动发现和管理应用程序的服务实例。在Kubernetes中,服务发现通过使用Service资源来实现。

自动化扩展说明

根据应用程序的负载情况自动扩展或缩减容器实例数量,我们可以设置设置当CPU利用率超过多少时增加副本数量,当CPU利用率低于多少时减少副本数量。

优点:避免资源浪费和不足,自动化比人工更加快捷高效

 

k8s与docker关系

它们在容器化应用程序的生命周期中扮演不同的角色。在实际应用中,通常会将Docker用于构建和打包应用程序的容器镜像,然后使用Kubernetes来管理和运行这些容器镜像。

docker是k8s默认的容器运行时(Container Runtime),Kubernetes通过与Docker API进行交互来管理这些容器,包括创建、启动、停止、调度和监控等操作。

除了Docker,Kubernetes还支持其他容器运行时,如containerd、CRI-O、rkt等。

k8s的使用

按照以下步骤进行设置和操作

1. 安装Kubernetes集群:首先,您需要在您的服务器或云平台上安装和配置Kubernetes集群。这涉及到安装Kubernetes的主节点(Master)和工作节点(Node),并设置它们之间的通信和网络连接。

2. 定义和打包应用程序:将您的应用程序打包为Docker容器。您可以使用Dockerfile来定义容器的构建过程,并使用Docker命令将应用程序构建为容器镜像。

3. 创建Kubernetes对象:使用Kubernetes的API或命令行工具(如kubectl)创建Kubernetes对象来描述您的应用程序。常见的Kubernetes对象包括Deployment、Service、Ingress、ConfigMap等。这些对象定义了应用程序的部署、网络配置、存储需求等。

4. 部署应用程序:使用Kubernetes的API或kubectl命令将您的应用程序部署到Kubernetes集群中。Kubernetes会根据您定义的对象和规则,自动创建和管理应用程序的容器实例,并将流量分发到这些实例。

5. 监控和管理:使用Kubernetes的监控和管理功能来监视和管理您的应用程序。您可以使用Kubernetes的Dashboard或其他监控工具来查看应用程序的状态、日志和指标。您还可以使用kubectl命令来管理应用程序的副本数量、扩展或缩减应用程序的规模等。

6. 扩展和更新:使用Kubernetes的扩展功能来扩展应用程序的规模,以满足不同的负载需求。您可以根据应用程序的负载情况自动或手动调整应用程序的副本数量。同时,您还可以使用Kubernetes的滚动更新功能来无缝地更新应用程序的容器镜像。

7. 故障恢复和自愈:Kubernetes具有自动故障检测和恢复的能力。如果一个容器实例或节点发生故障,Kubernetes会自动重新启动容器或迁移工作负载到其他可用节点上,以确保应用程序的可用性和稳定性。

 

 

集群工作流程

1. 开发人员使用Kubernetes API或命令行工具(如kubectl)定义和创建应用程序的描述对象,例如Deployment、Service等。

2. 控制平面节点接收到应用程序的描述对象,并根据定义的规则和策略来创建和管理相应的资源。

3. 控制平面节点将应用程序的容器实例分配到工作节点上。

4. 工作节点上的kubelet组件负责与控制平面节点通信,并管理节点上的容器。它会根据控制平面节点的指令来创建、启动、停止和删除容器实例。

5. kube-proxy组件负责为Pod(容器组)提供网络代理和负载均衡功能,以实现集群内部和外部的网络通信。

6. 应用程序的容器实例在工作节点上运行,并根据定义的规则和策略进行扩展、缩减或更新。控制平面节点会监控应用程序的状态,并根据需要自动调整容器的数量。

7. 如果一个容器实例或节点发生故障,kubelet会自动重新启动容器或迁移工作负载到其他可用节点上,以确保应用程序的可用性和稳定性。

8. 开发人员可以使用Kubernetes的监控和管理功能来监视应用程序的状态、日志和指标。他们可以使用Kubernetes的API或kubectl命令来管理应用程序的副本数量、扩展或缩减应用程序的规模等。

 

Kubernetes对象的创建

在Kubernetes中,可以通过使用YAML或JSON文件来创建和定义Kubernetes对象。以下是创建Kubernetes对象的一般步骤:

1. 编写配置文件:首先,您需要创建一个YAML或JSON文件,其中包含要创建的Kubernetes对象的配置信息。配置文件中包含了对象的元数据(如名称、标签等)以及对象的规范(如容器镜像、端口等)。

2. 使用kubectl命令:使用kubectl命令行工具来创建Kubernetes对象。运行以下命令来创建对象:

   kubectl apply -f <配置文件>

其中,<配置文件>是您编写的配置文件的路径。

3. 验证对象创建:运行以下命令来验证对象是否成功创建:

   kubectl get <对象类型>

其中,<对象类型>是您创建的对象的类型,如Pod、Deployment、Service等。

如果对象成功创建,您将看到对象的名称、状态和其他相关信息。

需要注意的是,不同的Kubernetes对象有不同的配置选项和属性。

此外,还可以使用Kubernetes的API来动态地创建和管理对象。通过编写应用程序或使用Kubernetes客户端库,您可以以编程方式创建和操作Kubernetes对象。这种方法对于自动化和集成Kubernetes管理非常有用。 

网络插件

查看已部署集群使用的的网络插件

1. 登录到Kubernetes集群的主节点或任意一个工作节点。

2. 运行以下命令来查看正在运行的Pod的网络插件信息:

kubectl get pods -n kube-system

在输出结果中,查找具有名称类似于kube-flannel-ds、calico-node、weave-net、cilium等的Pod。这些Pod通常是负责实现容器网络的插件组件。

如下包含了calico-node相关信息的pod代表使用的Calico插件

k8s管理页面

1. Kubernetes Dashboard:Kubernetes官方提供的Web管理界面,用于可视化管理和监控Kubernetes集群。它提供了对集群资源、Pod、服务、部署等的可视化操作和监控功能。

2. Rancher:Rancher是一个开源的容器管理平台,提供了一个功能强大的Web界面来管理和操作Kubernetes集群。它支持多集群管理、应用部署、监控、日志查看等功能。

3. OpenShift Console:OpenShift是基于Kubernetes的容器平台,它提供了一个Web控制台来管理和操作OpenShift集群。OpenShift Console提供了对应用、构建、部署、监控等的可视化管理功能。

4. Lens:Lens是一个跨平台的Kubernetes管理工具,提供了一个直观的图形界面来管理和监控Kubernetes集群。它支持多集群管理、资源查看、日志查看、终端访问等功能。

5. Octant:Octant是一个开源的Kubernetes管理工具,提供了一个可扩展的Web界面来管理和监控Kubernetes集群。它支持多集群管理、资源查看、日志查看、事件查看等功能。

 

Kubernetes Dashboard是官方提供的Web界面,用于可视化和管理Kubernetes集群

还有许多第三方管理工具可用于管理Kubernetes集群。一些常见的选择包括Rancher、Lens、Octant等。

 

 

helm

没有使用Helm之前,在Kubernetes部署应用,我们要依次部署deployment、service等,步骤比较繁琐。况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂。

helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用的部署和管理。

Helm本质就是让k8s的应用管理(Deployment、Service等)可配置,能动态生成。通过动态生成K8S资源清单文件(deployment.yaml、service.yaml)。然后kubectl自动调用K8S资源部署。

 

Helm有三个重要的概念:chart、release和Repository

  • chart是创建一个应用的信息集合,包括各种Kubernetes对象的配置模板、参数定义、依赖关系、文档说明等。可以将chart想象成apt、yum中的软件安装包。
  • release是chart的运行实例,代表一个正在运行的应用。当chart被安装到Kubernetes集群,就生成一个release。chart能多次安装到同一个集群,每次安装都是一个release【根据chart赋值不同,完全可以部署出多个release出来】。
  • Repository用于发布和存储 Chart 的存储库。

 

Helm具有如下功能:

  • 创建新的chart
  • chart打包成tgz格式(chart是Helm的应用打包格式)
  • 上传chart到chart仓库或从仓库中下载chart
  • 在Kubernetes集群中安装或卸载chart
  • 管理用Helm安装的chart的发布周期

 

Helm 常用命令如下:

  • helm create:在本地创建新的 chart;
  • helm dependency:管理 chart 依赖;
  • helm intall:安装 chart;
  • helm lint:检查 chart 配置是否有误;
  • helm list:列出所有 release;
  • helm package:打包本地 chart;
  • helm repo:列出、增加、更新、删除 chart 仓库;
  • helm rollback:回滚 release 到历史版本;
  • helm pull:拉取远程 chart 到本地;
  • helm search:使用关键词搜索 chart;
  • helm uninstall:卸载 release;
  • helm upgrade:升级 release;

 

chart

Helm采用了Go语言的模板来编写chart。chart是Helm的应用打包格式,是一系列用于描述k8s资源相关文件的集合,由一组文件和目录构成,通常整个chart被打成tar包,而且标注上版本信息,便于Helm部署。

其中最重要的是模板,模板中定义了 Kubernetes 各类资源的配置信息,Helm 在部署时通过 values.yaml 实例化模板。

chart中文件说明:

首先使用 helm create mychart 创建一个名为 mychart 的示例,我们再使用 tree mychart 命令看一下 chart 的目录结构。

mychart

├── Chart.yaml

├── charts # 该目录保存其他依赖的 chart(子 chart)

├── templates # chart 配置模板,用于渲染最终的 Kubernetes YAML 文件

│   ├── NOTES.txt # 用户运行 helm install 时候的提示信息

│   ├── _helpers.tpl # 用于创建模板时的帮助类

│   ├── deployment.yaml # Kubernetes deployment 配置

│   ├── ingress.yaml # Kubernetes ingress 配置

│   ├── service.yaml # Kubernetes service 配置

│   ├── serviceaccount.yaml # Kubernetes serviceaccount 配置

│   └── tests

│       └── test-connection.yaml

└── values.yaml # 定义 chart 模板中的自定义配置的默认值,可以在执行 helm install 或 helm update 的时候覆盖

以上仅为 helm 为我们自动创建的目录结构,我们还可以在 templates 目录加其他 Kubernetes 对象的配置,比如 ConfigMap、DaemonSet 等。

values.yaml (此chart的默认配置值,可以被templates内的yaml文件使用)

chart.yaml (描述 chart 概要信息的YAML 文件,是 chart 所必需的)

templates:chart包内各种资源对象的模板。其中最重要的是“deployment.yaml”和“service.yaml”,分别是部署和服务文件. "helpers.tpl"用来定义变量,"ingress.yaml"是对外接口;各类Kubernetes资源的配置模板都放置在这里。Helm会将values.yaml中的参数值注入到模板中生成标准的YAML配置文件

 

一个 chart 被 Helm 运行后将会生成对应的一个 release;

chart 和 release 的关系可以用代码和进程的关系来类比。chart 是打包了 k8s 资源的集合(比如 deployment、service 等),而 release 则是在 Helm 中运行的集合实体(比如 values )

 

Chart.yaml 结构:

apiVersion: chart API 版本 (必需)
name: chart名称 (必需)
version: 版本(必需)
kubeVersion: 兼容Kubernetes版本的语义化版本(可选)
description: 一句话对这个项目的描述(可选)
type: chart类型 (可选)
keywords:
  - 关于项目的一组关键字(可选)
home: 项目home页面的URL (可选)
sources:
  - 项目源码的URL列表(可选)
dependencies: # chart 必要条件列表 (可选)
  - name: chart名称 (nginx)
    version: chart版本 ("1.2.3")
    repository: 仓库URL ("https://example.com/charts") 或别名 ("@repo-name")
    condition: (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )
    tags: # (可选)
      - 用于一次启用/禁用 一组chart的tag
    enabled: (可选) 决定是否加载chart的布尔值
    import-values: # (可选)
      - ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项
    alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用
maintainers: # (可选)
  - name: 维护者名字 (每个维护者都需要)
    email: 维护者邮箱 (每个维护者可选)
    url: 维护者URL (每个维护者可选)
icon: 用做icon的SVG或PNG图片URL (可选)
appVersion: 包含的应用版本(可选)。不需要是语义化的
deprecated: 不被推荐的chart (可选,布尔值)
annotations:
  example: 按名称输入的批注列表 (可选).

apiVersion:在 Helm3 中,apiVersion=v2;在 Helm3 之前的版本,apiVersion=v1

内置对象

1)values

Values 对象是为 Chart 模板提供值,这个对象的值有4个来源,后面的可以覆盖前面的:

 

chart 包中的 values.yaml 文件

父 chart 包的 values.yaml 文件

通过 helm install 或者 helm upgrade 的 -f 或者 --values 参数传入的自定义的 yaml 文件

通过 --set 参数传入的值

在模板文件中,通过 {{.Values}} 对象来访问设置的值。

 

例如:定义一个 values.yaml

image:
  repository: wangyanglinux/myapp
  tag: 'v1'

在模板文件中就可以通过 {{.Values}} 对象访问到:

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  template:
    spec:
      containers:
        - name: nginx
          image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
          ports:
            - containerPort: 80
              protocol: TCP
  • 其它内置对象

对象.属性

说明

Release.Name 

版本名称(非chart的)

Release.Namespace

发布的chart版本的命名空间

Release.Service

组织版本的服务

Release.IsUpgrade 

如果当前操作是升级或回滚,设置为true

Release.IsInstall

如果当前操作是安装,设置为true

Chart 

Chart.yaml的内容。因此,chart的版本可以从 Chart.Version 获得, 并且维护者在Chart.Maintainers里。

 

 

安装chart命令:

helm install [NAME] [CHART] [flags]

# 安装本地 chart
helm install -f myvalues.yaml myredis ./redis
# 指定变量
helm install --set name=prod myredis ./redis
# 指定变量的值为 string 类型
helm install --set-string long_int=1234567890 myredis ./redis
# 指定引用的文件地址
helm install --set-file my_script=dothings.sh myredis ./redis
# 同时指定多个变量
helm install --set foo=bar --set foo=newbar  myredis ./redis

其中:

myvalues.yaml:自定义变量配置文件;

myredis:release 名称;

./redis:本地的 chart 目录;

Helm chart 安装后会转化成 Kubernetes 中的资源对象,生成一个 chart release,可以使用 helm list 命令查看。

 

升级和回滚 chart:

要想升级 chart 可以修改本地的 chart 配置并执行:

helm upgrade [RELEASE] [CHART] [flags]

 

使用 helm ls 的命令查看当前运行的 chart 的 release 版本,并使用下面的命令回滚到历史版本:

helm rollback <RELEASE> [REVISION] [flags]

 

卸载 chart

要想卸载 chart 可以使用下面的命令。

helm uninstall RELEASE_NAME [...] [flags]

Repoistory

Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。

Release

 使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。可以理解为 Helm 使用 Chart 包部署的一个应用实例。

本站部分内容转载自互联网,如果有网站内容侵犯了您的权益,可直接联系我们删除,感谢支持!