zoukankan      html  css  js  c++  java
  • Kubernetes-Service介绍(二)-服务发现

    前言

    本篇是Kubernetes第九篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战。

    Kubernetes系列文章:
    1. Kubernetes介绍
    2. Kubernetes环境搭建
    3. Kubernetes-kubectl介绍
    4. Kubernetes-Pod介绍(-)
    5. Kubernetes-Pod介绍(二)-生命周期
    6. Kubernetes-Pod介绍(三)-Pod调度
    7. Kubernetes-Pod介绍(四)-Deployment
    8. Kubernetes-Service介绍(一)-基本概念

    服务发现

    Kubernetes提供两种客户端以固定方式获取后端访问地址的方式:环境变量和DNS方式。

    环境变量

    该实验以上文中的nginx-deployment.yaml和nginx-service.yaml为基础;

    1. 新建一个Pod资源,文件名为nginx-pod.yaml;
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-deployment
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
          - containerPort: 80
    1. 启动该资源;
    kubectl apply -f nginx-pod.yaml
    1. 进入容器内部,查看系统的环境变量;
    #进入容器内部
    kubectl exec -it nginx-deployment -- /bin/bash
    #查看环境变量
    env | grep NGINX
    image.png
    image.png
    1. 通过环境变量访问服务信息;
    curl http://${NGINX_SERVICE_SERVICE_HOST}
    image.png
    image.png
    DNS方式
    1. 通过DNS解析方式在容器内部访问;
    curl http://nginx-service.default.svc.cluster.local
    image.png
    image.png

    相比于环境变量来说,DNS域名格式的Service名称提供的稳定、不变的访问地址,可以简化客户端的应用配置,是Kubernetes推荐的方式。当Service以DNS形式进行访问的时候,需要在集群中存在一个DNS服务器来完成域名到ClusterIP的地址解析工作,kubeadm在初始化的时候已经完kube-dns的安装,这个里要注意一个问题,就是使用busybox解析Service时候,最新版本是有问题的,我采用了1.28.3版本,对于服务中心中是否安装kube-dns可以通过以下方式检查:

    #检查deployment
    kubectl get deployment --namespace=kube-system
    #检查service
    kubectl get services --namespace=kube-system

    Service在Kubernetes中遵守DNS命名规范,Service的DNS域名表示方法为servicename.namespace.svc.clusterdomain,其中servicename为服务名称,namespace为所在的名空间,clusterdomain为Kubernetes中集群设置的域名后缀,此外如果Service定义中设置了名称,该端口会拥有一个DNS域名,在DNS服务器中保存格式为:_portname._protocol.servicename.namespace.svc.clusterdomain,其值为端口号的数值。

    img
    img

    Pod的DNS相关特征

    Pod作为集群中提供服务的实体,也可以设置DNS域名,Kubernetes为Pod使用的DNS策略提供很多种方式。

    Pod的DNS

    对于Pod来说,Kubernetes会为其设置一个pod-ip.namespace.pod.cluster-domain格式的DNS域名,其中Pod的IP需要使用-替换.,我们通过nslookup来证明一下;

    1. 查看Pod的IP信息,我们使用niginx-deployment的Pod为案例;
    kubectl get pod -o wide
    image.png
    image.png
    1. 使用nslookup进行验证;
    kubectl exec busybox -- nslookup 10-100-1-103.default.pod.cluster.local
    image.png
    image.png

    对于Deployment和Daement类型的创建的Pod来说,Kubernetes会为每个Pod设置一个DNS域名,格式为pod-ip.deployment-name/daement-name.namespace.svc.cluster-domain,Pod的IP也需要使用-替换.

    为Pod设置hostname和subdomain

    当前,创建Pod时其主机名取自Pod的metadata.name,在定义Pod的yaml文件中包含一个可选的 hostname 字段,可以用来指定Pod的主机名。 当这个字段被设置时,它将优先于Pod的名字成为该 Pod 的主机名。此外还有一个字段subdomain 字段,可以用来指定 Pod的子域名。

    1. 删除所有Pod;
    kubectl delete -f nginx-pod.yaml
    1. 创建busybox-headless-service.yaml文件,这里Headless Service与Pod子域名保持一致,这样子DNS服务器才会自动创建响应的DNS记录;
    apiVersion: v1
    kind: Service
    metadata:
      name: default-subdomain
    spec:
      selector:
        name: busybox
      clusterIP: None
      ports:
      - name: foo # 实际上不需要指定端口号
        port: 1234
        targetPort: 1234
    1. 创建nginx-pod.yaml文件;
    apiVersion: v1
    kind: Pod
    metadata:
      name: busybox1
      labels:
        name: busybox
    spec:
      hostname: busybox-1
      subdomain: default-subdomain
      containers:
      - image: busybox:1.28.3
        command:
          - sleep
          - "3600"
        name: busybox
    1. 创建资源;
    kubectl apply -f busybox-headless-service.yaml
    kubectl apply -f busybox-pod1.yaml
    1. 进入Pod检查DNS是否写入,其他Pod就可以通过busybox-1.default-subdomain.default.svc.cluster.local来访问该Pod;
    kubectl exec -it busybox1 -- /bin/sh
    cat /etc/hosts
    image.png
    image.png
    Pod的DNS策略

    Kubernetes可以通过Pod中dnsPolicy属性指定DNS相关策略,目前支持以下四种策略:

    1. Default: 继承Pod所在的节点的域名解析设置;

    2. ClusterFirst: 优先使用Kubernetes提供的DNS服务(CoreDNS),将无法解析域名转发到系统配置的DNS服务器;

    3. ClusterFirstWithHostNet:适用于以hostNetWork方式运行的Pod;

    4. None:忽略Kubernetes提供的DNS配置,采用自定义的配置方式;

    Pod自定义DNS配置

    Kubernetes可以通过Pod的dnsConfig属性来自定义DNS相关配置,同时必须指定dnsPolicy为None。

    自定义DNS可以在dnsConfig指定以下属性:

    nameservers: 用于域名解析DNS服务列表,最多可以设置3个,当 Pod的dnsPolicy设置为none时, 列表必须至少包含一个 IP 地址。配置的nameserver列表与系统自动设置的nameserver自动合并去重;

    searches: 用于域名搜索的DNS域名后缀,最多设置6个,也会与系统自动设置的search列表合并去重;

    options:配置其他可选的DNS参数,以name或者name/value的形式表示,系统也会自动设置option列表合并去重;

    结束

    欢迎大家点点关注,点点赞!

  • 相关阅读:
    kibana操作
    git使用入门
    ES增删改查
    MySQL&ES连接池
    java递归生成树结构的数据
    lambda新特性,对两组集合中相同的数据去重
    java8新特性 LocalDateTime,LocalDate ,LocalTime 使用,Period 获取时间差
    photoshop安装包
    java自定义异常及异常的抛出
    git回滚到任意版本
  • 原文地址:https://www.cnblogs.com/wtzbk/p/15414326.html
Copyright © 2011-2022 走看看