Kubernetes 人人适用☸️💡🎉
Kubernetes
Kubernetes
Kubernetes 是de facto运行容器化应用程序的标准。
automating deploymentKubernetes (K8s) 是一个用于、scaling和容器化应用程序的开源系统management。
Kubernetes 让容器化应用程序的部署和运行变得简单。Kubernetes 使用起来非常简单。
Kubernetes 很难理解,因为它提供了大量的选项来让你的部署更容易。
Kubernetes 的名字很贴切,它就像一位领航员(或舵手),助你驾驭容器世界。Kubernetes 是一个由社区为社区打造的可移植、可扩展的系统。
正如凯尔西正确引用的
Kubernetes 可以完成最优秀的系统管理员会做的事情,包括自动化、故障转移、集中日志记录和监控。它汲取了我们在 DevOps 社区中积累的经验,并将其作为默认配置,开箱即用。
为了使用 Kubernetes,了解
- Kubernetes 如何工作?
- Kubernetes 是如何架构的?
- Kubernetes 中有哪些组件?
让我们开始对 Kubernetes 进行黑客攻击。
Kubernetes 如何工作?
Kubernetes 以高可用集群模式运行,每个 Kubernetes 集群由一个或多个主节点(Master Node)和少量的工作节点(Worker Node)组成。
主节点
主节点由 API 服务器、调度器、控制器等组成。该节点被称为control planeKubernetes 的 。控制平面是brainKubernetes 的 。
也就是说控制平面负责 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一个队列。一旦消息在队列中被接收。
然后将调用schedulerkubelet 执行预期操作,例如部署容器。
这是 Kubernetes 如何进行部署的 10000 英尺鸟瞰图。
Kubernetes 内部有各种组件。让我们来看看它们是什么以及它们有何用途。
Kubernetes 的组件
豆荚
一般来说,鲸群不过是一群海豚或鲸鱼。
同样,在 Kubernetes 的世界里,podsPod 是由一组容器组成的,它们共同生活。一个 Pod 里可能包含一个或多个容器。
是podKubernetes 中最小的部署单元。通常,那些不能脱离其他容器生存的容器会被组合成一个 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 后端开发教程 - Java、Spring Boot 实战 - msg200.com
            后端开发教程 - Java、Spring Boot 实战 - msg200.com
          







