# 4. Getting Kubernetes - Docker Desktop 内置了单节点的 K8s 集群。 ```sh $ kubectl get nodes ``` --------- # 5. Containerizing an app - 将应用程序构建成容器镜像。 - 这个过程称为 **containerization** - 结果 app 称为 **containerized app** - Docker 与 K8s - K8s 1.24 后不再使用 docker。 - 但 docker 仍然适用于 k8s,因为它实现了 Open Container Initiative(OCI)标准。 ---------- # 6. Running an app on k8s - 本章节中,将一个容器化的应用部署到 k8s。 ## Depoly the app to k8s ### Pod - 将容器部署到 k8s,必须把它们包装成 **Pods**. - 暂时可以将 Pod 看作是一个 lightweight wrapper,唯一的目的是允许容器在 Kubernetes 上进行调度。 - Pod 是一个 k8s 的抽象,代表了一个容器组,包含了一到多个容器(如Docker),Pod 内的容器可以共享一些资源。 - Shared storage,如 Volumes - Networking,作为唯一的集群 IP 地址 - 关于如何运行每个容器的信息。如容器镜像的版本,使用哪个端口号。 - Pod 对应**一个特定应用**的逻辑主机,包含的容器是紧密耦合的。 - 例如 Pod 内有 node.js app,也有为它提供数据的容器。 - Pod 中的容器共享一个 IP 地址和端口空间,始终位于同一位置并在**同一node**上在一个共享的上下文下运行。 - Pod 是 k8s 平台的原子单元。每个 Pod 调度时绑定到一个 node。 ### Your first k8s Pod - pod.yml: ```yaml # pod.yml apiVersion: v1 kind: Pod metadata: name: first-pod labels: project: qsk-book spec: containers: - name: web-ctr image: nigelpoulton/qsk-book:latest ports: - containerPort: 8080 ``` - **apiVersion** 和 **kind** 告诉 k8s 基于 Pod v1 标准创建一个新的 pod。 - **metdata**:指定 pod 的名字和 label。使用 label 可以将它连接到 load balancer。 - **spec**:定义 Pod 运行哪些容器。 ### Deploy the app(Pod) - 部署命令 ```sh # 将 pod.yml 发送给 API server kubectl apply -f pod.yml ``` - 检查是否运行 ```sh kubectl get pods ``` ### Inpsect the app - kubectl 提供了 **get** 和 **describe** 命令来查询对象 objects 的配置和状态。 ```sh kubectl describe pod first-pod ``` - 显示的 Pod 的 ip 是内部的,无法从 cluster 外部访问。 - 为了访问 app,需要在 pod 前面放一个 **Service**,然后使用 Service 来访问。 ## Connect to the app - 通过一个 Service 来连接到 Pods 。 - K8s objects: - Pod - Service - Deployment - Ingress - **Service** 是一个 object,设计用来为 Pods 提供稳定的网络。 - 如下图所示,service 有一个前端和后端 - **前端**:提供一个 name,ip 和 port,可以供 clients 发送请求 - **后端**:匹配 labels,转发请求到 Pods。 - <img src="https://img.jonahgao.com/oss/note/2025p1/intro_k8s_f64.jpeg" width="550" /> ### Your first K8s service - svc.yml: ```yaml apiVersion: v1 kind: Service metadata: name: svc-lb spec: type: LoadBalancer ports: - port: 5555 targetPort: 8080 selector: project: qsk-book ``` - **spec** :定义了一个 LoadBalancer Service,监听 5555 端口,转发到 label 为 qsk-book Pod 的 8080 端口。 <img src="https://img.jonahgao.com/oss/note/2025p1/intro_k8s_f65.jpeg" width="500" /> ### A quick word on labels - Labels 是 k8s 连接 k8s objects 的主要方式。 ### Deploy the service ```sh $ kubectl apply -f svc.yml $ kubectl get svc # minikube中获取 service 访问地址 $ minikube service svc-lb --url ```