文章目录
K8S简介
Kubernetes(通常简称为K8s,因为其中间有8个字母)是一个开源的容器编排平台,用于自动化部署、扩展和操作应用程序容器。
它最初由Google开发,现在由Cloud Native ComputingFoundation(CNCF)维护和支持。Kubernetes提供了一个高度可扩展的平台,用于管理容器化应用程序和服务,使开发者能够更高效地管理应用程序的生命周期。
Kubernetes是设计用来管理容器化应用程序的。容器化允许开发者将应用程序及其所有依赖项打包到一个标准化单元中,这在不同环境中具有一致性和可移植性。
主要概念
Pod: 是Kubernetes的最小部署单元,可以包含一个或多个紧密关联的容器。Pod共享网络和存储资源,通常用于运行一组共享上下文的应用程序。
Deployment: 用于声明式地管理Pod的创建、更新和删除。Deployment可以确保应用程序始终运行在所需状态,并支持滚动更新和回滚操作。
Service: 定义了一组Pod的访问方式和策略,通过标签选择器将请求路由到正确的Pod。Service可以实现负载均衡、服务发现和跨服务通信。
Namespace: 用于在Kubernetes集群中划分资源的虚拟化单元。它可以帮助组织和管理集群中的资源,提供了一种多租户的机制。
Node: 是Kubernetes集群中的一个工作节点,负责运行Pod和容器。每个Node都具有Kubernetes代理(kubelet)和容器运行时(如Docker或containerd)。
Cluster: 是由多个工作节点组成的Kubernetes环境,用于托管和管理容器化应用程序。
架构
Kubernetes的架构通常包括以下核心组件:
Master节点:
- kube-apiserver: 提供Kubernetes API服务,用于管理集群状态和配置。
- etcd:分布式键值存储,用于持久化保存集群状态和配置。
- kube-scheduler: 负责Pod的调度,将Pod分配到合适的工作节点上。
- kube-controller-manager: 管理控制器,监控集群中各种资源的状态,并确保所需状态。
工作(worker)节点:
- kubelet: 在每个节点上运行,负责与Master节点通信,管理Pod的生命周期。
- kube-proxy:负责为Service实现网络代理和负载均衡功能。
- 容器运行时(如Docker或containerd): 负责运行Pod中的容器。
关键功能和优势
1. 自动化部署和扩展:
Kubernetes允许定义应用程序的期望状态,并自动管理其部署和扩展。通过Deployment、ReplicaSet等控制器,可以实现自动水平扩展和负载均衡。
2. 服务发现和负载均衡:
使用Service抽象,可以轻松实现服务发现和对后端Pod的负载均衡,无需手动配置网络路由。
3. 自我修复:
Kubernetes可以自动替换失败的容器或节点,并确保应用程序的高可用性。
4. 存储编排:
支持多种存储解决方案,并通过PersistentVolume和PersistentVolumeClaim提供动态存储分配和管理。
5. 密钥和配置管理:
支持将敏感信息和配置数据以Secret和ConfigMap的形式存储,并安全地注入到Pod中。
使用场景
Kubernetes适用于各种场景,特别是复杂的分布式应用和微服务架构,可以显著简化部署、管理和扩展。它也是云原生应用开发和部署的理想选择,支持跨云和混合云环境的工作负载管理。Kubernetes作为一个强大的容器编排平台,通过其丰富的功能和灵活的架构,帮助用户有效地管理和操作容器化应用程序,提升了应用程序的可靠性、可伸缩性和效率。
k8s快速入门之命令行
1. k8s集群搭建
参考地址:文章写的非常好,一次搭建成功!
https://blog.csdn.net/weixin_52799373/article/details/140430146?spm=1001.2014.3001.5502
2. NameSpace命名空间
NameSpace介绍 中文名称:命名空间。 你可以认为namespaces是你kubernetes集群中的虚拟化集群。在一个
Kubernetes集群中可以拥有多个命名空间,它们在逻辑上彼此隔离。 可以为你提供组织,安全甚至性 能方面的帮助!
Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或 用户组。常见的pods,
services, replication controllers和deployments等都是属于某一个namespace
的(默认是default),而node, persistentVolumes等则不属于任何namespace。
大多数的Kubernetes中的集群默认会有一个叫default的namespace。实际上,应该是4个:
- default:你的资源默认被创建于default命名空间。
- kube-system:kubernetes系统组件使用。
- kube-node-lease: kubernetes集群节点租约状态
- kube-public:公共资源使用。但实际上现在并不常用。
这个默认(default)的namespace并没什么特别,但你不能删除它。这很适合刚刚开始使用
kubernetes和一些小的产品系统。但不建议应用于大型生产系统。因为,这种复杂系统中,团队会非常
容易意外地或者无意识地重写或者中断其他服务service。相反,请创建多个命名空间来把你的
service(服务)分割成更容易管理的块。
作用:实现资源隔离 属于逻辑隔离 属于管理边界 不属于网络边界,可以针对每个namespace做资源配额
2.1 namespace常见语法
查看命名空间
kubectl get namespace
查看所有命名空间的pod资源
kubectl get pod --all-namespaces kubectl get pod -A
简写命令
kubectl get ns
创建NameSpace
kubectl create namespace xxx
简写命令
kubectl create ns xxx
删除NameSpace
kubectl delete namespace xxx
简写命令
kubectl delete ns xxx
3. Pod: 调度的最小单元
Pod是kubernetes集群能够调度的最小单元。Pod是容器的封装 。
在Kubernetes集群中,Pod是所有业务类型的基础,也是K8S管理的最小单位级,它是一个或多个
容器的组合。这些容器共享存储、网络和命名空间,以及如何运行的规范。在Pod中,所有容器都被同
一安排和调度,并运行在共享的上下文中。对于具体应用而言,Pod是它们的逻辑主机,Pod包含业务 相关的多个应用容器。
Pod有两个必须知道的特点。
网络:每一个Pod都会被指派一个唯一的Ip地址,在Pod中的每一个容器共享网络命名空间,包括Ip地址
和网络端口。在同一个Pod中的容器可以和localhost进行互相通信。当Pod中的容器需要与Pod外的实
体进行通信时,则需要通过端口等共享的网络资源。
存储:Pod能够被指定共享存储卷的集合,在Pod中所有的容器能够访问共享存储卷,允许这些容器共享
数据。存储卷也允许在一个Pod持久化数据,以防止其中的容器需要被重启。
Pod的工作方式
K8s一般不直接创建Pod。 而是通过控制器和模版配置来管理和调度 Pod模版
3.1 Pod常用命令
Pod重启 在Pod中的容器可能会由于异常等原因导致其终止退出,Kubernetes提供了重启策略以重启容器。重启
策略对同一个Pod的所有容器起作用,容器的重启由Node上的kubelet执行。 Pod支持三种重启策略
在配置文件中通过restartPolicy 字段设置重启策略:
- Always:只要退出就会重启。
- OnFailure:只有在失败退出(exit code不等于0)时,才会重启。
- Never:只要退出,就不再重启
3.2查看Pod
查看default命名空间下的
pods kubectl get pods
查看kube-system命名空间下的pods
kubectl get pods -n kube-system
查看所有命名空间下的pods
kubectl get pod --all-namespaces
kubectl get pod -A
3.3创建Pod
下载镜像
K8S集群的每一个节点都需要下载镜像:选择不同的基础镜像,下载镜像的大小也不同。
docker pull tomcat:9.0.20-jre8-alpine108MB
docker pull tomcat:9.0.37-jdk8-openjdk-slim 305MB
docker pull tomcat:9.0.37-jdk8531MB
docker save -o tomcat9.tar tomcat:9.0.20-jre8-alpine docker load -i tomcat9.tar
同学们可以自行下载后进行备份。
3.4 运行pod
在default命名空间中创建一个pod副本的deployment
kubectl run tomcat9-test --image=tomcat:9.0.20-jre8-alpine --port=8080
kubectl get pod
kubectl get pod -o wide
使用pod的IP访问容器
crul ***:8080
3.5Pod扩容
将副本扩容至3个
kubectl scale --replicas=3 deployment/tomcat9-test
kubectl get deployment
kubectl get deployment -o wide
使用deployment的IP访问pod
4. kubectl
kubectl 是 Kubernetes 集群的命令行工具。 Kubernetes 是一个用于容器编排和管理的开源平台,而 kubectl
则是与 Kubernetes 集群进行交互的主要方式。 通过 kubectl
,用户可以执行各种操作,部署和管理应用:创建、删除、更新部署(Deployment)、服务(Service)等资源对象。
- 可以使用 kubectl create deployment 命令创建一个新的部署。
- 查看集群状态和资源信息:获取节点(Node)、Pod、副本集(ReplicaSet)等的详细信息。通过 kubectl get pods 查看当前运行的 Pod 列表。
- 执行故障排查和调试:查看日志、描述资源对象的详细状态等。像 kubectl logs 可以获取指定 Pod 的日志。
- 扩展和缩放资源:增加或减少副本数量,以适应应用的负载变化。
4.1 kubectl常用命令
kubectl [command] [TYPE] [NAME] [flags]
command:指定要对一个或多个资源执行的操作,例如 create、get、describe、delete。
TYPE:指定资源类型。资源类型不区分大小写,可以指定单数、复数或缩写形式。
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1
NAME:指定资源的名称。名称区分大小写。
如果省略名称,则显示所有资源的详细信息
kubectl get pods
在对多个资源执行操作时,您可以按类型和名称指定每个资源,或指定一个或多个文件:
要按类型和名称指定资源: 要对所有类型相同的资源进行分组,请执行以下操作:
TYPE1 name1 name2 name<#>。
例子:
kubectl get pod example-pod1 example-pod2
分别指定多个资源类型:
TYPE1/name1 TYPE1/name2
TYPE2/name3 TYPE<#>/name<#>。
例子:
kubectl get pod/example-pod1 replicationcontroller/example-rc1
用一个或多个文件指定资源: -f file1 -f file2 -f file<#>
使用 YAML而不是JSON因为YAML更容易使用,特别是用于配置文件时。
例子:
kubectl get pod -f ./pod.yaml
flags : 指定可选的参数。例如,可以使用 -s 或 -server 参数指定 Kubernetes API 服务器的地址
和端口。
get命令
4.2kubectl get命令
kubectl get - 列出一个或多个资源
# 查看集群状态信息
kubectl cluster-info
# 查看集群状态
kubectl get cs
# 查看集群节点信息
kubectl get nodes
# 查看集群命名空间
kubectl get ns
# 查看指定命名空间的服务
kubectl get svc -n kube-system
# 以纯文本输出格式列出所有 pod。
kubectl get pods
# 以纯文本输出格式列出所有 pod,并包含附加信息(如节点名)。
kubectl get pods -o wide
# 以纯文本输出格式列出具有指定名称的副本控制器。提示:您可以使用别名 'rc' 缩短和替换 replicationcontroller' 资源类型。
kubectl get replicationcontroller <rc-name>
# 以纯文本输出格式列出所有副本控制器和服务。
kubectl get rc,services
# 以纯文本输出格式列出所有守护程序集,包括未初始化的守护程序集。
kubectl get ds --include-uninitialized
# 列出在节点 server01 上运行的所有 pod
kubectl get pods --field-selector=spec.nodeName=server01
4.3 describe命令
kubectl describe - 显示一个或多个资源的详细状态,默认情况下包括未初始化的资源。
# 显示名称为 <node-name> 的节点的详细信息。
kubectl describe nodes <node-name>
# 显示名为 <pod-name> 的 pod 的详细信息。
ubectl describe pods/<pod-name>
# 显示由名为 <rc-name> 的副本控制器管理的所有 pod 的详细信息。 # 记住:副本控制器创建的任何 pod 都以复制控制器的名称为前缀。
kubectl describe pods <rc-name>
# 描述所有的 pod,不包括未初始化的 pod
kubectl describe pods --include-uninitialized=false
4.4 delete命令
kubectl delete` - 从文件、stdin 或指定标签选择器、名称、资源选择器或资源中删除资源。
# 使用 pod.yaml 文件中指定的类型和名称删除 pod。
kubectl delete -f pod.yaml
# 删除标签名= <label-name> 的所有 pod 和服务。
kubectl delete pods,services -l name=<label-name>
# 删除所有具有标签名称= <label-name> 的 pod 和服务,包括未初始化的那些。
kubectl delete pods,services -l name=<label-name> --include-uninitialized
# 删除所有 pod,包括未初始化的 pod。
kubectl delete pods --all
4.5进入容器命令
kubectl exec - 对 pod 中的容器执行命令。与docker的exec命令非常类似
# 从 pod <pod-name> 中获取运行 'date' 的输出。默认情况下,输出来自第一个容器。
kubectl exec <pod-name> date
# 运行输出 'date' 获取在容器的 <container-name> 中 pod <pod-name> 的输出。
kubectl exec <pod-name> -c <container-name> date
# 获取一个交互 TTY 并运行 /bin/bash <pod-name >。默认情况下,输出来自第一个容器。
kubectl exec -ti <pod-name> /bin/bash
4.6logs命令
kubectl logs - 打印 Pod 中容器的日志。
# 从 pod 返回日志快照。
kubectl logs <pod-name>
# 从 pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令。
kubectl logs -f <pod-name>
4.7 其他命令
将pod信息格式化输出到一个yaml文件
kubectl get pod web-pod-13je7 -o yaml
强制删除一个
pod --force --grace-period=0
缩写汇总