一、前言

kubernetes集群中,pod是多变的,可以被新建或删除,而且ip不稳定,不方便集群外部访问,所以提供了一种新的资源 Service ,就是就是 a set of Pod ,作用是提供一个稳定的IP,给集群外访问。

本文所需要的 ingress-controller 的 mandatory.yaml 文件 : https://www.syjshare.com/res/6BFS49US

本文所有涉及的Service的两种部署方式(NodePort和ClusterIP) yaml 文件:https://www.syjshare.com/res/ZLYV4RE7

Service暴露服务的方式一共有四种,如下:

ClusterIP:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 ServiceType。

NodePort:通过每个节点上的 IP 和静态端口(NodePort)暴露服务。 NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。

LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。

ExternalName:通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。 无需创建任何类型代理。

其中,最常见的两种是 ClusterIP 和 NodePort ,本文实践这种两种方式。

二、NodePort

2.1 新建命名空间

当我们需要开始做一件事情的时候,最好重新建一个命名空间,这样不干扰之前的,如下:

2.2 切换命名空间

# 切换命名空间
kubectl config set-context $(kubectl config current-context) --namespace=myns

2.3 新建Pod和Service并测试

Service

apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami-deployment
labels:
app: whoami
spec:
replicas: 3
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: jwilder/whoami
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: whoami-service
spec:
ports:
- port: 81 # 默认就是访问80端口 curl serviceIp 就好
protocol: TCP
targetPort: 8000 # 映射到targetPort为8000 就是上面pod那个
selector:
app: whoami # selector 匹配上模板上的 label

要搞清楚pod-service的关联关系
pod使用的是jwilder/whoami镜像,这个是公开的镜像,没问题
pod和service通过 label-selector 关联起来,pod中定义 app: whoami 这个标签 ,然后servie中通过 selector: app: whoami 这个选择器找到这个标签,selector-label 标签选择器绑定完成之后,就是端口绑定,然后 service 使用的是 80 端口映射到所绑定的pod的8000的端口,就是访问 service 的 80 端口,就是访问 pod 的 8000 端口。

要搞清楚pod的ip地址 service的ip地址 宿主机的ip地址的关联关系

  集群内端口 集群内ip 外网ip 外网port
pod ports: - containerPort: 8000 指定(只能集群内访问) 自动分配(只能集群内访问)
service ports:- port: 80 指定(只能集群内访问) 其中的 targetPort: 8000 映射到pod 自动分配(只能集群内访问) 宿主机静态IP 自动分配30000以上

三、Ingress

3.1 总述

ingress 和 ingress-controller 是两个不同东西,是两个不同的配置文件
ingress -> ingress-controller -> service -> pod

3.2 实践

3.2.1 新建ingressController

kubectl label node m name=ingress
kubectl apply -f mandatory.yaml
kubectl get all -n ingress-nginx

mandatory.yaml 这个yaml文件太大了,不好放在博客里面,读者可以从 https://www.syjshare.com/res/6BFS49US 下载获得。
另外,注意这个 ingress-controller 使用HostPort方式运行 ,所以 mandatory.yaml 文件中有 hostNetwork: true 这句。

3.2.2 创建tomcat的pod和service

创建tomcat的pod和service

vi tomcat.yaml
kubectl apply -f tomcat.yaml
kubectl get svc
kubectl get pods
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat
spec:
replicas: 1
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: tomcat

3.2.3 创建Ingress以及定义转发规则

创建Ingress以及定义转发规则

kubectl apply -f nginx-ingress.yaml
kubectl get ingress
kubectl describe ingress nginx-ingress
#ingress   这个就是extensions/v1beta1,不要修改
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
spec:
rules:
- host: tomcat.jack.com
http:
paths:
- path: /
backend:
serviceName: tomcat-service
servicePort: 80

3.2.4 测试

chrome浏览器访问这个就好了

3.2.5 再搞一个测试

apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami-deployment
labels:
app: whoami
spec:
replicas: 3
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: jwilder/whoami
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: whoami-service
spec:
ports:
- port: 81 # 默认就是访问80端口 curl serviceIp 就好
protocol: TCP
targetPort: 8000 # 映射到targetPort为8000 就是上面pod那个
selector:
app: whoami # selector 匹配上模板上的 label

成功

四、尾声

Service暴露的两种方式,完成了。

ClusterIP 直译就是集群内ip,所以就是 不暴露外部端口,是默认方式;
NodePort 直译就是节点端口,所以就是 虚拟机/宿主机的端口,就是暴露外部端口。
一般来说,Cluster IP是默认的服务类型,所以使用这种更好,但是比较复杂,需要配置 ingress 和 ingress-controlller ,将 ingress 作为入口。

天天打码,天天进步!!

最新文章

  1. OpenCASCADE Shape Location
  2. 创建 VXLAN - 每天5分钟玩转 OpenStack(111)
  3. Maven(1)-安装和配置
  4. POJ-1579
  5. 对于WIFI版ipad(无GPS芯片)定位功能的释疑
  6. 关于 ASP.NET vNext
  7. C#测量程序运行时间及cpu使用时间
  8. 《STL源代码分析》---stl_heap.h读书笔记
  9. postman+newman+jenkins 接口自动化问题
  10. 错误 Run-time error nnn at xxxx; 错误
  11. 微信小程序之用户信息授权 wx.getUserInfo
  12. PHP进程之信号捕捉中的declare(ticks=1)
  13. 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)
  14. What is linux symbolic link
  15. PRmakefile文件
  16. 洛谷-跑步-NOI导刊2010提高
  17. Vue.extend动态注册子组件
  18. HDU - 4758 Walk Through Squares (AC自己主动机+DP)
  19. java中return在Try-Catch中的执行顺序
  20. jquery17 DOM操作 : 添加 删除 获取 包装 DOM筛选

热门文章

  1. git hooks在业务中的使用
  2. 天天写SQL,这些神奇的特性你知道吗?
  3. HBuilder X之uniapp最适合的代码补全模板
  4. Beats:如何使用Winlogbeat
  5. Spring mvc源码分析系列--Servlet的前世今生
  6. 驱动通信:通过PIPE管道与内核层通信
  7. value中放vue的参数
  8. POJ1094 Sorting It All Out (floyd传递闭包)
  9. C++运算符重载(简单易懂)
  10. virtualbox的Linux虚拟磁盘大小调整及注意事项