部署Istio,应用接入Istio(Sidecar注入)

网友投稿 270 2022-11-28

部署Istio,应用接入Istio(Sidecar注入)

部署istio

tar zxvf istio-1.8.2-linux.tar.gz cd istio-1.8.2mv bin/istioctl /usr/bin

查看配置文件的名称,生产环境建议使用default,基本上核心功能都有,minimal是以最小版本去部署的,demo功能多一点,比default多一点。我们这里使用default进行部署安装。

下面是查看有哪些配置文件的名称。(istio为我们提供了很多的配置列表,不同的profile安装了不同的组件)

[root@master bin]# ./istioctl profile listIstio configuration profiles: default demo empty minimal openshift preview remote[root@master profiles]# lsdefault.yaml demo.yaml empty.yaml minimal.yaml openshift.yaml preview.yaml PROFILES.md remote.yamlistioctl profile list istioctl profile dump demo istioctl install --set profile=demo istioctl x uninstall --purge

在install不指定profile那么默认就是使用default。安装的时候后面可以添加--set-profile=default -y

部署完查看结果,部署了两个pod,一个istiod,也就是它的控制平面,ingressgateway是用来接受网格流量的,就类似于nginx-ingress。(都是一些核心组件)

service的istiod暴露端口,让数据平面的proxy和它去通信,这个是不需要去对外访问的。

ingressgateway就需要对外访问了,它采用的是loadbalance,它是是用于公有云服务类型,它能够在公有云的负载均衡器上面创建负载均衡出来,由公有云的负载均衡器暴露出来。

我们这里没有公有云的环境,所以这里处于pending的状态,我们只能使用nodeport的方式去访问。

[root@master ~]# kubectl get pods -n istio-systemNAME READY STATUS RESTARTS AGEistio-ingressgateway-5759b6968-nztgj 1/1 Running 0 166mistiod-597dd8db8-b79zn 1/1 Running 0 167m[root@master ~]# kubectl get svc -n istio-systemNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEistio-ingressgateway LoadBalancer 10.233.58.97 15021:31184/TCP,80:30698/TCP,443:31759/TCP,15012:31608/TCP,15443:31314/TCP 166mistiod ClusterIP 10.233.37.152 15010/TCP,15012/TCP,443/TCP,15014/TCP 167m

卸载:

istioctl manifest generate | kubectl delete -f -

安装istio其实会帮我我们创建很多CRD自定义的资源

[root@node1 ~]# kubectl get crdNAME CREATED ATauthorizationpolicies.security.istio.io 2022-07-20T13:15:01Zbgpconfigurations.crd.projectcalico.org 2022-07-19T08:44:10Zbgppeers.crd.projectcalico.org 2022-07-19T08:44:11Zblockaffinities.crd.projectcalico.org 2022-07-19T08:44:11Zclusterinformations.crd.projectcalico.org 2022-07-19T08:44:11Zdestinationrules.networking.istio.io 2022-07-20T13:15:01Z..........................................................................

Sidercar注入

sample目录下是官方给你的案例

[root@master istio-1.8.2]# ls samples/addons certs external helloworld multicluster rawvm security tcp-echobookinfo custom-bootstrap health-check kubernetes-blog operator README.md sleep websockets

sidecar对istio来说是比较重要的,因为它是数据平面的唯一组件,要想让一个应用被istio接管到,就必须将proxy和应用绑定在一块。

sidecar注入方式有两种,一种是手动注入,一种是自动注入。

kubectl label ns ns1 istio-injection=enabled istioctl kube-inject -f pod1.yaml | kubectl apply -f -

手动注入

istioctl kube-inject -f  来为istioctl kube-inject -f - image: docker.io/kennethreitz/ imagePullPolicy: IfNotPresent name: ports: - containerPort: 80

现在多了这个容器,在原有的yaml基础上又了istio的proxy,为这个业务pod做流量的代理。

- name: DNS_AGENT image: docker.io/istio/proxyv2:1.8.2 imagePullPolicy: Always name: istio-proxy ports: - containerPort: 15090[root@node1 ~]# kubectl describe pod Container ID: docker://605755ece1fbc55ccaa69fdbe140fbc3499aed2f52b79d749e7dd38858e26449 Image: docker.io/kennethreitz/ istio-proxy: Container ID: docker://f32ba043e64869c95339f6b60231f17d7ad8e0d2d37290af689c0a94eafc30d7 Image: docker.io/istio/proxyv2:1.8.2

