Kubernetes --(k8s) service +7层 ingress-nginx
service
- Kubernete Service 是一个定义了一组Pod的策略的一种抽象:这个抽象是一个pod的逻辑分组,一种可以访问他们的策略。我们也有时候叫做宏观服务。
- 这一组pod能够被service访问到,通常是通过Label Selector;我们知道pod的endpoint(pod ip+containerPort)会随着pod的销毁和重新创建而发生改变,新的pod的ip和旧的pod的ip不同,而label不会变,service会通过label selector 找到后端pod 。如下图:
- service一旦被创建kunernetes就会为它创建一个可用的cluster ip,而且在service的整个生命周期内,它的cluster ip 不会发生改变;通过分析、识别并建模系统中所有服务为微服务----kubernetes service 我们系统最终有多个提供不同服务而又彼此独立的微服务单元组成的,服务之间通过TCP/IP进行通信;
- 对于Kubernete原生的应用,Kubernete提供了一个简单的Endpoints API,这个Endpoints api的作用就是当一个服务中的pod发生变化时,Endpoints API随之变化,对于哪些不是原生的程序,Kubernetes提供了一个基于虚拟IP的网桥的服务,这个服务会将请求转发到对应的后台pod
service的类型
service在k8s中有以下4种类型
1、ClusterIp:默认类型,自动分配一个仅在Cluster内部可以访问的虚拟Ip (最常用)
2、NodePort:在ClusterIp基础上为service在每台机器(node)上绑定一个端口,这样就可以通过:Nodeport来访问该服务
3、LoadBalancer:在NodePort的基础上借助cloude provider 创建一个外部负载均衡器,并将请求转发到NodePort
4、ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型的代理被创建,这只有k8s1.7版本及以上的kube-dns支持
实验
第一步:编写部署nginx-svc的yml文件
╭─root@node1 ~
╰─➤ vim nginx-svc.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx1
spec:
replicas: 2
template:
metadata:
labels:
name: web # 标签 service
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80 # 暴露在pod的ip上的端口
---
apiVersion: v1
kind: Service
metadata:
name: my-svc
spec:
selector:
name: web # 标签 labels
ports:
- port: 80 # service暴露的端口
targetPort: 80 # pods的端口
第二步:运行yml文件
╭─root@node1 ~
╰─➤ kubectl apply -f nginx-svc.yml
第三步:查看标签
╭─root@node1 ~
╰─➤ kubectl get po -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
nginx1-7f56c7b7f8-qxqbg 1/1 Running 0 2m33s 10.244.1.6 node2 <none> <none> name=web,pod-template-hash=7f56c7b7f8
nginx1-7f56c7b7f8-zjt9m 1/1 Running 0 2m33s 10.244.2.11 node3 <none> <none> name=web,pod-template-hash=7f56c7b7f8
指定namespace
查看namespace
╭─root@node1 ~
╰─➤ kubectl get namespace
NAME STATUS AGE
default Active 2d19h
kube-node-lease Active 2d19h
kube-public Active 2d19h
kube-system Active 2d19h
编辑yml文件
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx1
namespace: kube-system # 指定namespace
spec:
replicas: 2
template:
metadata:
labels:
name: web
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-svc
namespace: kube-system # 指定namespace
spec:
selector:
name: web
ports:
- port: 80
其中:
- 通过DNS名称访问,只能在同一名称空间
- 如果不是同一名称空间,需要指定namespace
外网访问
第一步:修改yml文件
kind: Deployment
metadata:
name: nginx1
spec:
replicas: 2
template:
metadata:
labels:
name: web
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-svc
spec:
type: NodePort # 选择service端口暴露方式
selector:
name: web
ports:
- port: 80
targetPort: 80
nodePort: 30007 # 端口选择范围 30000-32767
第二步:执行yml文件
╭─root@node1 ~
╰─➤ kubectl apply -f nginx-svc.yml
第三步:查看svc
╭─root@node1 ~
╰─➤ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d19h
my-svc NodePort 10.109.183.148 <none> 80:30007/TCP 9s
第四步:查看主机端口
╭─root@node1 ~
╰─➤ ss -ntl |grep 30007
LISTEN 0 128 :::30007 :::*
ingress-nginx
service没有提供7层负载的能力,但是可以通过ingress-nginx实现
k8s-Ingress:HTTP7层路由机制:https://www.cnblogs.com/du-z/p/16164031.html