Service的类型Service在K8s中有以下四种类型
ClusterIp:默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP
NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过: NodePort来访问该服务
LoadBalancer:在NodePort的基础上,借助cloud provider创建一个外部负载均衡器,并将请求转发到: NodePort
ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有kubernetes 1.7或更高版本的kube-dns才支持
ClusterIP:
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
type: ClusterIP
selector:
app: myapp
release: stabel
ports:
- name: http
port: 80
targetPort: 80
Headless Service:
有时不需要或不想要负载均衡,以及单独的Service IP。遇到这种情况,可以通过指定ClusterIP(spec.clusterIP)的值为“None”来创建Headless Service。这类Service并不会分配Cluster IP,kubeproxy不会处理它们,而且平台也不会为它们进行负载均衡和路由
注:访问方式为---
服务名.名称空间.svc.cluster.local.@dns地址(cordns)
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
name: myapp
clusterIP: "None"
ports:
- port: 80
targetPort: 80
NodePort:
注:nodePort端口30000起步
apiVersion: v1
kind: Service
metadate:
name: myapp
namespace: default
spec:
selector:
name: myapp
type: NodePort
port:
- name: http
port: 443
targetPort: 443
nodePort: 30443
LoadBalancer:
注:该服务是在K8S前有一层软负载,通常由运营商提供是付费的!
lrloadBalancer和nodePort其实是同一种方式。区别在于loadBalancer比nodePort多了一步,就是可以调用cloud provider去创建LB来向节点导流
ExternalName:
ExternalName这种类型的Service通过返回CNAME和它的值,可以将服务映射到externalName字段的内容(例如:hub.atguigu.com )。ExternalName Service是Service的特例,它没有selector,也没有定义任何的端口和Endpoint。相反的,对于运行在集群外部的服务,它通过返回该外部服务的别名这种方式来提供服务
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: default
spec:
type: ExternalName
externalName: www.baidu.com
当查询主机my-service.defalut.svc.cluster.local ( SVC_NAME.NAMESPACE.svc.cluster.local )时,集群的DNS服务将返回一个值my.database.example.com的CNAME记录。访问这个服务的工作方式和其他的相同,唯一不同的是重定向发生在DNS层,而且不会进行代理或转发
Ingress:
Ingress-Nginx github地址:https://github.com/kubernetes/ingress-nginx
Ingress-Nginx官方网站:https://kubernetes.github.io/ingress-ng
Ingress-http代理访问:
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
type: clusterIP
selector:
name: my-app
ports:
- port: 80
targetPort: 80
portocol: TCP
---
apiVersion: extensions/v1beta1
kind: Ingress
metaddata:
name: nginx
spec:
rules:
- host: www.hao.com
http:
paths:
- path: /
backend:
serviceName: myapp
servicePort: 80
Ingress-https代理访问:
1.创建证书,以及cert存储方式
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
kubectl create secret tls tls-secret --key tls.key --cert tls.crt
注:生产环境中的tls证书由供营商提供
2.创建Ingress
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type:clusterIP
selector:
name: myapp
ports:
- port: 443
targetPort: 443
---
apiVersion: extensions/v1beta1
kind: Ingress
metadate:
name: nginx
spec:
tls:
- hosts:
- www.hao.com
secretName: tls-secret
rules:
- host: www.hao.com
http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 443
nginx认证(basicauth):
yum -y install httpd
htpasswd -c auth admin
kubectl create secret generic basic-nginx --form-file=auth
注:安装apacache使用它的模块创建用户
----------------------------------------------------------------
apiVersion: extensions/v1beta1
kind:Ingress
metadata:
name: nginx
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-nginx
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo'
spec:
rules:
- host: www.hao.com
http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 443
nginx地址重写:
名称 | 介绍 | 值 |
nginx.ingress.kubernetes.io/rewrite-target | 必须重定向流量的目标URI | 串 |
nginx.ingress.kubernetes.io/ssl-redirect | 指示位置部分是否仅可访问SSL(当Ingress包含证书时默认为True | 布尔 |
nginx.ingress.kubernetes.io/force-ssl-redirect | 即使Ingress未启用TLS,也强制重定向到HTTPS | 布尔 |
nginx.ingress.kubernetes.io/app-root | 定义Controller必须重定向的应用程序根,如果它在'/'上下文中 | 串 |
nginx.ingress.kubernetes.io/use-regex | 指示Ingress上定义的路径是否使用正则表达式 | 布尔 |
例:www.huai.com重定向到www.hao.com
注:因该访问,重定向到了其他地方,serviceName随便填也可以
apiVersion: extensions/v1beta1
kind:Ingress
metadata:
name: nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: https://www.hao.com
spec:
rules:
- host: www.huai.com
http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 443