kubernetes + istio进行流量管理

实验目的:

本文介绍如何通过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.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 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           CentOS Linux 7 (Core)   3.10.0-957.el7.x86_64   docker://18.6.1
node/k8s-node     NotReady      2d14h   v1.14.0   10.211.55.7           CentOS Linux 7 (Core)   3.10.0-957.el7.x86_64   docker://18.6.1

NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
pod/qf-test-nginx-45k8x   1/1     Running   0          15h   10.244.0.21   k8s-master              
pod/qf-test-nginx-k97vc   1/1     Running   0          15h   10.244.10.4   k8s-node                

NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE     SELECTOR
service/kubernetes      ClusterIP   10.96.0.1              443/TCP        2d17h   
service/qf-test-nginx   NodePort    10.98.49.158           80:31412/TCP   15h     app=nginx

 

安装istio

#下载istio
curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.1.1 sh -
#进入到istio目录
cd istio-1.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                  1/1     Running     0          11h
istio-citadel-848f4c8489-s4bm9            1/1     Running     0          11h
istio-cleanup-secrets-1.1.1-4zd5w         0/1     Completed   0          12h
istio-egressgateway-7469db8c68-jlr9b      1/1     Running     0          12h
istio-galley-86bcf86779-858jv             1/1     Running     0          12h
istio-grafana-post-install-1.1.1-t7qqg    0/1     Completed   0          12h
istio-ingressgateway-56bbdd69bf-j7swp     1/1     Running     0          12h
istio-pilot-77b99c499-xxhfk               2/2     Running     1          12h
istio-policy-85f58d8775-wd8wm             2/2     Running     6          12h
istio-security-post-install-1.1.1-nfhb8   0/1     Completed   0          12h
istio-sidecar-injector-5464f674c4-rcvpk   1/1     Running     0          12h
istio-telemetry-9b844886f-h9rzd           2/2     Running     6          12h
istio-tracing-7f5d8c5d98-s72nv            1/1     Running     0          12h
kiali-589d55b4db-vljzq                    1/1     Running     0          12h
prometheus-878999949-qntkc                1/1     Running     0          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: 80


---
apiVersion: v1
kind: Service
metadata:
  name: qf-test-nginx
  namespace: default
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    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   1         1         1       1            1                     16h   nginx        qingfenglian/test_nginx   app=nginx

NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
pod/qf-test-nginx-45k8x   1/1     Running   0          16h   10.244.0.21   k8s-master              
pod/qf-test-nginx-k97vc   1/1     Running   0          16h   10.244.10.4   k8s-node                

NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE     SELECTOR
service/kubernetes      ClusterIP   10.96.0.1              443/TCP        2d18h   
service/qf-test-nginx   NodePort    10.98.49.158           80:31412/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           CentOS Linux 7 (Core)   3.10.0-957.el7.x86_64   docker://18.6.1
node/k8s-node     NotReady      2d15h   v1.14.0   10.211.55.7           CentOS Linux 7 (Core)   3.10.0-957.el7.x86_64   docker://18.6.1

创建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: 80
      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.1
        imagePullPolicy: IfNotPresent
        name: istio-proxy
        ports:
        - containerPort: 80
          hostPort: 80                ------------######## 这里增加这一行
          protocol: TCP
        - containerPort: 443
          hostPort: 443          ------------######## 这里增加一行
          protocol: TCP
        - containerPort: 31400
          protocol: TCP
        - containerPort: 15029
          protocol: TCP
        - containerPort: 15030
          protocol: TCP
        - containerPort: 15031
          protocol: TCP
        - containerPort: 15032
          protocol: TCP
        - containerPort: 15443
          protocol: TCP
        - containerPort: 15020
          protocol: TCP
        - containerPort: 15090
          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): 56 data bytes
64 bytes from 10.211.55.6: icmp_seq=0 ttl=64 time=0.194 ms
64 bytes from 10.211.55.6: icmp_seq=1 ttl=64 time=0.160 ms
^C
--- nginx.local.com ping statistics ---
2 packets transmitted, 2 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



