k8s 是 container orchestration system

容器编排系统

Pod

Pod是k8s中创建和管理的最小可部署单元

可以视为一组或者多个容器,共享存储和网络资源,就像它们在同一台机器上一样,同时保持一定程度的隔离 Pod 在 Kubernetes 中被视为一个复制单元;如果需要扩大工作负载,您将增加运行的 Pod 数量Pasted%20image%2020240308093454

Nodes

节点

应用程序在容器内,容器在pod内,pod在节点上运行
节点可以是虚拟机或者物理机
如果应用程序在放置在 Pod 中的容器中运行,则节点包含运行 Pod 所需的所有服务

Cluster

集群是一组节点

Control Plane

Pasted%20image%2020240308093930

组件通信

Pasted%20image%2020240308123439

The Lay of the Land

命名空间Namespaces

命名空间用于隔离单个集群中的资源组,资源在命名空间内必须唯一命名,但相同的资源名称可以在不同的命名空间中使用

副本集ReplicaSet

Kubernetes 中的 ReplicaSet 维护一组副本 pod,并且可以保证 x 个相同 pod 的可用性

部署Deployments

部署用于定义所需的状态。一旦定义了所需状态,部署控制器(控制器进程之一)就会将实际状态更改为所需状态。部署为 Pod 和副本集提供声明性更新。换句话说

有状态集StatefulSets

between stateful and stateless apps

有状态应用程序存储和记录用户数据,允许它们返回到特定状态。例如,假设您有一个使用电子邮件应用程序的开放会话并阅读了 3 封电子邮件,但您的会话被中断。在这种情况下,您可以重新加载此应用程序,并且状态将被保存,确保这 3 封电子邮件仍然被阅读。然而,无状态应用程序不知道任何先前的用户交互,因为它不存储用户会话数据。例如,考虑使用搜索引擎提出问题。如果该会话被中断,您可以通过搜索问题重新开始该过程,而不依赖于任何先前的会话数据

对于这些无状态应用程序(搜索引擎示例),部署可用于定义和管理 Pod 副本。由于应用程序的无状态性质,可以使用随机 Pod 名称创建副本,并且在删除时可以随机删除 Pod

Statefulsets 使有状态应用程序能够在 Kubernetes 上运行,但与部署中的 Pod 不同,它们不能以任何顺序创建,并且将具有唯一的 ID(这是持久性的,这意味着如果 Pod 发生故障,它将被恢复并保留此 ID) )与每个 Pod 关联。换句话说,这些 Pod 是根据相同规格创建的,但不可互换。 StatefulSets 将有一个可以读取/写入数据库的 pod(因为如果其他 pod 可以的话,将会出现绝对的大屠杀和各种数据不一致),称为 master pod。其他 Pod(称为从属 Pod)只能读取并拥有自己的存储复制,该复制不断同步以确保反映主节点所做的任何更改

Pasted%20image%2020240308124201

服务Services

一个抽象层
看这个图
Pasted%20image%2020240308124440

由于pod定期销毁,所以ip不固定,service ip固定
拥有这个单一访问点可以让请求在 Pod 副本之间实现负载平衡

Kubernetes Service 支持几种类型,最常用的包括:

  • ClusterIP(默认类型):提供一个内部的虚拟 IP 地址(只能在集群内部访问),用于负载均衡到后端 Pods。
  • NodePort:在每个节点的指定端口上对外提供服务,任何到达该端口的流量都会被转发到后端 Pods。这允许从集群外部访问服务。
  • LoadBalancer:在支持的云提供商上,会请求一个外部负载均衡器,该负载均衡器会转发外部流量到 Kubernetes Service。
  • ExternalName:允许 Service 通过返回 CNAME 记录与外部服务进行映射,而不是通过标准的代理方法。

入口 Ingress

service可以视为内部网关
Ingress 是 Kubernetes 中的一个 API 对象,它管理外部访问集群内服务的访问,通常是 HTTP 和 HTTPS 请求。Ingress 允许您通过定义规则来将外部请求路由到集群内的不同服务。这意味着,Ingress 可以看作是位于 Kubernetes Service 之上的一个层,提供了更高级的 HTTP 路由功能,比如基于请求的路径或主机名(域名)来将流量分发到不同的服务

config

Pasted%20image%2020240308125459

必填字段

  • apiVersion
  • kind 您要创建什么类型的对象,例如 Deployment、Service、StatefulSet
  • metadata 这将包含可用于唯一标识对象的数据
  • spec 对象的所需状态
apiVersion: v1
kind: Service
metadata:
name: example-nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 8080
targetPort: 80
type: ClusterIP
YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80

kubectl

在tip里有

安全

不想写

开靶机

minikube start
kubectl get pods -A
kubectl apply -f nginx-service.yaml
kubectl apply -f nginx-deployment.yaml
kubectl port-forward service/nginx-service 8090:8080
kubectl get secrets
kubectl describe secret terminal-creds


kubectl create sa terminal-user
kubectl create sa terminal-admin