容器镜像:huangxjie/tomcat:0.0.1 该镜像只是一个简单的测试镜像,可以使用此镜像或者更换自己的镜像
deployment
首先讨论如果不使用deployment而是创建单个pod,当然这样是可以访问容器内的资源。但是万一此pod因为网络原因无法访问,那么项目就无法访问了,只能自己再创建新的pod重新部署应用。为了解决这个问题可以使用replicateSet来控制副本,这里使用deployment来控制副本数量。
使用deployment创建pod,deployment不仅可以控制pod副本的数量,deployment还有pod回滚,升级等功能
apiVersion: apps/v1 # #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment # 资源类型为Deployment
metadata: # 元数据,即 Deployment 的一些基本属性和信息
name: hello-deployment # Deployment 的名称
labels: # 标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组
app: hello # 为该Deployment设置key为app,value为hello的标签
spec: # 这是关于该Deployment的描述
replicas: 3 # 使用该Deployment创建3个应用程序实例
selector: # 标签选择器
matchLabels: # 选择包含标签app:hello的资源
app: hello
template: # 这是选择或创建的Pod的模板
metadata: # Pod的元数据
name: hello # Pod的名称,K8s会在后面加上字符区分不同的Pod
labels: # Pod的标签,上面的selector即选择包含标签app:hello的Pod
app: hello
spec: # 关于该Pod的描述
containers: # container,与docker中的container是同一种
- name: tomcat # container的名称
image: huangxjie/tomcat:0.0.1 # 使用我的测试镜像
ports:
- containerPort: 8080 # 容器访问端口
service
如果不使用service,可以直接访问pod从而访问应用。但是因为网络等因素导致pod被删除之后,虽然deployment能够保证副本的总数量,但是副本的名称和地址都会改变,如果在使用之前的地址访问就访问不到部署的应用,所以我们使用service来提供统一的对外接口。
apiVersion: v1
kind: Service # 资源类型为Service
metadata:
name: hello-service # 设置service的名称为hello-service
spec: # 关于该service的描述
selector: # 选择器
app: hello # 选择key为app,value为hello的pod
type: NodePort # service的类型设置为NodePort
ports:
- port: 80 # 服务集群IP的端口号,<cluster ip>:port 是提供给集群内部客户访问service的入口
targetPort: 8080 # 背后Pod的目标端口
nodePort: 30002 # 通过集群节点的30123端口可以访问该服务,<nodeIP>:nodePort 是提供给集群外部客户访问service的入口
ingress
Ingress 是 Kubernetes 的一种 API 对象,将集群内部的 Service 通过 HTTP/HTTPS 方式暴露到集群外部,并通过规则定义 HTTP/HTTPS 的路由。Ingress 具备如下特性:集群外部可访问的 URL、负载均衡、SSL Termination、按域名路由(name-based virtual hosting)
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: hello-ingress-for-hello # Ingress 的名字,仅用于标识
spec:
rules: # Ingress 中定义 L7 路由规则
- host: hello.example.com # 根据 virtual hostname 进行路由(请使用您自己的域名)
http:
paths: # 按路径进行路由
- path: /
backend:
serviceName: hello-service # 指定后端的 Service 为之前创建的 hello-service
servicePort: 80
在集群内部可以通过http://<nodeIp>:nodePort/mavenWebDemo/访问刚才部署的应用,例如我们在搭建的虚拟机浏览器内输入地址,会得到刚刚部署的测试应用
上述这样访问只是在集群内部访问测试应用,如果我们在集群外,访问同样的地址,我们会发现,访问不到我们刚才的应用。
从集群外部访问部署的应用,需要配置Ingress中配置的Host指向Ingress的IP地址,Linux系统可以在/etc/hosts文件中添加,Windows系统在C:\windows\system32\drivers\etc\hosts中添加ingress中hosts和nodeIp,这样集群外就可以通过这个地址访问应用了http://hello.example.com/mavenWebDemo/index.jsp