Welcome to nginx!



Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to "http://nginx.org/">nginx.org.
Commercial support is available at "http://nginx.com/">nginx.com.

Thank you for using nginx.

qingfeng.lian

------------------------------------------------------------ ~ »

让我们来看一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
[2019-04-05T03:03:45.837Z] "GET / HTTP/1.1" 304 - "-" 0 0 0 0 "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|80||qf-test-nginx.default.svc.cluster.local - 10.244.0.39:80 10.211.55.2:57799 -
[2019-04-05T03:03:54.526Z] "GET / HTTP/1.1" 304 - "-" 0 0 0 0 "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|80||qf-test-nginx.default.svc.cluster.local - 10.244.0.39:80 10.211.55.2:57799 -
[2019-04-05T03:12:37.524Z] "GET / HTTP/1.1" 200 - "-" 0 642 2 0 "10.211.55.2" "curl/7.54.0" "2c51476c-79bf-9969-82a1-588b69e50fa6" "nginx.local.com" "10.244.0.21:80" outbound|80||qf-test-nginx.default.svc.cluster.local - 10.244.0.39:80 10.211.55.2:57877 -

我们再做一个实验 现在吧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           CentOS Linux 7 (Core)   3.10.0-957.el7.x86_64   docker://18.6.1
node/k8s-node     Ready       2d16h   v1.14.0   10.211.55.7           CentOS Linux 7 (Core)   3.10.0-957.el7.x86_64   docker://18.6.1

NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE     SELECTOR
service/kubernetes      ClusterIP   10.96.0.1              443/TCP        2d19h   
service/qf-test-nginx   NodePort    10.98.49.158           80:31412/TCP   18h     app=nginx

NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
pod/qf-test-nginx-45k8x   1/1     Running   0          18h   10.244.0.21   k8s-master              
pod/qf-test-nginx-k97vc   1/1     Running   0          18h   10.244.10.4   k8s-node                
[root@k8s-master testnginx]#

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

[2019-04-10T01:31:52.547Z] "GET / HTTP/1.1" 200 - "-" 0 642 2 0 "10.211.55.2" "curl/7.54.0" "2c3f9423-d05d-94fa-a5cf-9476f16aeb0e" "nginx.local.com" "10.244.0.21:80" outbound|80||qf-test-nginx.default.svc.cluster.local - 10.244.0.39:80 10.211.55.2:58525 -
[2019-04-10T01:31:54.426Z] "GET / HTTP/1.1" 200 - "-" 0 612 2 0 "10.211.55.2" "curl/7.54.0" "5428cb78-4456-910f-bba0-2a76188a3bf3" "nginx.local.com" "10.244.10.4:80" outbound|80||qf-test-nginx.default.svc.cluster.local - 10.244.0.39:80 10.211.55.2:58526 -
[2019-04-10T01:31:55.772Z] "GET / HTTP/1.1" 200 - "-" 0 642 0 0 "10.211.55.2" "curl/7.54.0" "d9213d72-e508-951e-b2ea-1c1a106638b8" "nginx.local.com" "10.244.0.21:80" outbound|80||qf-test-nginx.default.svc.cluster.local - 10.244.0.39:80 10.211.55.2:58527 -
[2019-04-10T01:31:58.441Z] "GET / HTTP/1.1" 200 - "-" 0 612 1 1 "10.211.55.2" "curl/7.54.0" "8f44729b-46c9-9b90-8903-48adbfcb547c" "nginx.local.com" "10.244.10.4:80" outbound|80||qf-test-nginx.default.svc.cluster.local - 10.244.0.39:80 10.211.55.2:58528 -

 

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

本次实验需要注意的就是 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/

 

转载于:https://www.cnblogs.com/qingfeng2010/p/10658160.html

你可能感兴趣的:(kubernetes + istio进行流量管理)