kubernetes中跨namespace的服务调用 & 外部服务调用 & host配置

/etc# cat resolv.conf
nameserver 10.96.0.10
search *****.svc.cluster.local svc.cluster.local cluster.local chn.gbl
options ndots:5

方式一(集群内的服务调用)

集群内不同namespace中的调用

http://[serviceName][*****.svc.cluster.local]
[*****.svc.cluster.local]:通过进入pods的etc目录查看

 查看方式:

PS D:*****jsx>kubectl exec -ti msap-****-deployment-764565cb79-9bt26 /bin/bash -n msap-alpha
root@msap-****-deployment-764565cb79-9bt26:/app# nslookup msap-***
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   msap-***.msap-alpha.svc.cluster.local
Address: 10.106.234.33

root@msap-****-deployment-764565cb79-9bt26:/app#

  

官网解释:https://kubernetes.io/docs/tasks/administer-cluster/namespaces/

Understanding namespaces and DNS

When you create a Service, it creates a corresponding DNS entry. This entry is of the form <service-name>.<namespace-name>.svc.cluster.local, which means that if a container just uses <service-name> it will resolve to the service which is local to a namespace. This is useful for using the same configuration across multiple namespaces such as Development, Staging and Production. If you want to reach across namespaces, you need to use the fully qualified domain name (FQDN).

方式二(添加服务,充当host重定向 & 添加ingress外部可访问)

官网介绍:https://kubernetes.io/docs/concepts/services-networking/service/#externalname

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
  name: mail-api
  namespace: test
spec:
  externalName: 172.16.10.39
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  sessionAffinity: None
  type: ExternalName
status:
  loadBalancer: {}

Type ExternalName(服务-ip||域名的映射关系,相当于window的host文件的ip-域名映射关系)

Services of type ExternalName map a Service to a DNS(域名系统(服务)协议(DNS)) name, not to a typical selector such as my-service or cassandra. You specify these Services with the spec.externalName parameter.

This Service definition, for example, maps the my-service Service in the prod namespace to my.database.example.com:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: prod
spec:
  type: ExternalName
  externalName: my.database.example.com

  

Note: ExternalName accepts an IPv4 address string, but as a DNS names comprised of digits, not as an IP address. ExternalNames that resemble IPv4 addresses are not resolved by CoreDNS or ingress-nginx because ExternalName is intended to specify a canonical DNS name. To hardcode an IP address, consider using headless Services.

When looking up the host my-service.prod.svc.cluster.local, the cluster DNS Service returns a CNAME record with the value my.database.example.com.

Accessing my-service works in the same way as other Services but with the crucial difference that redirection happens at the DNS level rather than via proxying or forwarding. Should you later decide to move your database into your cluster, you can start its Pods, add appropriate selectors or endpoints, and change the Service’s type.

Warning:

You may have trouble using ExternalName for some common protocols, including HTTP and HTTPS. If you use ExternalName then the hostname used by clients inside your cluster is different from the name that the ExternalName references.

For protocols that use hostnames this difference may lead to errors or unexpected responses. HTTP requests will have a Host: header that the origin server does not recognize; TLS(安全传输层协议(TLS)) servers will not be able to provide a certificate matching the hostname that the client connected to.

Note: This section is indebted to the Kubernetes Tips - Part 1 blog post from Alen Komljen.

External IPs(跨cluster,服务暴露)

If there are external IPs that route to one or more cluster nodes, Kubernetes Services can be exposed on those externalIPs.

Traffic that ingresses into the cluster with the external IP (as destination IP), on the Service port, will be routed to one of the Service endpoints. externalIPs are not managed by Kubernetes and are the responsibility of the cluster administrator.

In the Service spec, externalIPs can be specified along with any of the ServiceTypes. In the example below, “my-service” can be accessed by clients on “80.11.12.10:80” (externalIP:port)

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376
  externalIPs:
    - 80.11.12.10

  

方式三:修改pods上的host配置(通过修改pod 的yaml)

官方介绍:https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/

apiVersion: v1
kind: Pod
metadata:
  name: hostaliases-pod
spec:
  restartPolicy: Never
  hostAliases:
  - ip: "127.0.0.1"
    hostnames:
    - "foo.local"
    - "bar.local"
  - ip: "10.1.2.3"
    hostnames:
    - "foo.remote"
    - "bar.remote"
  containers:
  - name: cat-hosts
    image: busybox
    command:
    - cat
    args:
    - "/etc/hosts"

进入pods内部查看host配置:

root@*****-deployment-77fc8b4645-xmqkk:# cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters

# Entries added by HostAliases.
127.0.0.1	foo.local	bar.local
10.1.2.3	foo.remote	bar.remote

 

通过pods创建日志,查看host添加情况 

kubectl logs [podName]
原文地址:https://www.cnblogs.com/panpanwelcome/p/12769742.html