Deploy with Kubernetes

on 2024-07-03

基本概念

Pod

Pod 概念

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。

Pod是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的“逻辑主机”,其中包含一个或多个应用容器, 这些容器是相对紧密的耦合在一起的。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于 在同一逻辑主机上运行的云应用。

——《Pods | Kubernetes

可以通过 kubectl get pods --all-namespaces 查询集群内的所有 Pod

Pod声明

我们可以用一个 YAML 文件声明一个 Pod

例如:nginx.yaml

# api 版本
apiVersion: v1
# 声明类型
kind: Pod
metadata:
    # pod 名字
    name: nginx
spec:
    containers:
    # 容器名字
    - name: nginx
        # 容器使用
        image: nginx:latest
        ports:
        # 容器监听端口
        - containerPort: 80

之后使用 kubectl apply -f ./nginx.yaml 即可创建一个 Pod

Deployment

Deployment 概念

一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。

你负责描述 Deployment 中的 目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变为期望状态。你可以定义 Deployment 以创建新的 ReplicaSet,或删除现有 Deployment, 并通过新的 Deployment 收养其资源。

——《Deployments | Kubernetes

上文中我们通过 Pod 的声明创建了一个 Nginx 实例, 但在实际使用中, 我们并不会直接操作 Pod, 而是通过 Deployment 来管理 Pod

可以通过 kubectl get deployment --all-namespaces 查看集群内的所有 Deployment

Deployment 声明

例如:nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
    # deployment 名字
    name: nginx-deployment
    labels:
        # deployment 标签
        app: nginx
spec:
    # Pod 副本数
    replicas: 3
    # 选择器, 用于控制创建的 pod
    selector:
        # 匹配标签
        matchLabels:
        app: nginx
    # Pod 部署模板, 与单个 Pod 声明一致
    template:
        metadata:
        labels:
            app: nginx
        spec:
        containers:
        - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80

使用方式也是一样 kubectl apply -f ./nginx-deployment.yaml

之后使用 kubectl get pods 就可以看到三个Pod

Service

Service 概念

将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。

使用 Kubernetes,你无需修改应用程序即可使用不熟悉的服务发现机制。 Kubernetes 为 Pods 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名, 并且可以在它们之间进行负载均衡。

Service 声明

例如:nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
    name: nginx-service
spec:
    selector:
        # 匹配标签
        app: nginx
    # 端口暴露类型
    type: NodePort
    ports:
    - name: http
        protocol: TCP
        # Service 端口
        port: 80
        # Pod 内的端口
        targetPort: 80
        # Node 的端口, 后面可以通过服务器 Ip:NodePort 的方式访问
        nodePort: 30080

执行 kubectl apply -f ./nginx-service.yaml

然后可以通过 kubectl get svc 查看服务部署情况

Ingress

Ingress 概念

Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。

Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。

Ingress 声明

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
    name: nginx-ingress
spec:
    rules:
    - http:
        paths:
        - path: /
            pathType: Prefix
            backend:
            service:
                name: nginx-service
                port:
                number: 80