k8s把集群服务暴露给外部有三种方式:

1.service设置为NodePort类型

集群内的每个节点都会暴露相同的端口,将访问这一节点的这一端口的请求转发给后端pod处理。
在这里插入图片描述
可见,你访问node1:31203,node2:31203还是node3:31203,都被转发到同一service的一组后端pod进行处理。因此会浪费很多端口,一般使用ingress进行服务暴露。
我们起了一个nodeport类型的service:

➜  service kubectl get services nginx-service
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
nginx-service   NodePort   10.254.98.39   <none>        5000:31203/TCP   21m

随意找一台node访问其31203端口,是可以访问的:

➜  service curl 10.206.105.201:31203
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

此外,nodeport方式兼容clusterip访问方式,你仍然可以使用上一篇文章中的clusterip:port进行访问,不过这需要你在集群内部进行访问,登陆到node或者pod里进行访问,本机只是利用kubeconfig连接了集群并不算在集群内部。

2. service设置为LoadBalance类型

此种方式将一个ip的所有流量都转发到这个service上,需要相关服务商,每个LoadBalancer比较贵,小编没有机会实践,此方式也兼容nodeport访问方式(那也就可以用cluster:port访问)
在这里插入图片描述

3. Ingress

需要集群装有ingress-controller才能使用ingress,Ingress 控制器有各种类型,我用nginx-ingress-controller来说明
ingress是七层调度,可根据路径规则转发多个service,ingress-controller感知ingress变化,将新的规则加入到ingress-nginx的pod中,并reload,使其生效
在这里插入图片描述部署ingress:
相关yaml文件避免篇幅过长已上传到github

  1. 生成后端pod以及service
kubectl apply -f https://github.com/DoubleBabylol/k8s-yaml/blob/master/service.yaml
  1. 生成ingress
kubectl apply -f https://github.com/DoubleBabylol/k8s-yaml/blob/master/ingress.yaml
#查看ingress
➜  service kubectl get ingress ingress-ding
NAME           HOSTS           ADDRESS   PORTS     AGE
ingress-ding   test.ding.com             80, 443   12h
  1. 找到ingress-nginx 的pod并进入
➜  service kubectl get pod ingress-nginx-6k6qm -o wide
NAME                  READY   STATUS    RESTARTS   AGE    IP               NODE
ingress-nginx-6k6qm   1/1     Running   0          108d   10.206.105.155   docker4008.se.shyc2.qihoo.net

➜ kubectl exec -ti ingress-nginx-6k6qm /bin/sh
# cat nginx.conf
  ## start server test.ding.com
    server {
        server_name test.ding.com ;   //此时ingress规则已经被加载进来了
        listen 80;
        set $proxy_upstream_name "-";
        location / {
            set $namespace      "default";
            set $ingress_name   "ingress-ding";
            set $service_name   "myapp-ding";
            set $service_port   "80";
            set $location_path  "/";
            rewrite_by_lua_block {
                balancer.rewrite()
			·········
 ## end server test.ding.com
  1. 退出容器后,在机器加入此podip的域名解析10.206.105.155
cat /etc/hosts
10.206.105.155 test.ding.com  //加入此条规则
  1. 可以访问了
➜  service curl test.ding.com:80
<html>
..............
</html>

若要使用https ,则从客户端连接到达后端的传输会被加密 (本例为自签名证书)

# openssl genrsa -out tls.key 2048
# openssl req -new -x509 -key tls.key -out tls.crt
证书生成好了,然后把证书转成secret,

kubectl create secret tls ding-ingress-secret --cert=tls.crt --key=tls.key

在ingress.yaml 的spec中添加
  tls:    #添加了tls这一段
  - hosts:
    - test.ding.com
    secretName: ding-ingress-secret  #这里结束
 重新apply
# curl https://test.ding.com:80  //就可以访问了
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