如果在生产环境中运行的都是独立的单体服务,那么 Container (容器) 也就够用了,但是在实际的生产环境中,维护着大规模的集群和各种不同的服务,服务之间往往存在着各种各样的关系。而这些关系的处理,才是手动管理最困难的地方。
Pod 是我们将要创建的第一个 k8s 资源,也是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。在了解 pod
和 container
的区别之前,我们可以先创建一个简单的 pod 试试,
我们先创建 nginx.yaml
文件,编写一个可以创建 nginx
的 Pod。
yaml# nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx
在生产环境中,我们基本上不会直接管理 pod,我们需要 kubernetes
来帮助我们来完成一些自动化操作,例如自动扩容或者自动升级版本。可以想象在生产环境中,我们手动部署了 10 个 hellok8s:v1
的 pod,这个时候我们需要升级成 hellok8s:v2
版本,我们难道需要一个一个的将 hellok8s:v1
的 pod 手动升级吗?
这个时候就需要我们来看 kubeates
的另外一个资源 deployment
,来帮助我们管理 pod。
首先可以创建一个 deployment.yaml
的文件。来管理 hellok8s
pod。
yamlapiVersion: apps/v1
kind: Deployment
metadata:
name: hellok8s-deployment
spec:
replicas: 1
selector:
matchLabels:
app: hellok8s
template:
metadata:
labels:
app: hellok8s
spec:
containers:
- image: guangzhengli/hellok8s:v1
name: hellok8s-container
经过前面几节的练习,可能你会有一些疑惑:
kubernetes
不会将流量重定向到该 pod,这是怎么做到的?port-forword
将 pod 的端口暴露到本地,不仅需要写对 pod 的名字,一旦 deployment 重新创建新的 pod,pod 名字和 IP 地址也会随之变化,如何保证稳定的访问地址呢?。kubernetes
提供了一种名叫 Service
的资源帮助解决这些问题,它为 pod 提供一个稳定的 Endpoint。Servie 位于 pod 的前面,负责接收请求并将它们传递给它后面的所有pod。一旦服务中的 Pod 集合发生更改,Endpoints 就会被更新,请求的重定向自然也会导向最新的 pod。
Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。Ingress 可为 Service 提供外部可访问的 URL、负载均衡流量、 SSL/TLS,以及基于名称的虚拟托管。你必须拥有一个 Ingress 控制器 才能满足 Ingress 的要求。 仅创建 Ingress 资源本身没有任何效果。 Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,例如 minikube
默认使用的是 nginx-ingress,目前 minikube
也支持 Kong-Ingress。
Ingress 可以“简单理解”为服务的网关 Gateway,它是所有流量的入口,经过配置的路由规则,将流量重定向到后端的服务。
在实际的开发当中,有时候我们需要不同的环境来做开发和测试,例如 dev
环境给开发使用,test
环境给 QA 使用,那么 k8s 能不能在不同环境 dev
test
uat
prod
中区分资源,让不同环境的资源独立互相不影响呢,答案是肯定的,k8s 提供了名为 Namespace 的资源来帮助隔离资源。
在 Kubernetes 中,名字空间(Namespace) 提供一种机制,将同一集群中的资源划分为相互隔离的组。 同一名字空间内的资源名称要唯一,但跨名字空间时没有这个要求。 名字空间作用域仅针对带有名字空间的对象,例如 Deployment、Service 等。
前面的教程中,默认使用的 namespace 是 default
。
下面展示如何创建一个新的 namespace, namespace.yaml
文件定义了两个不同的 namespace,分别是 dev
和 test
。