Resolva o problema de proxy da migração do projeto para o cluster Kubernetes
À medida que a tecnologia Kubernetes amadurece, mais e mais empresas optam por usar os clusters Kubernetes para gerenciar projetos. O novo projeto está bom, você pode escolher o tamanho apropriado do cluster para construí-lo do zero; o projeto antigo precisa considerar vários fatores ao entrar no cluster Kubernetes; afinal, o projeto não pode ser interrompido por muito tempo.
Fonte do problema
Recentemente, ao fazer uma migração de projeto para um cluster Kubernetes, encontrei um problema interessante: como a versão de desenvolvimento do dubbo é muito baixa, ela não está registrada no zookeeper, é necessário desenvolver e atualizar o dobbo e empacotá-lo em um espelho, para migrar primeiro o nodejs Digite o cluster Kubernets. Como parte da empresa é migrada para o cluster Kubernets, é necessário adicionar uma camada de proxy Nginx na frente do traefik (Nginx é a entrada da empresa antiga, o microsserviço por trás do proxy reverso, a slb do Alibaba Cloud aponta para nginx e aguarda até que a empresa seja completamente migrada slb aponta para traefik). Esse tipo de arquitetura é um proxy de duas camadas, a saber Slb-> Nginx-> Traefik-> Service.
Gráfico
Solução:
- O negócio de migrar para o cluster k8s usa Nodeport, Nginx-> Nodeport. O aplicativo de negócios é diretamente o Nodeport, o que não é fácil de gerenciar. Se 10.000 máquinas são usadas, você também não pode usar o Nodeport. Você precisa planejar a porta. Se houver mais máquinas, cada máquina ainda irá expor a porta. Não é realista pensar sobre isso.
- O negócio de migrar para o cluster k8s utiliza o Clusterip, Nginx-> Traefik-> Service. Desta forma é razoável.
Resolver o problema
Você não pode usar o ambiente de produção para escrever postagens no blog. De fato, há uma diferença entre a máquina virtual e a máquina de produção em termos de ambiente de rede.
Análise mental
- Implantar o cluster k8s
- Implantar nginx
- Implantar traefik
- Implantar o aplicativo
- Teste Conjunto de Comissionamento
Implantar o cluster k8s
Use meu método de implantação de postagem no blog anterior: https://www.cnblogs.com/zisefeizhu/p/12505117.html
Implantar nginx
Faça o download dos componentes necessários
# hostname -I
20.0.0.101
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
# uname -a
Linux fuxi-node02-101 4.4.186-1.el7.elrepo.x86_64 #1 SMP Sun Jul 21 04:06:52 EDT 2019 x86_64 x86_64 x86_64 GNU/Linux
# wget http://nginx.org/download/nginx-1.10.2.tar.gz
# wget http://www.openssl.org/source/openssl-fips-2.0.10.tar.gz
# wget http://zlib.net/zlib-1.2.11.tar.gz
# wget https://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gz
# yum install gcc-c++
Software Configure-Compile-Install
# tar zxvf openssl-fips-2.0.10.tar.gz
# cd openssl-fips-2.0.10/
# ./config && make && make install
# cd ..
# ll
tar zxvf pcre-8.40.tar.gz
# cd pcre-8.40/
# ./configure && make && make install
# tar zxvf zlib-1.2.11.tar.gz
# cd zlib-1.2.11/
# ./configure && make && make install
# tar zxvf nginx-1.10.2.tar.gz
# cd nginx-1.10.2/
#./configure --with-http_stub_status_module --prefix=/opt/nginx
# make && make install
Iniciar o Nginx
# pwd
/opt/nginx
# ll
总用量 4
drwx------ 2 nobody root 6 4月 22 11:30 client_body_temp
drwxr-xr-x 2 root root 4096 4月 22 12:53 conf
drwx------ 2 nobody root 6 4月 22 11:30 fastcgi_temp
drwxr-xr-x 2 root root 40 4月 22 11:29 html
drwxr-xr-x 2 root root 41 4月 22 14:24 logs
drwx------ 2 nobody root 6 4月 22 11:30 proxy_temp
drwxr-xr-x 2 root root 19 4月 22 11:29 sbin
drwx------ 2 nobody root 6 4月 22 11:30 scgi_temp
drwx------ 2 nobody root 6 4月 22 11:30 uwsgi_temp
# sbin/nginx
implantação do traefik
https://www.cnblogs.com/zisefeizhu/p/12692979.html
Inspeção ambiental
# kubectl get pods,svc -A | grep traefik
kube-system pod/traefik-ingress-controller-z5qd7 1/1 Running 0 136m
kube-system service/traefik ClusterIP 10.68.251.132 <none> 80/TCP,443/TCP,8080/TCP 4h14m
Acesso ao navegador
Implantar o aplicativo
O aplicativo de teste aqui escolhe a imagem contém / whoami
Testar a implantação de aplicativos
# cat whoami.yaml
##########################################################################
#Author: zisefeizhu
#QQ: 2********0
#Date: 2020-04-22
#FileName: whoami.yaml
#URL: https://www.cnblogs.com/zisefeizhu/
#Description: The test script
#Copyright (C): 2020 All rights reserved
###########################################################################
apiVersion: v1
kind: Service
metadata:
name: whoami
spec:
ports:
- protocol: TCP
name: web
port: 80
selector:
app: whoami
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: whoami
labels:
app: whoami
spec:
replicas: 2
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: containous/whoami
ports:
- name: web
containerPort: 80
# kubectl get svc,pod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/whoami ClusterIP 10.68.109.151 <none> 80/TCP 3h30m
NAME READY STATUS RESTARTS AGE
pod/whoami-bd6b677dc-jvqc2 1/1 Running 0 3h30m
pod/whoami-bd6b677dc-lvcxp 1/1 Running 0 3h30m
Teste Conjunto de Comissionamento
Como a solução selecionada para o problema é: nginx-> traefik-> service
- traefik -> serviço
- nginx -> traefik
- nginx -> serviço
traefik -> serviço
Use o agente traefik para testar a lista de recursos do aplicativo:
# cat traefik-whoami.yaml
##########################################################################
#Author: zisefeizhu
#QQ: 2********0
#Date: 2020-04-22
#FileName: traefik-whoami.yaml
#URL: https://www.cnblogs.com/zisefeizhu/
#Description: The test script
#Copyright (C): 2020 All rights reserved
###########################################################################
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: simpleingressroute
spec:
entryPoints:
- web
routes:
- match: Host(`who.linux.com`) && PathPrefix(`/notls`)
kind: Rule
services:
- name: whoami
port: 80
Os hosts locais analisam a
interface traefik e observam que o proxy é bem-sucedido:
visite who.linux.com/notls nginx-
> traefik
# cat conf/nginx.conf
user nobody;
worker_processes 4;
events {
use epoll;
worker_connections 2048;
}
http {
upstream app {
server 20.0.0.202;
}
server {
listen 80;
# server_name who2.linux.com;
access_log logs/access.log;
error_log logs/error.log;
location / {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_redirect off;
proxy_read_timeout 600;
proxy_connect_timeout 600;
proxy_pass http://app;
}
}
}
# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
20.0.0.202 who.linux.com //k8s集群traefik所落节点,其实K8s任意节点都随便拉
# curl -iL who.linux.com/notls
HTTP/1.1 200 OK
Content-Length: 388
Content-Type: text/plain; charset=utf-8
Date: Wed, 22 Apr 2020 07:33:52 GMT
Hostname: whoami-bd6b677dc-lvcxp
IP: 127.0.0.1
IP: 172.20.46.67
RemoteAddr: 172.20.177.153:58168
GET /notls HTTP/1.1
Host: who.linux.com
User-Agent: curl/7.29.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 20.0.0.101
X-Forwarded-Host: who.linux.com
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: traefik-ingress-controller-z5qd7
X-Real-Ip: 20.0.0.101
Se você não conhece o nginx, leia a publicação no blog deste grande homem: https://www.cnblogs.com/kevingrace/p/6095027.html
nginx -> serviço
# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
20.0.0.101 who.linux.com
# curl -iL who.linux.com/notls
HTTP/1.1 200 OK //响应信息
Server: nginx/1.10.2 //响应服务
Date: Wed, 22 Apr 2020 07:27:46 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 389
Connection: keep-alive
Hostname: whoami-bd6b677dc-jvqc2
IP: 127.0.0.1
IP: 172.20.46.111
RemoteAddr: 172.20.177.153:38298
GET /notls HTTP/1.1
Host: who.linux.com
User-Agent: curl/7.29.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 20.0.0.101
X-Forwarded-Host: who.linux.com
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: traefik-ingress-controller-z5qd7
X-Real-Ip: 20.0.0.101
nginx日志
# tail -f access.log
20.0.0.101 - - [22/Apr/2020:15:28:28 +0800] "GET /notls HTTP/1.1" 200 389 "-" "curl/7.29.0"
Teste do navegador
Continuar o teste
Desative o aplicativo traefik e teste
# kubectl delete -f .
configmap "traefik-config" deleted
customresourcedefinition.apiextensions.k8s.io "ingressroutes.traefik.containo.us" deleted
customresourcedefinition.apiextensions.k8s.io "ingressroutetcps.traefik.containo.us" deleted
customresourcedefinition.apiextensions.k8s.io "middlewares.traefik.containo.us" deleted
customresourcedefinition.apiextensions.k8s.io "tlsoptions.traefik.containo.us" deleted
customresourcedefinition.apiextensions.k8s.io "traefikservices.traefik.containo.us" deleted
ingressroute.traefik.containo.us "traefik-dashboard-route" deleted
service "traefik" deleted
daemonset.apps "traefik-ingress-controller" deleted
serviceaccount "traefik-ingress-controller" deleted
clusterrole.rbac.authorization.k8s.io "traefik-ingress-controller" deleted
clusterrolebinding.rbac.authorization.k8s.io "traefik-ingress-controller" deleted
# kubectl delete -f traefik-whoami.yaml //关闭whoami traefik代理
ingressroute.traefik.containo.us "simpleingressroute" deleted
Sem mencionar que os resultados dos testes são muito claros: visite a tendência de tráfego who.linux.com: nginx-> traefik-> service.