1、场景1
选择器(selector)
在k8s上运行了两个pod(replicas: 2),我们通过Service来整合这两个pod。在创建 Service 时,就要通过选择器(selector)来获取符合条件的 Pod 进行整合。同过Service整合不仅能成功访问,而且还提供了负载均衡的功能。
step1:创建两个pod
apiVersion: v1
kind: Service
metadata:
# Service 实例名称
name: svc-echoserver
spec:
ports:
- protocol: TCP
# Service 端口地址
port: 8080
# Pod 端口地址
targetPort: 80
selector:
# 匹配符合标签条件的 Pod
app: echoserver
step2:创建 Service 时,通过选择器(selector)来获取符合条件的 Pod 进行整合。
apiVersion: v1
kind: Service
metadata:
# Service 实例名称
name: svc-echoserver
spec:
ports:
- protocol: TCP
# Service 端口地址
port: 8080
# Pod 端口地址
targetPort: 80
selector:
# 匹配符合标签条件的 Pod
app: echoserver
虽然Service解决了Pod的服务发现和负载均衡问题,但存在着类似的问题:不提前知道Service的IP,还是需要改程序或配置啊。看到这里有没有感觉身体被掏空?
2、场景2
环境变量(老方法)
我们知道通过 Service 生成的 ClusterIP(VIP)来访问 Pod 提供的服务,例如:
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 148d
ngnix ClusterIP 10.108.9.138 <none> 8080/TCP 91d
[root@master ~]# curl 10.108.9.138:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
在之前的版本中(即老版本的做法),Kubernetes 采用了环境变量的方法,每个 Pod 启动的时候,会通过环境变量设置所有服务的 IP 和 port 信息,这样 Pod 中的应用可以通过读取环境变量来获取依赖服务的地址信息,这种方法使用起来相对简单,但是有一个很大的问题就是依赖的服务必须在 Pod 启动之前就存在,不然是不会被注入到环境变量中的。
查看环境变量:
# kubectl exec nginx-deployment-5489c599c4-cgp79 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=nginx-deployment-5489c599c4-cgp79
KUBERNETES_PORT_443_TCP_PORT=443
NGNIX_PORT_8080_TCP=tcp://10.108.9.138:8080
NGNIX_PORT_8080_TCP_PROTO=tcp
NGNIX_PORT_8080_TCP_ADDR=10.108.9.138
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
NGNIX_SERVICE_PORT=8080
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_PORT_443_TCP_PROTO=tcp
NGNIX_SERVICE_HOST=10.108.9.138
NGNIX_PORT=tcp://10.108.9.138:8080
NGNIX_PORT_8080_TCP_PORT=8080
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
NGINX_VERSION=1.12.2-1~stretch
NJS_VERSION=1.12.2.0.1.14-1~stretch
HOME=/root
进入容器内部检查是不是有这个环境变量
# kubectl exec -it nginx-deployment-5489c599c4-cgp79 /bin/bash
root@nginx-deployment-5489c599c4-cgp79:/# echo $KUBERNETES_SERVICE_HOST
10.96.0.1
我们来看创建的 nginx-service 这个服务,有 HOST、PORT、PROTO、ADDR 等,也包括其他已经存在的 Service 的环境变量,现在如果我们需要在这个 Pod 里面访问 nginx-service 的服务,我们是不是可以直接通过 NGINX_SERVICE_SERVICE_HOST 和 NGINX_SERVICE_SERVICE_PORT 就可以了,但是我们也知道如果这个 Pod 启动起来的时候如果 nginx-service 服务还没启动起来,在环境变量中我们是无法获取到这些信息的,当然我们可以通过 initContainer 之类的方法来确保 nginx-service 启动后再启动 Pod,但是这种方法毕竟增加了 Pod 启动的复杂性,所以这不是最优的方法。
3、场景3
kube-dns或CoreDns
3.1 kube-dns
kube-dns安装好了之后(安装方法自行baidu),怎么在一个pod(例如:curl-util)里面访问另外一个服务(例如:服务名称为my-nginx)呢?其实很简单,如下:
-------------------------------------------------------------------------------------------------------------------------------------------------
3.2 core-dns
安装新版本k8s,coredns已经成为默认dns了。之前是kube-dns。coredns是一个灵活,可扩展的DNS服务器,可以作为Kubernetes集群DNS。与Kubernetes一样,CoreDNS项目由CNCF主持。但是在实际使用中,需要一些注意的地方。
验证方法同kube-dns(待验证)...
4、场景4
NodePort
对外暴露服务:此处无须多言:NodePort
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)