K8s服务发现
(1)其中主要包含service
和Ingress
两部分,其中service
主要做内部服务的共享,Ingress
主要做外部服务的发现。
k8s-service学习
(1)首先看一下service
的网络结构图。
- 首先部署了2个
nginx
服务,分别部署在node1
和node2
节点上。 - 起一个可以访问
node1
和node2
节点上的nginx
的service
服务。 - 首先通过
nginx-svc
的端口进入service
,然后通过Endpoint
找到2个node
中的kube-proxy
。 - 然后通过
kube-proxy
代理到2个nginx
服务的pause
,找到其具体的地址。然后访问nginx
服务。
1.service的配置文件
apiVersion: v1
kind: Service #资源类型
metadata:
name: nginx-svc # service的名字
labels:
app: nginx # service自己本身的标签
spec:
selector: # 匹配那些pod会被该service代理
app: nginx-deploy # 所有匹配到该标签的pod都可以通过该servcie进行访问
ports: # 端口映
- port: 80 # service自己的端口 ,在使用内网ip时访问使用
targetPort: 80 # 目标pod的端口
name: web # 为端口起个名字
type: NodePort # 随机启动一个端口,映射到ports里面的端口,该端口绑定在node上,且集群中每个node都会绑定这个端口
2.service基础操作
# 创建 service
kubectl create -f nginx-svc.yaml
# 查看 service 信息,通过 service 的 cluster ip 进行访问
kubectl get svc
# 查看 pod 信息,通过 pod 的 ip 进行访问
kubectl get po -owide
# 创建其他 pod 通过 service name 进行访问(推荐)
kubectl exec -it busybox -- sh
curl http://nginx-svc
# 默认在当前 namespace 中访问,如果需要跨 namespace 访问 pod,则在 service name 后面加上 .<namespace> 即可
curl http://nginx-svc.default
3.service通过ip对外部进行访问
(1)编写 service
配置文件时,不指定 selector
属性。
# 新建一个service配置文件
vim nginx-svc-external.yaml
# 配置文件内容如下
apiVersion: v1
kind: Service #资源类型
metadata:
name: nginx-svc-external # service的名字
labels:
app: nginx # service自己本身的标签
spec:
ports: # 端口映
- port: 80 # service自己的端口 ,在使用内网ip时访问使用
targetPort: 80 # 目标pod的端口
name: web # 为端口起个名字
type: ClusterIP # 随机启动一个端口,映射到ports里面的端口,该端口绑定在node上,且集群中每个node都会绑定这个端口
#创建该服务
kubectl create -f nginx-svc-external.yaml
(2)自己创建endpoint
。通过访问nginx-svc-external
服务,从而访问到百度官网。
# 新建一个endpoint的配置文件
vim nginx-ep-external.yaml
# 配置文件内容如下
apiVersion: v1
kind: Endpoints
metadata:
labels:
app: nginx # 与 service 一致
name: nginx-svc-external # 与 service 一致
namespace: default # 与 service 一致
subsets:
- addresses:
- ip: 110.242.68.4 # 目标 ip 地址 此处使用的是百度的ip地址
ports: # 与 service 一致
- name: web
port: 80
protocol: TCP
# 创建endpoint服务
kubectl create -f nginx-ep-external.yaml
(3)使用测试工具进行测试。
# 以命令行方式进入
kubectl exec -it dns-test -- sh
# 使用以下命令就可以访问到baidu的页面
wget http://nginx-svc-external
4.service通过域名的方式对外部进行访问
其中配置文件如下,操作流程和跟ip
对外访问一样。
apiVersion: v1
kind: Service
metadata:
labels:
app: baidu-external-domain
name: baidu-external-domain
spec:
type: ExternalName
externalName: www.baidu.com
5.service常用类型
(1)ClusterIP
:只能在集群内部使用,不配置类型的话默认就是 ClusterIP
。
(2)ExternalName
:返回定义的 CNAME
别名,可以配置为域名。
(3)NodePort
:会在所有安装了 kube-proxy
的节点都绑定一个端口,此端口可以代理至对应的 Pod
,集群外部可以使用任意节点 ip + NodePort
的端口号访问到集群中对应 Pod
中的服务。当类型设置为 NodePort
后,可以在ports
配置中增加 nodePort
配置指定端口,需要在下方的端口范围内,如果不指定会随机指定端口,端口范围:30000~32767。
(4)LoadBalancer
:使用云服务商(阿里云、腾讯云等)提供的负载均衡器服务。
k8s-ingress学习
(1)如下图所示可以看到Ingress
的作用。用户首先通过绑有域名的负载均衡器进入到ingress
,然后ingress
下绑定到service
,再通过service
找到Pod
。
1.ingress-niginx的安装
(1)首先要安装Helm
,Helm
就是像wget
一样的下载工具。
# 下载二进制文件
wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz
# 进行解压
tar -zxvf helm-xxxx-linux-amd64.tar.gz
# 将解压目录下的文件移动到usr/local/bin
cp helm /usr/local/bin/
#查看是否安装成功
helm version
(2)下载ingress-nginx
,本文使用的是4.4.2
版本。
(本例中一开始下载的是ingress-nginx,4.9.0
,会出现Role.yaml.....Err
,换回到4.4.2
就不报错了)
# 添加仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# 查看仓库列表
helm repo list
# 查看所有版本
helm search repo ingress-nginx -l
# 下载指定版本
helm fetch ingress-nginx/ ingress-nginx --version x.x.x
# # 将下载好的安装包解压
tar xf ingress-nginx-xxx.tgz
(3)配置 values.yaml
文件。此处搜索可以使用/
进行搜索。
# 先修改controller处的镜像地址,修改为国内镜像
registry: registry.cn-hangzhou.aliyuncs.com
image: google_containers/nginx-ingress-controller
# 注释掉controller处的digest和digestChroot
# 查找kube-webhook,修改此处的image和registry
registry: registry.cn-hangzhou.aliyuncs.com
image: google_containers/kube-webhook-certgen
# 注释掉kube-webhook下面的digest和pullPolicy,再将此处的tag改为和controller处一致的版本。
# 找到hostNetwork
hostNetwork: true
# 找到dnsPolicy
dnsPolicy: ClusterFirstWithHostNet
# 找到DaemonSet,将kind:Deployment修改为DaemonSet
# 将DaemonSet下面的nodeSelector添加一行
ingress: "true"
# 找到admissionWebhooks
admissionWebhooks.enabled 改为false
# 找到service中的tyep:LoadBalancer
type:ClusterIP
(3)安装ingress-nginx
。
# 为 ingress 专门创建一个 namespace
kubectl create ns ingress-nginx
# 为需要部署 ingress 的节点上加标签
kubectl label node node1 ingress=true
# 安装 ingress-nginx
helm install ingress-nginx ./ingress-nginx -n ingress-nginx
# 查看ingress-nginx是否安装成功
kubectl get po -n ingress-nginx -o wide
2.ingress配置文件
apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:
name: wolfcode-nginx-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules: # ingress 规则配置,可以配置多个
- host: k8s.jiegeng.cn # 域名配置,可以使用通配符 *
http:
paths: # 相当于 nginx 的 location 配置,可以配置多个
- pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
backend:
service:
name: nginx-svc # 代理到哪个 service
port:
number: 80 # service 的端口
path: /api # 等价于 nginx 中的 location 的路径前缀匹配
# 创建ingress
kubectl create xxxx(yaml文件名称)
3.ingress的测试
(1)当创建好ingress
后,去C:\Windows\System32\drivers\etc
,找到host
文件,然后将部署了ingress-nginx
的节点的IP
地址写入host
,并在其后加入ingress
配置文件中的域名,本文这里为k8s.jiegeng.cn
,如下图所示。(这里如果电脑修改不了C
盘的配置文件可以去网上找资料查看)。
(2)进行测试,在网页搜索框中输入k8s.jiegeng.cn
,就可以跳转到Nginx
的主页了,如下图所示。
4.ingress的多域名配置
(1)其配置文件如下,其操作和上文中单域名的操作一样。
apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:
name: wolfcode-nginx-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules: # ingress 规则配置,可以配置多个
- host: k8s.jiegeng.cn # 域名配置,可以使用通配符 *
http:
paths: # 相当于 nginx 的 location 配置,可以配置多个
- pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
backend:
service:
name: nginx-svc # 代理到哪个 service
port:
number: 80 # service 的端口
path: /api # 等价于 nginx 中的 location 的路径前缀匹配
- pathType: Exec # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配>,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
backend:
service:
name: nginx-svc # 代理到哪个 service
port:
number: 80 # service 的端口
path: /
- host: api.jiegeng1.cn # 域名配置,可以使用通配符 *
http:
paths: # 相当于 nginx 的 location 配置,可以配置多个
- pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配>,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
backend:
service:
name: nginx-svc # 代理到哪个 service
port:
number: 80 # service 的端口
path: /
总结
(1)service
主要主要用于集群内部的服务发现和访问。文章来源:https://www.toymoban.com/news/detail-827562.html
(2)Ingress
主要用于管理集群外部的HTTP
和HTTPS
流量的路由。文章来源地址https://www.toymoban.com/news/detail-827562.html
到了这里,关于k8s-service和Ingress学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!