实验目的:

本文介绍如何通过istio实现域名访问k8s部署的nginx服务

前提:

  已经安装了kubernetes的服务器

了解 kubernetes 基本命令如何使用 (kubectl create/delete/get/apply 等基本命令)

注意文章红色加粗字体

能上网(^_^)

tip:  kubernetes安装参考:centos7 使用kubeadm 快速部署 kubernetes 国内源

实验环境:

[root@k8s-master ~]# uname -a
Linux k8s-master 3.10.-.el7.x86_64 # SMP Thu Nov :: UTC x86_64 x86_64 x86_64 GNU/Linux
[root@k8s-master ~]# kubectl get node,pod,svc -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
node/k8s-master Ready master 2d17h v1.14.0 10.211.55.6 <none> CentOS Linux (Core) 3.10.-.el7.x86_64 docker://18.6.1
node/k8s-node NotReady <none> 2d14h v1.14.0 10.211.55.7 <none> CentOS Linux (Core) 3.10.-.el7.x86_64 docker://18.6.1 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/qf-test-nginx-45k8x / Running 15h 10.244.0.21 k8s-master <none> <none>
pod/qf-test-nginx-k97vc / Running 15h 10.244.10.4 k8s-node <none> <none> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> /TCP 2d17h <none>
service/qf-test-nginx NodePort 10.98.49.158 <none> :/TCP 15h app=nginx

安装istio

#下载istio
curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.1. sh -
#进入到istio目录
cd istio-1.1. #修改 ~/.bash_profile 添加下面内容 导入istio
#如果用的是 zsh 修改 ~/.zhsrc export PATH="$PATH:/root/k8s/istio-1.1.1/bin"

在kubernetes使用istio : istio需要的docker镜像都需要在docker.io上拉取,所以可能会有一些慢,稍作等待 or 睡一觉之后再看

for i in install/kubernetes/helm/istio-init/files/crd*yaml; do kubectl apply -f $i; done

#我们这里使用的是宽容模式,要使用严禁模式看文章最后的参考文档
kubectl apply -f install/kubernetes/istio-demo.yaml #确认下列 Kubernetes 服务已经部署并都具有各自的 CLUSTER-IP
kubectl get svc -n istio-system #确认必要的 Kubernetes Pod 都已经创建并且其 STATUS 的值是 Running
kubectl get pods -n istio-system

部署完成后我们看一下 istio 相关Pod 状态

[root@k8s-master ~]# kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-7b9f5d484f-mf28j / Running 11h
istio-citadel-848f4c8489-s4bm9 / Running 11h
istio-cleanup-secrets-1.1.-4zd5w / Completed 12h
istio-egressgateway-7469db8c68-jlr9b / Running 12h
istio-galley-86bcf86779-858jv / Running 12h
istio-grafana-post-install-1.1.-t7qqg / Completed 12h
istio-ingressgateway-56bbdd69bf-j7swp / Running 12h
istio-pilot-77b99c499-xxhfk / Running 12h
istio-policy-85f58d8775-wd8wm / Running 12h
istio-security-post-install-1.1.-nfhb8 / Completed 12h
istio-sidecar-injector-5464f674c4-rcvpk / Running 12h
istio-telemetry-9b844886f-h9rzd / Running 12h
istio-tracing-7f5d8c5d98-s72nv / Running 12h
kiali-589d55b4db-vljzq / Running 12h
prometheus--qntkc / Running 12h

部署应用 添加gateway 和 virtualservice

先来看一下kubernetes的部署文件

[root@k8s-master testnginx]# cat nginx-daemonset.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: qf-test-nginx
spec:
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: qingfenglian/test_nginx
ports:
- containerPort: ---
apiVersion: v1
kind: Service
metadata:
name: qf-test-nginx
namespace: default
spec:
type: NodePort
selector:
app: nginx
ports:
- port:
targetPort:
name: http

用上面的yaml文件部署成功后看一下 daemonset, pod,svc,node 信息,

tip:: 实验环境中本身是有两个node,有一个node是NotReady,原因是k8s-node这台机器属于关机(^_^)状态,后面我会启动,不要捉急

