# 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
```