Kubernetes 人人适用☸️💡🎉
Kubernetes
Kubernetes
Kubernetes 是de facto
运行容器化应用程序的标准。
automating deployment
Kubernetes (K8s) 是一个用于、scaling
和容器化应用程序的开源系统management
。
Kubernetes 让容器化应用程序的部署和运行变得简单。Kubernetes 使用起来非常简单。
Kubernetes 很难理解,因为它提供了大量的选项来让你的部署更容易。
Kubernetes 的名字很贴切,它就像一位领航员(或舵手),助你驾驭容器世界。Kubernetes 是一个由社区为社区打造的可移植、可扩展的系统。
正如凯尔西正确引用的
Kubernetes 可以完成最优秀的系统管理员会做的事情,包括自动化、故障转移、集中日志记录和监控。它汲取了我们在 DevOps 社区中积累的经验,并将其作为默认配置,开箱即用。
为了使用 Kubernetes,了解
- Kubernetes 如何工作?
- Kubernetes 是如何架构的?
- Kubernetes 中有哪些组件?
让我们开始对 Kubernetes 进行黑客攻击。
Kubernetes 如何工作?
Kubernetes 以高可用集群模式运行,每个 Kubernetes 集群由一个或多个主节点(Master Node)和少量的工作节点(Worker Node)组成。
主节点
主节点由 API 服务器、调度器、控制器等组成。该节点被称为control plane
Kubernetes 的 。控制平面是brain
Kubernetes 的 。
也就是说控制平面负责 Kubernetes 内部的所有动作。
通过API server
,我们可以指示 Kubernetes 或者从 Kubernetes 获取信息。
负责Scheduler
调度 pod。
它们controllers
负责运行资源控制器。
这etcd
是 Kubernetes 的存储。它是一种键值存储。
节点
工作节点有一个 Kubelet 和代理。
Kubelets 是实际的主力,而 Kube-proxy 负责处理网络。
在职的
我们yaml
通过命令将文件提供给 Kubernetes 集群kubectl apply
。
该apply
命令调用API服务器,API服务器会将信息发送给controller
,同时将信息存储到etcd
。
然后将该etcd
信息复制到多个节点,以应对任何节点故障。
它将controller
检查给定状态是否与所需状态匹配。如果不匹配,它将通过将信息发送到scheduler
这些检查被称为Kubernetes 内部运行的协调循环。此循环的作用是验证请求的状态是否得到正确维护。如果预期状态与实际状态不匹配,此循环将执行必要的操作,将实际状态转换为预期状态。
里面有scheduler
一个队列。一旦消息在队列中被接收。
然后将调用scheduler
kubelet 执行预期操作,例如部署容器。
这是 Kubernetes 如何进行部署的 10000 英尺鸟瞰图。
Kubernetes 内部有各种组件。让我们来看看它们是什么以及它们有何用途。
Kubernetes 的组件
豆荚
一般来说,鲸群不过是一群海豚或鲸鱼。
同样,在 Kubernetes 的世界里,pods
Pod 是由一组容器组成的,它们共同生活。一个 Pod 里可能包含一个或多个容器。
是pod
Kubernetes 中最小的部署单元。通常,那些不能脱离其他容器生存的容器会被组合成一个 Pod。
这就是在 Kubernetes 中定义 pod 的方式。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
- apiVersion表示 Kubernetes 集群在解析和执行此文件时使用哪个版本的 API。
- kind定义了该文件将引用的 Kubernetes 对象的类型。
- 元数据包括识别 Pod 所需的所有元数据。
- spec包含容器信息。
部署
Pod 是部署的单位。应用程序要运行,需要一个或多个 Pod。Kubernetes 将整个 Pod 集合视为一个部署。
因此,部署记录了有关 Pod 的信息。Kubernetes 使用这些部署信息来管理和监控部署在其中的应用程序。
下面的文件是示例部署文件,它告诉 Kubernetes 创建nginx
使用nginx:1.7.9
容器的部署。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
副本集
部署会告诉 Kubernetes,你的应用程序需要哪些容器以及需要运行多少个副本。部署replica sets
负责确保这些副本能够正常运行。
ReplicaSet 负责管理和监控副本。
StatefulSet
我们经常需要持久存储、永久网络标识符,或者有序的部署、扩展和更新。在这些情况下,我们会使用StatefulSets
。
您可以像下面这样定义 StatefulSet:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
我们安装了该卷并声明了该卷的存储。
DaemonSet
有时,您需要在 Kubernetes 集群的每个节点上运行 Pod。例如,如果您要从每个节点收集指标,那么我们需要在每个收集指标的节点上调度一些 Pod。我们可以为这些节点使用 DaemonSet。
服务
部署定义了在容器上运行的应用程序的实际状态。用户需要访问该应用程序,或者您可能需要连接到容器进行调试。服务将为您提供帮助。
服务是 Kubernetes 对象,提供从外部世界或容器之间对容器的访问。
我们可以像下面这样定义服务:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
以上将service
端口上的传入连接映射80
到 targetPort 9376
。
您可以将服务视为 Kubernetes 世界中的负载均衡器、代理或流量路由器。
联网
这是 Kubernetes 最重要的元素。正在运行的 Pod 应该暴露给网络。Pod 内部运行的容器应该彼此通信,并且与外部世界进行通信。
虽然服务提供了连接到 pod 的方法,但网络决定了如何公开这些服务。
在Kubernetes中我们可以通过以下方式暴露服务:
- 负载均衡器
- 负载均衡器提供了一个外部 IP,我们可以通过该 IP 访问内部运行的 pod。
- Kubernetes 将启动服务,然后
asynchronously
启动负载均衡器。
- 节点端口
- 每个服务都会有一个动态分配的端口。
- 我们可以使用 Kubernetes 主 IP 访问服务。
- 入口
- 每项服务都有一个单独的地址。
- 然后入口控制器访问这些服务。
- 入口控制器不是公共 IP 或外部 IP。
秘密
对于应用程序,我们通常需要提供密码、令牌等信息。Kubernetes 提供了secrets
对象来存储和管理这些敏感信息。我们可以像下面这样创建一个 secret:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
stringData:
config.yaml: |-
apiUrl: "https://my.api.com/api/v1"
username: {{username}}
password: {{password}}
最佳实践
Kubernetes 如同汪洋大海,我们所见的不过是沧海一粟。由于 Kubernetes 支持广泛的应用程序和选项,因此有各种不同的选项和功能可供选择。
使用 Kubernetes 时需要遵循的一些最佳实践是:
制作更小的 YAML
这些yaml
文件是 Kubernetes 配置的核心。
我们可以在一个文件中定义多个 Kubernetes 配置yaml
。虽然yaml
与 相比减少了样板文件JSON
。但文件仍然yaml
占用空间且容易出错。
因此,请始终尝试最小化文件的大小yaml
。
对于每个服务、部署、机密和其他 Kubernetes 对象,在单独的yaml
文件中定义它们。
将 yaml 文件拆分为更小的文件。
此处适用single responsibility principle
。
图像更小,启动速度更快
当发生崩溃、升级或使用量增加时,Kubernetes 会自动重启 Pod。镜像的启动速度越快,就越重要。为了加快启动速度,我们需要使用更小的镜像。
Alpine 镜像是您的好帮手。您可以使用 Alpine 镜像作为基础,仅在绝对必要时才添加组件或库。
始终记住要使用较小的图像尺寸。用于
builder pattern
从 Alpine 图像创建图像。
健康 - 僵尸进程
Docker 容器只有在容器内运行的所有进程终止时才会终止。healthy
即使其中一个进程被终止,Docker 容器也会返回状态。这将创建一个Healthy-Zombie
进程。
尽量在容器内运行单个进程。如果无法运行单个进程,则尝试使用一种机制来确定所有必需的进程是否都在运行。
清理未使用的资源
在容器世界中,未使用的资源占用内存的情况很常见。确保正确清理这些资源非常重要。
思考请求和限制
确保所有容器的请求和限制都正确指定。
resources:
requests:
memory: "100Mi"
cpu: "100m"
limits:
memory: "200Mi"
cpu: "500m"
这requests
是容器保证获得的限制。这limits
是允许容器使用的最大或最小资源。
pod 中的每个容器都可以请求和限制其资源。
红色/使用图案
RED
使用模式监控和管理您的服务。
- 请求
- 错误
- 期间
跟踪请求、响应中的错误以及接收响应的时长。根据这些信息,调整您的服务以获得最佳性能。
对于资源,使用USE
模式。
- 利用率
- 饱和
- 错误
监控资源利用率、资源饱和程度以及错误情况。根据这些信息调整资源配置,优化资源分配。
希望以上内容能帮助您对 Kubernetes 有一个大致的了解Kubernetes
。请访问kubernetes.io获取更多关于 Kubernetes 的信息。
现在您想使用 Istio 在 Kubernetes 上部署示例应用程序,请查看这篇文章。
您可以在Twitter上关注我。
如果你喜欢这篇文章,请点赞或者留言。❤️
文章来源:https://dev.to/sendilkumarn/kubernetes-for-everyone-opb