Deploy with Kubernetes
基本概念
Pod
Pod 概念
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。
Pod是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的“逻辑主机”,其中包含一个或多个应用容器, 这些容器是相对紧密的耦合在一起的。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于 在同一逻辑主机上运行的云应用。
可以通过 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 收养其资源。
上文中我们通过 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