k8s就像图中的货船,管理各种集装箱(容器)
java -jar k8s-demo.jar &
docker run --name k8s-demo -d -p 8080:8080 k8s-demo:0.0.1-SNAPSHOT
这一步大致感受一下yaml的样子,不需要关心脚本的细节,后面介绍资源时会细说。只需要有个大体的印象,部署一个k8s服务的基本流程。
# 文件名为k8s-demo.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: k8s-demo
namespace: spring-test
spec:
replicas: 3
template:
metadata:
labels:
app: k8s-demo
spec:
containers:
- name: k8s-demo
image: k8s-demo:0.0.1-SNAPSHOT
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: k8s-demo
namespace: spring-test
spec:
type: NodePort
selector:
app: k8s-demo
ports:
- protocol: TCP
port: 8888
targetPort: 8080
nodePort: 30003
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: k8s-demo
namespace: spring-test
spec:
rules:
- host: www.k8s-demo.com
http:
paths:
- path: /hello
backend:
serviceName: k8s-demo
servicePort: 8888
为了减少部署复杂度,代码并没有使用redis,只是实例图增加了redis
我们说容器实现了单个应用程序的基本包装实现可移植。上图中,宿主机部署的方式如果加上一个nginx做反向代理,就和k8s中ingress的部署方式是一样的。也就是k8s实现了整套分布式应用的可移植
k8s通过对比资源的“实际状态”和etcd中的“期望状态”,实现自动化控制
为什么要新增pod这个概念?
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: k8s-demo
namespace: spring-test
spec:
replicas: 3
template:
metadata:
labels:
app: k8s-demo
spec:
containers:
- name: k8s-demo
image: k8s-demo:0.0.1-SNAPSHOT
ports:
- containerPort: 8080
apiVersion: v1
kind: Service
metadata:
name: k8s-demo
namespace: spring-test
spec:
type: NodePort
selector:
app: k8s-demo
ports:
- protocol: TCP
port: 8888
targetPort: 8080
nodePort: 30003
service提供了ip:port的访问方式,即工作在tcp/ip层,而http服务需要将不同的url对应到不同的后端服务,service是无法实现这一功能的。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: k8s-demo
namespace: spring-test
spec:
rules:
- host: www.k8s-demo.com
http:
paths:
- path: /hello
backend:
serviceName: k8s-demo
servicePort: 8888
前面hello world程序中,对于如何访问到服务,有必要了解一下k8s的网络模型,在这之前先介绍docker的网络模型
目前原生docker和kubernetes还不能打通多节点容器与容器的通讯,要支持该模型,必须依靠第三方网络插件实现,比如:flannel