k8s-service和Ingress学习

文章详细介绍了Kubernetes中的Service和Ingress,Service用于内部服务共享,Ingress负责外部服务发现。讲解了Service的不同类型(如NodePort、ClusterIP和ExternalName),以及如何配置Ingress来实现外部域名访问和服务路由。
摘要由CSDN通过智能技术生成

K8s服务发现

(1)其中主要包含serviceIngress两部分,其中service主要做内部服务的共享,Ingress主要做外部服务的发现。

k8s-service学习

(1)首先看一下service的网络结构图。

  • 首先部署了2个nginx服务,分别部署在node1node2节点上。
  • 起一个可以访问node1node2节点上的nginxservice服务。
  • 首先通过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)首先要安装HelmHelm就是像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主要主要用于集群内部的服务发现和访问。

(2)Ingress主要用于管理集群外部的HTTPHTTPS流量的路由。

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值