[root@k8s-master ~]# kubectl get daemonset,pod,svc,node -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
daemonset.extensions/qf-test-nginx <none> 16h nginx qingfenglian/test_nginx app=nginx NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/qf-test-nginx-45k8x / Running 16h 10.244.0.21 k8s-master <none> <none>
pod/qf-test-nginx-k97vc / Running 16h 10.244.10.4 k8s-node <none> <none> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> /TCP 2d18h <none>
service/qf-test-nginx NodePort 10.98.49.158 <none> :/TCP 16h app=nginx NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
node/k8s-master Ready master 2d18h v1.14.0 10.211.55.6 <none> CentOS Linux (Core) 3.10.-.el7.x86_64 docker://18.6.
node/k8s-node NotReady <none> 2d15h v1.14.0 10.211.55.7 <none> CentOS Linux (Core) 3.10.-.el7.x86_64 docker://18.6.

创建gateway

#查看gateway内容
[root@k8s-master testnginx]# cat qingfeng-deve-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: qingfeng-deve
spec:
selector:
istio: ingressgateway # 使用 istio 默认的 ingress gateway
servers:
- port:
number:
name: http
protocol: HTTP
hosts:
- "*" #创建gateway
[root@k8s-master testnginx]# kubectl create -f <(istioctl kube-inject -f qingfeng-deve-gateway.yaml)
gateway.networking.istio.io/qingfeng-deve created #查看结果
[root@k8s-master testnginx]# kubectl get gateway
NAME AGE
qingfeng-deve 12s
[root@k8s-master testnginx]#

创建virtualservice

注意::本文nginx服务命名空间是default ,如果是其他命名空间的服务 需要这样写 格式 "serviceName.namespaceName.svc.cluster.local" 例 "qf-test-nginx.default.svc.cluster.local"

解释::  serviceName.namespaceName.svc.cluster.local     :: serviceName=k8s的service名称 ; namespaceName=service服务所在的命名空间; .svc.cluster.local 这个是固定的不变

[root@k8s-master testnginx]# cat nginx-virutalservice.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: vs-nginx
spec:
hosts:
- "nginx.local.com"
gateways:
- qingfeng-deve
http:
- match:
- uri:
prefix: /
route:
- destination:
host: qf-test-nginx
[root@k8s-master testnginx]# kubectl create -f <(istioctl kube-inject -f nginx-virutalservice.yaml)
virtualservice.networking.istio.io/vs-nginx created
[root@k8s-master testnginx]#

修改 istio-ingressgateway

kubectl -n istio-system edit deployment istio-ingressgateway

找到下面内容,并做修改

将 80 端口和 443 端口配置为 hostPort 模式,

等待几秒让 istio-ingressgateway 重新调度

image: docker.io/istio/proxyv2:1.1.
imagePullPolicy: IfNotPresent
name: istio-proxy
ports:
- containerPort:
hostPort: 80 ------------######## 这里增加这一行
protocol: TCP
- containerPort:
hostPort: 443         ------------######## 这里增加一行
protocol: TCP
- containerPort:
protocol: TCP
- containerPort:
protocol: TCP
- containerPort:
protocol: TCP
- containerPort:
protocol: TCP
- containerPort:
protocol: TCP
- containerPort:
protocol: TCP
- containerPort:
protocol: TCP
- containerPort:
name: http-envoy-prom
protocol: TCP

验证结果

host绑定::由于我的域名是 nginx.local.com  没有域名解析,所以需要在host里面添加一条记录

绑定host之后通过浏览器访问  nginx.local.com 查看返回信息,,我是为了偷懒 所以用curl 请求

先 ping 一下看看 host绑定是否生效,,然后用curl 请求

~ » ping nginx.local.com                                                                                                                                          lianqingfeng@bogon
PING nginx.local.com (10.211.55.6): data bytes
bytes from 10.211.55.6: icmp_seq= ttl= time=0.194 ms
bytes from 10.211.55.6: icmp_seq= ttl= time=0.160 ms
^C
--- nginx.local.com ping statistics ---
packets transmitted, packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.160/0.177/0.194/0.017 ms
------------------------------------------------------------
~ » curl nginx.local.com lianqingfeng@bogon
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 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>
<p><em>qingfeng.lian</em></p>
</body>
</html>
------------------------------------------------------------
~ »

让我们来看一istio-ingressgateway的日志, 发现 "10.244.0.21:80"  ,回到文章最上面找找这个ip地址会发现这个是nginx的svc服务ip地址,

还有一点上虽然k8s-node节点上的pod仍然是运行状态,但是注意看返回信息最后面有 "qingfeng.lian" 字样,这说明服务并没有打到 k8s-node节点,因为k8s-node节点上我并没有加这样的输出