[root@master kubectl apply -f <(istioctl kube-inject -f createddeployment.apps/created[root@master kubectl get pod NAME READY STATUS RESTARTS AGE 2/2 Running 0 104s

istio-proxy@ps -efUID PID PPID C STIME TTY TIME CMDistio-p+ 1 0 0 17:08 ? 00:00:01 /usr/local/bin/pilot-agent proxy sidecar --domain default.svc.clusteristio-p+ 12 1 0 17:08 ? 00:00:02 /usr/local/bin/envoy -c etc/istio/proxy/envoy-rev0.json --restart-epoistio-p+ 27 0 1 17:13 pts/0 00:00:00 bashistio-p+ 37 27 0 17:13 pts/0 00:00:00 ps -ef

这里面跑了agent,这个pilot-agent主要负责envoy的热更新配置,因为envoy是代理的一个程序。

自动注入(给命名空间打指定标签,启用自动注入)

kubectl label namespace default istio-injection=enabled

上面就实现了自动注入并且将应用部署起来了,然后让其在istio里面去访问。你要创建规则,这个规则和nginx规则是一样的。

[root@master cat apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata: name: selector: istio: ingressgateway servers: - port: number: 80 name: protocol: HTTP hosts: - "*"---apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata: name: hosts: - "*" gateways: - - route: - destination: host: #指定service名称 port: number: 8000 #指定service端口[root@node1 cat apiVersion: v1kind: Servicemetadata: name: labels: app: service: type: NodePort ports: - name: port: 8000 targetPort: 80 selector: app: apps/v1kind: Deploymentmetadata: name: replicas: 1 selector: matchLabels: app: version: v1 template: metadata: labels: app: version: v1 spec: containers: - image: docker.io/kennethreitz/ imagePullPolicy: IfNotPresent name: ports: - containerPort: 80[root@master kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE NodePort 10.233.38.15 8000:31339/TCP 37m

[root@master kubectl apply -f gateway.networking.istio.io/createdvirtualservice.networking.istio.io/created

最后访问IngressGateway NodePort访问地址:​​gateway可以访问到它。流程如下。

Istio与K8s集成流程

通过kubectl创建的istio的相关的资源,很多资源不是k8s自身的资源,这些资源以operator的方式部署。

我想知道外面设备如何和网格里的pod进行通信的 ,复习一下ingress-nginx-controller。

nginx控制器其实使用的是宿主机的网络空间,在ns1命名空间里面创建svc1和pod关联上,之后所需要做的就是在该命名空间下面创建ingress规则,凡是访问域名为system至少运行三个pod

istio:第一个也就是istio的控制面板,控制平面,这些组件都是放在istio pod当中运行的。

istio-ingress-gw:处理进来的流量

istio-egress-gw

整个环境分为了两部分,一部分是网格,一部分是非网格。要享受istio带来的福利:

非网格里的设备的流量要进入到网格里去必须要经过istio-ingress-gw

网格里的数据你要进入到非网格里要经过egress

访问a.rhce.cc的时候让其能够访问到ingress-gateway,访问域名要解析到ingress-gateway的IP。

gateway里面规定了和哪个域名关联,并且访问的方式为HTTP还是HTTPS,你在gateway里面创建的规则就会写入到istio这里面来,这个就类似于之前的ingress,ingress规则就会写入ingress-nginx控制器里面去。(也就是将去往某个域名的流量转发到这个gateway里面)

[root@master cat apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata: name: selector: istio: ingressgateway servers: - port: number: 80 name: protocol: HTTP hosts: - "*"

至于流量往哪边走,我们需要定义VirtualService,其实就是定义了一个路由。到底走哪个service并且流量的比例,由virtualservice定义。

至于到底往某个service下面的pod转发那些pod多些,哪些pod少一些,这就需要destionrule,叫做目的规则。

apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata: name: hosts: - "*" gateways: - - route: - destination: host: #指定service名称 port: number: 8000 #指定service端口

destionrule定义了svc往后端pod转发的时候,浏览怎么走,可以定义随机转发,或者持久性连接。

只要同一个客户端访问的,那么九转发到同一个pod,这些都可以在DR这里面定义。

如果并不涉及到集群之外的主机访问,那么gateway是不需要的,但是如果有外面的主机访问,那么就需要有gateway。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Linux 内存管理 页回收和swap机制
下一篇:Spansion为多图像应用提供业界领先性能的双四路串行闪存
相关文章

 发表评论

暂时没有评论,来抢沙发吧~