Kubernetes的入门教程

83 阅读4分钟

Kubernetes入门

Kubernetes是一个容器编排平台。它被设计用来管理容器和服务的生命周期,同时提供可扩展性、可预测性和可用性。

Kubernetes架构

Kubernetes是分层构建的。每一个较高的层都会抽象出与较低层相关的复杂性。Kubernetes集群由以下组件组成。

  1. 节点作为Kubernetes集群的网关。它执行以下任务。

    • 公开API,用户和客户端应用程序可以连接到集群并与之通信。
    • 它检查集群内其他节点的健康状况。
    • 它安排并分配工作给集群中的其他节点。
  2. 工作者节点使用外部和本地资源接受并运行主节点分配给它们的工作负载。

  3. etcd是一个分布式键值存储,它持久化集群配置、对象的状态、集群上的节点以及对象被安排运行的节点。

  4. kubelets与API服务器通信,以确定哪个容器工作负载已被分配给节点。它还负责启动pod来运行容器工作负载。

  5. kube-proxy使得容器可以在集群内的各个节点上相互通信。

注:为了隔离、灵活和管理集群,Kubernetes使用节点内可用的容器运行时间即Docker在容器中运行应用程序和服务。

Kubernetes对象

Kubernetes对象是使用YAML或JSON文件定义的,这些文件被称为清单。

吊舱是Kubernetes的基本构建模块。它包括一个或多个紧密耦合的容器,具有共享网络层和文件系统卷。更高级别的组件管理吊舱,因此,它们没有在清单文件中明确定义。

Pod

部署

部署包括一个由模板和副本数量定义的pod集合。可以设置副本计数的具体数值,也可以使用单独的Kubernetes资源(水平pod自动调用器),根据CPU利用率来控制副本计数。

Deployment

如果在部署中运行的三个pod由于机器故障而崩溃,那么另外三个pod将被安排到不同的机器上运行。部署最适合于部署无状态的应用程序,在这种情况下,pod可以被替换,而不会引起集群问题。

下面是一个YAML文件,显示了一个部署的简单定义。

apiVersion: apps/V1
kind: Deployment
metadata: 
  name: rest-api-server
  labels: 
    app: api-server
spec:
  replicas: 10 # Defines the number of replicas in the deployment
  selector:
    matchLabels:
      app: api-server
  template: # Defines how a pod should look like
    metadata:
      labels:
        app: api-server
    spec:
      containers: # Defines the containers that should be running in the pod
      - name: rest-api-server
        image: api-server
        ports:
        - containerPort: 80

服务

服务提供了一个静态的端点,可以将流量导向所需的pod,即使pod因更新或扩展而改变。

下面的YAML文件显示了我们如何在之前创建的部署中包裹一个服务。

apiVersion: v1
kind: service
metadata:
  name: rest-api-service
  labels:
    app: rest-api
spec:
  type: ClusterIP # Defines how we expose our endpoints
  selector:
    app: rest-api # Defines the pods to direct traffic to.
  ports:
  - protocol: TCP # Defines how clients communicate with our service.
    port: 80

植入式服务(Ingress)

Ingress使我们有可能将运行在Kubernetes集群中的应用程序暴露给外部流量。Ingress使我们有可能定义应该公开的服务和应该保持私有的服务。我们应用程序的用户界面的服务可以是公开的,而运行我们的后端应用程序的服务保持私有。

下面是一个暴露用户界面服务的Ingress配置的例子。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: product-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: / # Defines the configuration for the ingress controller.
    spec:
    rules:
    - http: # Defines how external traffic should access the service
        paths:
        - path: /app
          backend: # Defines the service that the traffic is directed to.
            serviceName: user-interface-service
            servicePort: 80

其他Kubernetes对象

是用来管理pod内的文件系统的。Secret可以在存储证书,即密码时使用。ConfigMap用于指定被挂载到文件中的应用配置。HorizontalPodAutoscaler用于根据资源利用率和可用性自动扩展pod。StatefulSet与部署类似,但用于将数据库等有状态的应用程序部署到Kubernetes集群中。

本地安装Kubernetes

Kubernetes与Docker桌面捆绑在一起,可用于Windows和MacOS。

要验证你的Kubernetes安装是否正常,请运行下面的命令。

$ kubectl version --client

总结

现在你已经学会了Kubernetes中的各种组件,使用minikube在本地运行一个Kubernetes集群。