[root@k8s-master testnginx]# kubectl logs -f istio-ingressgateway-64fcc46bb-zx6tx -n istio-system --tail=3
[--05T03::.837Z] "GET / HTTP/1.1" - "-" "10.211.55.2" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" "a822ba28-cd5e-9272-a423-7bb051c0dac5" "nginx.local.com" "10.244.0.21:80" outbound|||qf-test-nginx.default.svc.cluster.local - 10.244.0.39: 10.211.55.2: -
[--05T03::.526Z] "GET / HTTP/1.1" - "-" "10.211.55.2" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" "10ab86c0-8716-977a-965a-007fe11129c0" "nginx.local.com" "10.244.0.21:80" outbound|||qf-test-nginx.default.svc.cluster.local - 10.244.0.39: 10.211.55.2: -
[--05T03::.524Z] "GET / HTTP/1.1" - "-" "10.211.55.2" "curl/7.54.0" "2c51476c-79bf-9969-82a1-588b69e50fa6" "nginx.local.com" "10.244.0.21:80" outbound|||qf-test-nginx.default.svc.cluster.local - 10.244.0.39: 10.211.55.2: -

我们再做一个实验 现在吧k8s-node节点启动,(把node节点开机即可(^_^)),现在来看一下node节点状态,发现k8s-node已经就绪,这个基本上是node节点开机成功就会变成Ready ,秒级

这里为了看所有信息 所以我把 node,svc,pod全列出啦,也可以只看node

[root@k8s-master testnginx]# kubectl get node,svc,pod -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
node/k8s-master Ready master 2d19h v1.14.0 10.211.55.6 <none> CentOS Linux (Core) 3.10.-.el7.x86_64 docker://18.6.
node/k8s-node Ready <none> 2d16h v1.14.0 10.211.55.7 <none> CentOS Linux (Core) 3.10.-.el7.x86_64 docker://18.6. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> /TCP 2d19h <none>
service/qf-test-nginx NodePort 10.98.49.158 <none> :/TCP 18h app=nginx NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/qf-test-nginx-45k8x / Running 18h 10.244.0.21 k8s-master <none> <none>
pod/qf-test-nginx-k97vc / Running 18h 10.244.10.4 k8s-node <none> <none>
[root@k8s-master testnginx]#

我们在来发几次curl请求验证一下k8s-node上的pod是否生效, istio-ingressgateway日志 可以看到 请求已经开始打到不同的pod上面

[--10T01::.547Z] "GET / HTTP/1.1"  - "-"     "10.211.55.2" "curl/7.54.0" "2c3f9423-d05d-94fa-a5cf-9476f16aeb0e" "nginx.local.com" "10.244.0.21:80" outbound|||qf-test-nginx.default.svc.cluster.local - 10.244.0.39: 10.211.55.2: -
[--10T01::.426Z] "GET / HTTP/1.1" - "-" "10.211.55.2" "curl/7.54.0" "5428cb78-4456-910f-bba0-2a76188a3bf3" "nginx.local.com" "10.244.10.4:80" outbound|||qf-test-nginx.default.svc.cluster.local - 10.244.0.39: 10.211.55.2: -
[--10T01::.772Z] "GET / HTTP/1.1" - "-" "10.211.55.2" "curl/7.54.0" "d9213d72-e508-951e-b2ea-1c1a106638b8" "nginx.local.com" "10.244.0.21:80" outbound|||qf-test-nginx.default.svc.cluster.local - 10.244.0.39: 10.211.55.2: -
[--10T01::.441Z] "GET / HTTP/1.1" - "-" "10.211.55.2" "curl/7.54.0" "8f44729b-46c9-9b90-8903-48adbfcb547c" "nginx.local.com" "10.244.10.4:80" outbound|||qf-test-nginx.default.svc.cluster.local - 10.244.0.39: 10.211.55.2: -

安装过程中遇到的问题以及报错解决办法

本次实验需要注意的就是 pod的命名空间别弄错了,基本上安装步骤都可以成功。

参考文档:

istio安装 :

https://istio.io/zh/docs/setup/kubernetes/download/

https://istio.io/zh/docs/setup/kubernetes/install/kubernetes/

istio配置:

http://blog.daocloud.io/istio-ingress/

kubernetes + istio进行流量管理的更多相关文章

  1. kubernetes istio之流量管理

    1.部署 Bookinfo 应用 要在 Istio 中运行这一应用,无需对应用自身做出任何改变.我们只要简单的在 Istio 环境中对服务进行配置和运行,具体一点说就是把 Envoy sidecar ...

  2. Istio技术与实践05:如何用istio实现流量管理

    Istio是Google继Kubernetes之后的又一开源力作,主要参与的公司包括Google,IBM,Lyft等,它提供了完整的非侵入式的微服务治理解决方案,解决微服务的管理.网络连接以及安全管理 ...

  3. Istio的流量管理(概念)(istio 系列二)

    Istio的流量管理(概念) 目录 Istio的流量管理(概念) 概述 Virtual services 为什么使用virtual service Virtual services举例 hosts字段 ...

  4. Istio的流量管理(实操一)(istio 系列三)

    Istio的流量管理(实操一)(istio 系列三) 使用官方的Bookinfo应用进行测试.涵盖官方文档Traffic Management章节中的请求路由,故障注入,流量迁移,TCP流量迁移,请求 ...

  5. Istio的流量管理(实操二)(istio 系列四)

    Istio的流量管理(实操二)(istio 系列四) 涵盖官方文档Traffic Management章节中的inrgess部分. 目录 Istio的流量管理(实操二)(istio 系列四) Ingr ...

  6. Istio的流量管理(实操三)

    Istio的流量管理(实操三) 涵盖官方文档Traffic Management章节中的egress部分.其中有一小部分问题(已在下文标注)待官方解决. 目录 Istio的流量管理(实操三) 访问外部 ...

  7. 15分钟在笔记本上搭建 Kubernetes + Istio开发环境

    11月13~15日,KubeCon 上海大会召开,云原生是这个秋天最火热的技术.很多同学来问如何上手 Kubernetes和Istio 服务网格开发.本文将帮助你利用Docker CE桌面版,15分钟 ...

  8. Kubernetes+Istio

    Kubernetes+Istio   微服务.SpringCloud.k8s.Istio杂谈   一.微服务与SOA “微服务”是一个名词,没有这个名词之前也有“微服务”,一个朗朗上口的名词能让大家产 ...

  9. kubernetes istio之gateway

    [root@master istio-]# kubectl apply -f samples/httpbin/httpbin.yaml service/httpbin created deployme ...

随机推荐

  1. RAND函数和SRAND函数

    首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数) 表头文件: #include<stdlib.h&g ...

  2. 影响solr性能的一些因素(附使用经验)

    Solr本身的性能不错,但是在使用过程中,还是会遇到一些使用错误,或是没考虑到的地方:在出现瓶颈时,可以首先考虑哪些点呢?下面就来看一下Solr官方的总结,个人觉得总结的很好.SOLR+LUCENE的 ...

  3. DRF 认证、权限、限制

    DRF 认证.权限.限制   认证: 定义一个用户表和一个保存用户的Token表 # ======================day96======================= class ...

  4. html 常用button事件

    <input onclick="document.all.WebBrowser.ExecWB(1,1)" type="button" value=&quo ...

  5. 逆向工程vgenerator(二)

    前言 接上篇,这一篇主要的工具类和工厂类,包括数据库方法.通用方法,三个工厂. 常量 /** *author vvxtoys *默认xml开头 *文档分隔 *默认方法名 */ package cc.v ...

  6. 【安全测试自学】初探web安全处测试(三)

    安全测试专家成长系列之-初探Web安全3.mp4 案例: 安全测试的前景: 总结讨论:

  7. 消息队列(Message Queue)简介及其使用

    消息队列(Message Queue)简介及其使用 摘要:利用 MSMQ(Microsoft Message Queue),应用程序开发人员可以通过发送和接收消息方便地与应用程序进行快速可靠的通信.消 ...

  8. 详细解说Windows 8.1与Windows 8的区别(Win8.1与Win8区别)

    详细解说Windows 8.1与Windows 8的区别(Win8.1与Win8区别) 本文转自“吾乐吧软件站”,原文链接:http://www.wuleba.com/?p=23082 最近,吾乐吧软 ...

  9. nodeJs 使用 express-http-proxy 转发请求

    开发过程中经常需要用到 nodeJs做转发层 使用express配合 express-http-proxy 可以轻松的完成转发 使用过程: 安装 express-http-proxy npm inst ...

  10. Python module ---- argparse

    argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行参数,程序只需定义好它要求的参数,然后argpars ...