±à¼ÍƼö: |
±¾ÎÄÀ´×Ô²©¿ÍÔ°£¬±¾ÎĽéÉÜ΢·þÎñµÄ¡°Í´µã¡±£¬ÒÔ¼°ÎÒÃǽ«´øÁì´ó¼Ò¸ÐÐÔµÄÈÏʶһÏÂIstio£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£ |
|
½üÁ½Äê΢·þÎñ¼Ü¹¹Á÷ÐУ¬Ö÷Á÷»¥ÁªÍø³§ÉÌÄÚ²¿¶¼ÒѾ΢·þÎñ»¯£¬³õ´´ÆóÒµËäÈ»¼¼Êõ»ýµí²»ÐУ¬µ«Ò²Í¨¹ý¸÷ÖÖ¿ªÔ´¹¤¾ßÓµ±§Î¢·þÎñ¡£ÔÙ¼ÓÉÏÈÝÆ÷¼¼Êõ¸³ÄÜ£¬KubernetesÓÖÌíÁËÒ»°Ñ»ð£¬Î¢·þÎñ¼Ü¹¹ÒÑÈ»³ÉΪµ±Ç°Èí¼þ¼Ü¹¹Éè¼ÆµÄÊ×Ñ¡¡£
µ«Î¢·þÎñ»¯Ò×Ū£¬·þÎñÖÎÀíÄѸ㣡
Ò»¡¢Î¢·þÎñµÄ¡°Í´µã¡±
΢·þÎñ»¯Ã»ÓÐͳһ±ê×¼£¬¶àÊýÊǽøÐÐÒµÎñÁìÓò´¹Ö±Çз֣¬ÒµÎñ°´Ò»¶¨µÄÁ£¶È»®·ÖÖ°Ô𣬲¢ÐγÉÇåÎú¡¢Ö°Ôðµ¥Ò»µÄ·þÎñ½Ó¿Ú£¬ÕâÑùÿһ¿é¹æ»®ÎªÒ»¸ö΢·þÎñ¡£Î¢·þÎñÖ®¼äµÄͨÐÅ·½°¸Ïà¶Ô³ÉÊ죬¿ªÔ´ÁìÓòÑ¡Ôñ½Ï¶àµÄÓÐRPC»òRESTful
API·½°¸£¬±ÈÈ磺gRPC¡¢Apache ThriftµÈ¡£ÕâЩ·½°¸¶àÆ«ÖØÓÚÊý¾ÝÈçºÎ´ò°ü¡¢´«ÊäÓë½â°ü£¬¶Ô·þÎñÖÎÀíµÄÄÚÈÝÉæ¼°ÉõÉÙ¡£
΢·þÎñÖÎÀíÊÇÍ·ÌÛµÄÊ£¬Ò²ÊÇ΢·þÎñ¼Ü¹¹ÖеÄÍ´µã¡£ÖÎÀíÕâ¸ö´ÊÓжàÔªº¬Ò壬ºÜÄÑÏ´ïÒ»¸ö¾«È·¶¨Ò壬ÕâÀï¿ÉÒÔÏñСѧ¶þÄ꼶ѧÉúÄÇÑùÁгöÖÎÀíµÄÖî¶à½üÒå´Ê£º¹ÜÀí¡¢¿ØÖÆ¡¢¹æÔò¡¢Õƿء¢¼à¶½¡¢Ö§Åä¡¢¹æ¶¨¡¢Í³Öεȡ£¶ÔÓÚ΢·þÎñ¶øÑÔ£¬ÖÎÀíÌåÏÖÔÚÒÔÏÂÖî¶à·½Ã棺
·þÎñ×¢²áÓë·¢ÏÖ
Éí·ÝÑéÖ¤ÓëÊÚȨ
·þÎñµÄÉìËõ¿ØÖÆ
·´Ïò´úÀíÓë¸ºÔØ¾ùºâ
·ÓÉ¿ØÖÆ
Á÷Á¿Çл»
ÈÕÖ¾¹ÜÀí
ÐÔÄܶÈÁ¿¡¢¼à¿ØÓëµ÷ÓÅ
·Ö²¼Ê½¸ú×Ù
¹ýÔØ±£»¤
·þÎñ½µ¼¶
·þÎñ²¿ÊðÓë°æ±¾Éý¼¶²ßÂÔÖ§³Ö
´íÎó´¦Àí
¡¡
´Ó΢·þÎñÖÎÀí½Ç¶ÈÀ´Ëµ£¬Î¢·þÎñÆäʵÊÇÒ»¸ö¡°´óϵͳ¡±£¬ÒªÏ뽫Õâ¸ö´óϵͳȫ²¿Â䵨£¬¾ø·ÇÒ×Ê£¬ÓÈÆäÊÇ֮ǰÉÐûÓÐÒ»ÖÖÌØ±ðÓÅÑŵļ¼Êõ·½°¸¡£¶àÊý·½°¸£¨±ÈÈ磺Dubbo¡¢go-kitµÈ£©¶¼»ò¶à»òÉٵضÔÓ¦ÓÃÂß¼ÓÐÒ»¶¨µÄÇÖÈëÐÔ£¬ÈÃÒµÎñ¿ª·¢ÈËÔ±²»ÄÜÖ»focusµ½ÒµÎñ±¾Éí£¬»¹Òª¹ØÐÄÄÇЩ¡°ÖÎÀí¡±Âß¼¡£²¢ÇÒÊÐÃæÉÏÄÚÖÃÁË΢·þÎñÖÎÀíÂß¼µÄ¿ò¼Ü½ÏÉÙ£¬ÇҺܶà±à³ÌÓïÑÔÏà¹Ø¡£ÕâÖÖÇé¿öÏ£¬´ó³§¶àÑ¡Ôñ×ÔÑлò»ùÓÚij¸ö¿ò¼Ü¸ÄÔ죬С³§Ò»°ãÖ»ÄÜ¡°¶«Æ´Î÷´Õ¡±Ò»Ð©¡°°ë³ÉÆ·¡±´ÕºÏ×ÅʹÓ㬾ÍÕâÑù΢·þÎñÒ²×ß¹ýÁËÈô¸ÉÄê¡£
¶þ¡¢Service Meshºá¿Õ³öÊÀ£¬Istio´øÀ´¡°¸£Òô¡±
ÎÒ²»ÖªµÀÔÚûÓÐTCP/IPÐÒéµÄÄê´ú£¬Ö÷»úºÍÖ÷»úÖ®¼äµÄÓ¦ÓÃͨÐÅʱÊÇ·ñÐèÒªÓ¦ÓùØÐĵײãͨÐÅÐÒéʵÏÖÂß¼¡£µ«ÊǺÍTCP/IPµ®ÉúµÄ˼ÏëÀàËÆ£¬ÔÚ΢·þÎñʹÓöàÄêºó£¬ÈËÃÇ·¢ÏÖÐèÒª¶ÀÁ¢µØ³éÏó³öÒ»²ãÂß¼ÍøÂ磬רÃÅÓÃÓÚ¡°Î¢·þÎñͨÐÅÓëÖÎÀí²ßÂÔµÄÂ䵨¡±£¬ÈÃÓ¦ÓÃÖ»¹ØÐÄÒµÎñ£¬°Ñ·þÎñÖÎÀíµÄÊÂÇéÈ«²¿½»ÓÉ¡°ÕâÒ»²ã¡±È¥´¦Àí¡£

ͼ 1£º´«Í³Î¢·þÎñÖ®¼äµÄ΢·þÎñÖÎÀíÂß¼µÄλÖÃ

ͼ 2£ºÎ¢·þÎñÖÎÀíÂß¼±»¶ÀÁ¢³öÀ´Ö®ºóµÄλÖÃ
ÓÉ¡°Service Govern Logic¡±ÕâÒ»²ã×é³ÉµÄÂß¼ÍøÂç±»¶¨ÒåΪService Mesh£¬Ã¿¸ö΢·þÎñ¶¼°üº¬Ò»¸öservice
meshµÄ¶Ëµã¡£
¡°Service Mesh¡±¸ÅÄ·Ç³£ÄêÇᣬÕâ¸ö´ÊÔÚ¹úÄÚ±»·ÒëΪ¡°·þÎñÍø¸ñ¡±»ò¡°·þÎñÄöºÏ²ã¡±£¬ÎÒÃÇÕâÀï¾ÍÓÃService
MeshÕâ¸öÓ¢ÎÄ´Ê¡£ÕâÀïժ¼һÏÂServiceMeshÖÐÎÄÉçÇøÉϵÄһƪÃûΪ¡¶Äê¶ÈÅ̵ã2017Ö®Service
Mesh£ºÈºÐÛÖð¹·éÑÌÆð[1]¡·µÄÎÄÕÂÖжÔService Mesh¸ÅÄîµÄ»Ø¹Ë£ºÔÚ 2016 ÄêÄê³õ£¬¡°Service
Mesh¡±»¹Ö»ÊÇ Buoyant ¹«Ë¾µÄÄÚ²¿´Ê»ã£¬¶øÖ®ºó£¬Ëü¿ªÊ¼Öð²½×ßÏòÉçÇø£º2016 Äê 9 ÔÂ
29 ÈÕÔÚ SF Microservices ÉÏ£¬¡°Service Mesh¡±Õâ¸ö´Ê»ãµÚÒ»´ÎÔÚ¹«¿ª³¡ºÏ±»Ê¹Óá£Õâ±êÖ¾×Å¡°Service
Mesh¡±Õâ¸ö´Ê£¬´Ó Buoyant ¹«Ë¾×ßÏòÉçÇø¡£2016 Äê 10 Ô£¬Alex Leong ¿ªÊ¼ÔÚ
Buoyant ¹«Ë¾µÄ¹Ù·½ Blog ÖÐÁ¬ÔØÏµÁÐÎÄÕ¡°A Service Mesh for Kubernetes¡±¡£Ëæ×Å¡°The
Services must Mesh¡±¿ÚºÅµÄº°³ö£¬Buoyant ºÍ Linkerd ¿ªÊ¼ Service
Mesh ¸ÅÄîµÄ²¼µÀ¡£2017 Äê 4 Ô 25 ÈÕ£¬William Morgan ·¢²¼²©ÎÄ¡°What¡¯s
a Service Mesh? And why do I need one?¡±¡£Õýʽ¸ø Service
Mesh ×öÁËÒ»¸öȨÍþ¶¨Òå¡£¶øService MeshÕæÕýÒýÆð´ó¼Ò¹Ø×¢ÒªÔ´ÓÚIstioÏîÄ¿µÄ¿ªÔ´·¢²¼¡£ÎªÊ²Ã´ÄØ£¿¸öÈ˾õµÃ»¹ÊÇÒòΪ¡°µùºÃ¡±£¡IstioÏîÄ¿ÓÉGoogle¡¢IBM¹²Í¬ºÏ×÷´´½¨£¬Lyft¹«Ë¾¹±Ï×ÁËEnvoyÏîÄ¿½«×÷ΪIstio
Service MeshµÄdata panel¡£Google¡¢IBMµÄÓ°ÏìÁ¦ÈÃService Mesh¸ÅÄîѸËÙ´«²¥£¬Í¬Ê±Ò²Èôó¼ÒÈÏʶµ½ÁËIstioÏîÄ¿ÔÚService
MeshÁìÓòµÄÖØÒªÐÔ£¬ÓÚÊÇ·×·×Ñ¡Ôñ»ý¼«Ö§³Ö²¢½«×Ô¼ºµÄ²úÆ·»òÏîÄ¿ÓëIstioÏîÄ¿¼¯³É¡£
IstioÏîÄ¿ÊÇService Mesh¸ÅÄîµÄ×îÐÂʵÏÖ£¬Ö¼ÔÚËùÓÐÖ÷Á÷¼¯Èº¹ÜÀíÆ½Ì¨ÉÏÌṩService
Mesh²ã£¬³õÆÚÒÔʵÏÖKubernetesÉϵķþÎñÖÎÀí²ãΪĿ±ê¡£ËüÓÉ¿ØÖÆÆ½ÃæºÍÊý¾ÝÆ½Ãæ×é³É£¨ÊDz»ÊǸоõºÍSDNµÄÉè¼ÆÀíÄîÏàËÆ°¡£©¡£¿ØÖÆÆ½ÃæÓÉGoÓïÑÔʵÏÖ£¬°üÀ¨Pilot¡¢Mixer¡¢AuthÈý¸ö×é¼þ£»Êý¾ÝÆ½Ãæ¹¦ÄÜÔÝÓÉEnvoyÔÚPodÖÐÒÔSidecarµÄ²¿ÊðÐÎʽÌṩ¡£ÏÂÃæÊǹٷ½µÄ¼Ü¹¹Í¼£º

ͼ 3£ºIstio¼Ü¹¹Í¼£¨À´×Ô¹ÙÍø£©
SidecarÖÐEnvoy´úÀíÁËPodÖÐÕæÕýÒµÎñContainerµÄËùÓнø³öÁ÷Á¿£¬²¢¶ÔÕâЩÁ÷Á¿°´ÕÕ¿ØÖÆÆ½ÃæÉ趨µÄ¡°ÖÎÀíÂß¼¡±½øÐд¦Àí¡£¶øÕâÒ»ÇжÔPodÖеÄÒµÎñÓ¦ÓÃÊÇ͸Ã÷µÄ£¬¿ª·¢ÈËÔ±¿ÉÒÔרÐÄÓÚÒµÎñÂß¼£¬¶øÎÞÐèÔÙ¹ØÐÄ΢·þÎñÖÎÀíµÄÂß¼¡£Istio´ú±íµÄService
MeshµÄÉè¼ÆÀíÄî±»ÈÏΪÊÇÏÂÒ»´ú¡°Î¢·þÎñͳһ¿ò¼Ü¡±£¬ÉõÖÁÓÐÈËÈÏΪÊÇ΢·þÎñ¿ò¼ÜÑÝ»¯µÄÖյ㡣
IstioÓÚ2017Äê5ÔÂ24ÈÕ·¢²¼ÁË0.1 release°æ±¾£¬½ØÖÁĿǰΪֹIstioµÄ°æ±¾¸üе½v
0.4.0£¬ÑݽøËÙ¶ÈÏ൱¿ì£¬²»¹ýĿǰÒÀÈ»²»ÒªÓÃÓÚÉú²ú»·¾³£¬ÖÁÉÙÒªµÈµ½1.0°æ±¾·¢²¼°É¡£µ«¶ÔÓÚIstioµÄÔçÆÚ½ÓÄÉÕß¶øÑÔ£¬ÏÖÔÚÕýÊÇÉîÈëÑо¿IstioµÄºÃʱ»ú¡£ÔÚ±¾ÆªµÄ½ÓÏÂÀ´ÄÚÈÝÖУ¬ÎÒÃǽ«´øÁì´ó¼Ò¸ÐÐÔµÄÈÏʶһÏÂIstio£¬Èë¸öÃŶù¡£
Èý¡¢Istio°²×°
IstioĿǰ֧³Ö×îºÃµÄ¾ÍÊÇKubernetesÁË£¬Òò´ËÎÒÃǵÄʵÑé»·¾³¾Í¶¨ÔÚKubernetesÉÏ¡£ÖÁÓÚ°æ±¾£¬Istioµ±Ç°×îа汾Ϊ0.4.0£¬Õâ¸ö°æ±¾¾Ý˵ҪKubernetes
1.7.4¼°ÒÔÉϰ汾ÓÃÆðÀ´²Å²»»á·¢ÉúС벡:)¡£ÎÒµÄKubernetes¼¯ÈºÊÇv1.7.6°æ±¾µÄ£¬Ç¡ºÃÂú×ãÌõ¼þ¡£ÏÂÃæÊǰ²×°¹ý³Ì£º£¨NodeÉϵÄOSÊÇUbuntu
16.04£©
# wget -c
https://github.com/istio/istio/releases/ download/ 0.4.0/istio-0.4.0-linux.tar.gz
½âѹºó£¬½øÈëistio-0.4.0Ŀ¼£¬
# ls -F
bin/ install/ istio.VERSION LICENSE README.md
samples/
# cat istio.VERSION
# DO NOT EDIT THIS FILE MANUALLY instead use
# install/updateVersion.sh (see install/README.md)
export CA_HUB="docker.io/istio"
export CA_TAG="0.4.0"
export MIXER_HUB="docker.io/istio"
export MIXER_TAG="0.4.0"
export PILOT_HUB="docker.io/istio"
export PILOT_TAG="0.4.0"
export ISTIOCTL_URL="https://storage.googleapis.com/ istio-release/releases/0.4.0/istioctl"
export PROXY_TAG="0.4.0"
export ISTIO_NAMESPACE="istio-system"
export AUTH_DEBIAN_URL="https://storage.googleapis.com/ istio-release/releases/0.4.0/deb"
export PILOT_DEBIAN_URL="https://storage.googleapis.com/istio-release/releases/0.4.0/deb"
export PROXY_DEBIAN_URL="https://storage.googleapis.com/istio-release/releases/0.4.0/deb"
export FORTIO_HUB="docker.io/istio"
export FORTIO_TAG="0.4.2"
# cd install/kubernetes
ÎÒÃÇÏȲ»ÓÃauth¹¦ÄÜ£¬Òò´ËʹÓÃistio.yamlÕâ¸öÎļþ½ø ÐÐIstio×é¼þ°²×°£º
# kubectl apply -f istio.yaml
namespace "istio-system" created
clusterrole "istio-pilot-istio-system"
created
clusterrole "istio-initializer-istio-system"
created
clusterrole "istio-mixer-istio-system"
created
clusterrole "istio-ca-istio-system"
created
clusterrole "istio-sidecar-istio-system"
created
clusterrolebinding "istio-pilot-admin-role-binding -istio-system" created
clusterrolebinding "istio-initializer-admin-role -binding-istio-system" created
clusterrolebinding "istio-ca-role-binding-istio -system" created
clusterrolebinding "istio-ingress-admin-role -binding-istio-system" created
clusterrolebinding "istio-sidecar-role-binding -istio-system" created
clusterrolebinding "istio-mixer-admin-role- binding-istio-system" created
configmap "istio-mixer" created
service "istio-mixer" created
serviceaccount "istio-mixer-service-account"
created
deployment "istio-mixer" created
customresourcedefinition "rules.config.istio. io" created
customresourcedefinition "attributemanifests. config.istio.io" created
... ...
customresourcedefinition "reportnothings. config.istio.io" created
attributemanifest "istioproxy" created
attributemanifest "kubernetes" created
stdio "handler" created
logentry "accesslog" created
rule "stdio" created
metric "requestcount" created
metric "requestduration" created
metric "requestsize" created
metric "responsesize" created
metric "tcpbytesent" created
metric "tcpbytereceived" created
prometheus "handler" created
rule "promhttp" created
rule "promtcp" created
kubernetesenv "handler" created
rule "kubeattrgenrulerule" created
kubernetes "attributes" created
configmap "istio" created
customresourcedefinition "destinationpolicies.config.istio.io"
created
customresourcedefinition "egressrules.config. istio.io" created
customresourcedefinition "routerules.config. istio.io" created
service "istio-pilot" created
serviceaccount "istio-pilot-service-account"
created
deployment "istio-pilot" created
service "istio-ingress" created
serviceaccount "istio-ingress-service-account"
created
deployment "istio-ingress" created
serviceaccount "istio-ca-service-account"
created
deployment "istio-ca" created |
×¢£ºÎÒ»¹ÔøÔÚKubernetes v1.7.3Éϰ²×°¹ýIstio 0.3.0°æ±¾£¬µ«ÔÚ´´½¨×é¼þʱ»á±¨ÏÂÃæ´íÎó£¨Õâ¸ö´íÎó¿ÉÄܻᵼÖºóÐøaddon°²×°ºó¹¤×÷²»Õý³££©£º
unable to recognize
"istio.yaml": no matches for config.istio.io/,
Kind=metric
unable to recognize "istio.yaml": no
matches for config.istio.io/, Kind=metric
unable to recognize "istio.yaml": no
matches for config.istio.io/, Kind=metric
unable to recognize "istio.yaml": no
matches for config.istio.io/, Kind=metric
unable to recognize "istio.yaml": no
matches for config.istio.io/, Kind=metric
unable to recognize "istio.yaml": no
matches for config.istio.io/, Kind=metric |
°²×°ºó£¬ÎÒÃÇÔÚistio-systemÕâ¸önamespaceÏ»ῴµ½ÈçÏÂPodºÍServiceÔÚÔËÐУ¨ÓÉÓÚIstioµÄ¸÷¸ö×é¼þµÄimage
size¶¼²»Ð¡£¬Òò´ËPod״̬±äΪRunningÐèÒªÒ»¶ª¶ªÊ±¼ä£¬ÄÍÐĵȴý£©£º
# kubectl
get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-ca-1363003450-jskp5 1/1 Running 0 3d
istio-ingress-1005666339-c7776 1/1 Running 4
3d
istio-mixer-465004155-twhxq 3/3 Running 24 3d
istio-pilot-1861292947-6v37w 2/2 Running 18
3d
# kubectl get svc -n istio-system
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingress 10.98.10.87 <pending> 80:31759/TCP ,443:25804/TCP 4d
istio-mixer 10.109.244.155 <none> 9091/TCP,15004/TCP,9093/TCP,9094/TCP,9102/TCP, 9125/UDP,42422/TCP 4d
istio-pilot 10.105.80.55 <none> 15003/TCP,443/TCP
4d Istio°²×°³É¹¦£¡
|
ËÄ¡¢·þÎñÖÎÀí²ßÂÔÑéÖ¤
½ÓÏÂÀ´ÎÒÃÇÀ´Óü¸¸öÀý×ÓÑéÖ¤Ò»ÏÂIstioÔÚ·þÎñÖÎÀí·½ÃæµÄÄÜÁ¦£¡£¨Istio×Ô´øÒ»Ð©ÍêÕûµÄÀý×Ó£¬±ÈÈçbookinfo£¬ÓÃÓÚÑéÖ¤·þÎñÖÎÀíµÄÄÜÁ¦£¬µ«ÕâÀïÏȲ»´òËãÓÃÕâЩÀý×Ó£©
1¡¢ÑéÖ¤»·¾³ºÍÍØÆË
ÎÒÃÇÏÈÀ´¿´Ò»ÏÂÑéÖ¤»·¾³µÄʾÒâͼ£º

ÎÒÃÇ¿´µ½ÔÚService MeshÖв¿ÊðÁËÁ½¸öservice: serveraºÍserviceb£¬Ç°Õßµ÷ÓúóÕßÍê³ÉijÏîÒµÎñ£¬ºóÕßÔòµ÷ÓÃÍⲿ·þÎñÍê³ÉÒµÎñÂß¼¡£
servicea£ºÄ£Äâpay·þÎñ£¬ÔÚÊÕµ½clientÇëÇóºó£¬½øÐÐpay´¦Àí£¬²¢½«´¦Àí½á¹ûͨ¹ýservicebÌṩµÄmsg
notify·þÎñÏ·¢¸øuser¡£¸Ã·þÎñµÄendpointΪ/pay£»
serviceb£ºÄ£Äânotify·þÎñ£¬ÔÚÊÕµ½serviceaÇëÇóºó£¬½«messageת·¢¸øexternal
service£¬Íê³ÉnotifyÂß¼¡£¸Ã·þÎñµÄendpointΪ/notify£»
external service£ºÎ»ÓÚService MeshÖ®Í⣻
client£ºÎÒÃÇʹÓÃcurlÄ£Äâ¡£

ÎÒÃÇÏÈÀ´²¿ÊðserviceaºÍservicebµÄv0.1°æ±¾£º
ÒÔserviceaµÄ²¿ÊðΪÀý£¬serviceaµÄdeploymentÎļþÈçÏ£º
//svca-v0.1.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: svca
spec:
replicas: 1
template:
metadata:
labels:
app: svca
version: v0.1
spec:
containers:
- name: svca
image: docker.io/bigwhite/istio-demo-svca:v0.1
imagePullPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: svca
labels:
app: svca
spec:
ports:
- port: 80
targetPort: 8080
protocol: TCP
selector:
app: svca |
×¢Ò⣬ÎÒÃDz¿Êðservice_aʱ²»ÄÜÖ±½ÓʹÓÃkubectl apply -f svca-v0.1.yaml£¬¶øÊÇÒªapply¾¹ýistioctl£¨Ð轫Istio°²×°Ä¿Â¼ÏµÄbin·ÅÈëPATH£©´¦Àí¹ýµÄyaml£¬ÒÔ×¢ÈësidecarÈÝÆ÷¡£µ±È»Ò²¿ÉÒÔÅäÖÃΪ×Ô¶¯ÎªÃ¿¸öKubernetesÆô¶¯µÄPod×¢Èësidecar£¬µ«ÎÒÃÇÕâÀïûÓÐʹÓÃ×Ô¶¯×¢Èë¡£ÎÒÃÇÖ´ÐÐÏÂÃæÃüÁ
# kubectl apply
-f <(istioctl kube-inject -f svca-v0.1.yaml)
deployment "svca" created
service "svca" created
# kubectl get pods
NAME READY STATUS RESTARTS AGE
svca-1997590752-tpwjf 2/2 Running 0 2m |
ͬÑùµÄ·½·¨£¬ÎÒÃÇÀ´´´½¨svcb:v0.1£º
# kubectl apply
-f <(istioctl kube-inject -f svcb-v0.1.yaml)
deployment "svcb" created
service "svcb" created |
ÎÒÃÇ¿´µ½IstioÏòÿ¸öPodÖвåÈëÒ»¸ösidecar container£¬Õâ¸ö¾ÍÊÇÇ°ÃæËµµÄenvoy£¬Ö»²»¹ýcontainerÃû×ÖΪistio-proxy¡£
½ÓÏÂÀ´£¬ÎÒÃǰÑÄǸöexternal serviceÆô¶¯ÆðÀ´£º
# nohup ./msgd
> 1.log & 2>&1
[1] 9423 |
ʵÑé»·¾³OKÁË¡£ÏÂÃæÎÒÃÇÀ´ÑéÖ¤Ò»ÏÂÒµÎñÊÇ·ñÊÇͨµÄ¡£
2¡¢Egress Rules
°´ÕÕ֮ǰÎÒÃǵÄÉ趨£¬ÎÒÃÇʹÓÃcurlÈ¥·ÃÎÊservice_a·þÎñµÄ/pay¶Ëµã£¬ÎÒÃDz鿴һÏÂsvca·þÎñµÄIPºÍ¶Ë¿Ú£º
# kubectl get
svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S)
svca 10.105.38.238 <none> 80/TCP 9h
svcb 10.105.119.194 <none> 80/TCP 9h |
ÎÒÃÇ·ÃÎÊÒ»ÏÂsvca·þÎñ£¬svcaµÄ·þÎñµØÖ·¿ÉÒÔͨ¹ýkubectl get svc²éµ½£º
²é¿´svcaºÍsvcbµÄÈÕÖ¾£º
//service_aµÄÈÕÖ¾£º
service_a:v0.1 is serving the request...
service_a:v0.1 pays ok
&{500 Internal Server Error 500 HTTP/1.1 1
1 map[X-Content-Type-Options:[nosniff] Date:[Tue,
02 Jan 2018 15:41:50 GMT] Content-Length:[66]
Content-Type:[text/plain; charset=utf-8]] 0xc420058d40
66 [] false false map[] 0xc4200eaf00 <nil>}
service_a:v0.1 notify customer ok
// service_bµÄÈÕÖ¾£º
&{GET /notify?msg=service_a:v0.1-pays-ok HTTP/1.1
1 1 map[User-Agent:[Go-http-client/1.1] Accept-Encoding:[gzip]]
{} <nil> 0 [] false svcb map[] map[] <nil>
map[] 127.0.0.1:58778 /notify?msg=service_a:v0.1-pays-ok
<nil> <nil> <nil> 0xc4200fa3c0}
service_b:v0.1 is serving the request...
service_b:v0.1 send msg error: Get http://10.100.35.27:9997/send?msg=service_a:v0.1-pays-ok:
EOF |
ÎÒÃÇ¿´µ½serviceaºÍserviceb¶¼·µ»ØÁË´íÎóÈÕÖ¾£¨×¢Ò⣺go http get·½·¨¶ÔÓÚnon-2xx
response²»»á·µ»Ø´íÎó£¬ÎÒÃÇÖ»ÊÇ¿´µ½ÁËresponseÖеÄ500״̬Âë²ÅÒâʶµ½´íÎóµÄ´æÔÚ£©¡£ÆäÖÐÔ´Í·ÔÚservice_b£¬ÔÒòÊÇÆäÁ¬²»ÉÏÄǸöexternal
service£¡ÄÇôΪʲôÁ¬²»ÉÏexternal serviceÄØ£¿ÕâÊÇÓÉÓÚȱʡÇé¿öÏ£¬ÆôÓÃÁËIstioµÄ·þÎñÊÇÎÞ·¨·ÃÎÊÍⲿURLµÄ£¬ÕâÊÇÒòΪPodÖеÄiptables°ÑËùÓÐÍâ·¢´«Ê䶼תÏòµ½ÁËSidecar´úÀí£¬¶øÕâÒ»´úÀíÖ»´¦Àí¼¯ÈºÄڵķÃÎÊÄ¿±ê¡£Òò´ËλÓÚService
MeshÄڵķþÎñsvcbÎÞ·¨·ÃÎÊÍⲿµÄ·þÎñ£¨msgd£©£¬ÎÒÃÇÐèÒªÏÔʽµÄÌí¼Óegressrule¹æÔò£º
ÎÒÃÇ´´½¨Ò»¸öÔÊÐísvcb·ÃÎÊÍâ²¿ÌØ¶¨·þÎñµÄEgressRule£º
//rules/enable-svcb-engress-rule.yaml
apiVersion: config.istio.io/v1alpha2
kind: EgressRule
metadata:
name: enable-svcb-engress-rule
spec:
destination:
service: 10.100.35.27
ports:
- port: 9997
protocol: http |
ʹ¹æÔòÉúЧ£º
# istioctl create
-f enable-svcb-engress-rule.yaml
Created config egress-rule/default/enable-svcb-engress-rule
at revision 30031258 |
ÕâʱÄãÔÙ³¢ÊÔcurl svca£¬ÎÒÃÇ¿ÉÒÔ¿´µ½msgdµÄÈÕÖ¾ÖгöÏÖÁËÏÂÃæµÄÄÚÈÝ£º
2018/01/02
23:58:16 &{GET /send?msg=service_a:v0.1- pays-ok HTTP/1.1 1 1 map[X-Ot-Span-Context:[2157e7ffb8105330;2157e7ffb8105330;00000000 00000000] Content-Length:[0] User-Agent:[Go-http-client/1.1]
X- Forwarded-Proto:[http] X-Request-Id:[13c3af6e-2f52-993d-905f-aa 6aa4b57e2d] X-Envoy-Decorator-Operation:[default-route]
X-B3- Spanid:[2157e7ffb8105330] X-B3-Sampled:[1]
Accept- Encoding: [gzip] X-B3-Traceid:[2157e7ffb8105330] X-Istio-Attributes: [Ch8KCXNvdXJjZS5pcBISMhAAAAAAAAAAAAAA//8KLgAMCjo KCnNvdXJjZS51aWQSLBIqa3ViZXJuZXRlczovL3N2Y2ItMjAwO Dk3Mzc2OS 1ncTBsaC5kZWZhdWx0]] {} <nil> 0 [] false
10.100.35. 27:9997 map[] map[] <nil> map[] 10.100.35.28:38188
/send?msg=service _a:v0.1-pays-ok <nil> <nil> <nil>
0xc4200584c0}
2018/01/02 23:58:16 Msgd is serving the request...
2018/01/02 23:58:16 Msgd recv msg ok, msg= service_a:v0.1-pays-ok
|
˵Ã÷Svcbµ½Íⲿ·þÎñµÄͨÐű»´òͨÁË£¡
3¡¢Ç¨ÒÆÁ÷Á¿µ½Ð°汾svcb:v0.2
ÎÒÃǾ³£ÓÐÕâÑùµÄÐèÇ󣬵±svcbÔËÐÐÒ»¶Îʱ¼äºó£¬svcbÌí¼ÓÁËÐÂfeature£¬°æ±¾ÒªÉý¼¶µ½v0.2ÁË£¬ÕâʱÎÒÃǻᲿÊðsvcb:v0.2£¬²¢½«Á÷Á¿Öð²½Çе½v0.2ÉÏ¡£
ÎÒÃÇÏÈÀ´²¿ÊðÒ»ÏÂsvcb:v0.2£º
// svcb-v0.2.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: svcb-v0.2
spec:
replicas: 1
template:
metadata:
labels:
app: svcb
version: v0.2
spec:
containers:
- name: svcb
image: docker.io/bigwhite/istio-demo-svcb:v0.2
imagePullPolicy: Always |
ÎÒÃÇ¿ÉÒÔ¿´µ½£¬·þÎñÃû²»±ä£¬µ«°æ±¾µÄlabel±ä³ÉÁËv0.2£¬ÎÒÃÇÀ´Ö´ÐÐÕâ´Î²¿Êð£º
# kubectl apply
-f <(istioctl kube-inject -f svcb-v0.2.yaml)
deployment "svcb-v0.2" created
# kubectl get pods
NAME READY STATUS RESTARTS AGE
svca-1997590752-pq9zg 2/2 Running 0 9h
svcb-2008973769-gq0lh 2/2 Running 0 9h
svcb-v0.2-3233505404-0g55w 2/2 Running 0 1m
svcb·þÎñÏÂÓÖÔö¼ÓÁËÒ»¸öendpoint:
|
svcb·þÎñÏÂÓÖÔö¼ÓÁËÒ»¸öendpoint:
# kubectl
describe svc/svcb
.... ...
Selector: app=svcb
Type: ClusterIP
IP: 10.105.119.194
Port: <unset> 80/TCP
Endpoints: 10.40.0.28:8080,10.46.0.12:8080 ... ...
|
´Ëʱ£¬Èç¹û°´ÕÕKubernetesµÄµ÷¶È·½Ê½£¬v0.1ºÍv0.2°æ±¾µÄÁ½¸ösvcb podÓ¦¸Ã1:1¾ùºâµØ³ÐÔØÁ÷Á¿¡£ÎªÁË·½±ã²é¿´Á÷Á¿·Ö²¼£¬ÎÒÃǽ«Ã¿¸ö°æ±¾µÄsvcbµÄpod¸±±¾ÊýÁ¿¶¼À©Õ¹Îª2¸ö£¨replicas:
2£©£¬ÕâÑùService MeshÖÐÒ»¹²»áÓÐ4¸ö svcb endpoints¡£
ͨ¹ýcurl·ÃÎÊsvca×¢ÈëÁ÷Á¿ºó£¬ÎÒÃÇ·¢ÏÖÁ÷Á¿¶¼¼¯ÖÐÔÚÒ»¸ösvcb:v0.2µÄpodÉÏ£¬²¢ÇÒ³¤Ê±¼äûÓб仯¡£ÎÒÃÇͨ¹ýÏÂÃæµÄroute
rule¹æÔòÀ´³¢ÊÔ½«Á÷Á¿ÔÚsvcb:v0.1ºÍsvcb:v0.2Ö®¼ä1:1¾ùºâ£º
// route-rules-svcb-v0.2-50.yaml
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: route-rules-svcb
spec:
destination:
name: svcb
precedence: 1
route:
- labels:
version: v0.1
weight: 50
- labels:
version: v0.2
weight: 50
# istioctl create -f route-rules-svcb-v0.2-50.yaml
Created config route-rule/default/route-rules-svcb
at revision 30080638 |
°´ÕÕIstioÎĵµÖеÄ˵·¨£¬Õâ¸ö¹æÔòµÄÉúЧÐèҪһЩʱ¼ä¡£Ö®ºóÎÒÃÇ×¢ÈëÁ÷Á¿£¬·¢ÏÖÁ÷Á¿Çл»µ½svcb:v0.1µÄÒ»¸öPodÉÏÈ¥ÁË£¬²¢ÇҺܳ¤Ò»¶Îʱ¼ä²»Ôø±ä»¯£¬Î´¾ùºâµ½svcb:v0.2ÉÏÈ¥¡£
ÎÒÃǸüÐÂÒ»ÏÂroute rule£¬½«Á÷Á¿È«²¿Çе½svcb:v0.2ÉÏÈ¥£º
//route-rules-svcb-v0.2-100.yaml
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: route-rules-svcb
spec:
destination:
name: svcb
precedence: 1
route:
- labels:
version: v0.2
weight: 100
# istioctl replace -f route-rules-svcb-v0.2-100.yaml
Updated config route-rule/default/route-rules-svcb
to revision 30082944 |
ÎÒÃÇÓÃIstioµÄreplaceÃüÁî¸üÐÂÁ˹æÔò£ºroute-rules-svcb¡£¸üкó£¬ÔÙ´Î×¢ÈëÁ÷Á¿£¬Õâ»ØÁ÷Á¿ÖØÐ¼¯ÖÐÔÚsvcb:v0.2µÄÒ»¸öPodÉÏÁË£¬ÔÙ¹ýÒ»¶Îʱ¼äÁíÍâÒ»¸ösvcb:v0.2µÄpodÉϲÅÓÐÁËһЩÁ÷Á¿¡£µ«svcb:v0.1Éϲ»ÔÙÓÐÁ÷Á¿£¬Õâ¸öÇл»Êdzɹ¦µÄ¡£
ÔÚKubernetesµÄServiceµÄ¸ºÔؾùºâÖУ¬Kubernetes¾ÍÀûÓÃÁËiptablesµÄ¸ÅÂÊת·¢£¨random
¨Cprobability 0.5£©£¬Òò´ËÕâÖÖÁ÷Á¿¾ùºâ²¢·ÇÊǾ«È·µÄ£¬Ö»ÓÐÔÚ³¤Ê±¼ä´óÁ¿Á÷Á¿¾¹ýºó£¬²ÅÄÜ¿´µ½Á÷Á¿µÄ·Ö²¼ÓëÉ趨µÄÈ¨ÖØÊÇÏàËÆµÄ£¬¿ÉÄÜIstioÒ²ÊÇÈç´Ë£¬ÕâÀï½öÊÇÈëÃÅ£¬¾Í²»ÉîÈëÍÚ¾òÁË¡£
µ±È»IstioÔÚ·ÓɹæÔòÉèÊ©·½ÃæµÄ¡°ÄÜÄÍ¡±Ô¶²»Ö¹ÉÏÃæÀý×ÓÖÐËùչʾµÄÄÇÑù£¬Èç¹ûҪϤÊýÁгö£¬ÄDZ¾Îĵij¤¶È¿ÉÊÇÒª±¬µôÁË¡£ÓÐÐËȤµÄÅóÓÑ¿ÉÒÔÈ¥·¿´¹Ù·½Îĵµ¡£
Îå¡¢²å¼þ°²×°
IstioµÄÇ¿´ó΢·þÎñÖÎÀíÄÜÁ¦»¹ÌåÏÖÔÚÆä¼¯³ÉÁËGrafana¡¢Prometheus¡¢ServiceGraph¡¢ZipkinµÈAddons£¬Ó¦ÓóÌÐòÎÞÐè×öÈκθ͝£¬¾Í¿ÉÒÔ¾ßÓÐÊý¾ÝÊÕ¼¯¡¢¶ÈÁ¿Óë¿ÉÊÓ»¯µÄ¼à¿ØÄÜÁ¦¡¢·þÎñµÄ·Ö²¼Ê½¸ú×ÙÄÜÁ¦µÈ¡£ÎÒÃÇ¿ÉÒÔÔÚIstioµÄ°²×°°üÖÐÕÒµ½ÕâЩAddonsµÄ°²×°Îļþ£¬ÎÒÃÇÀ´ÖðÒ»ÊÔÊÔ¡£
1¡¢Prometheus & Grafana
ÎÒÃÇÏÈÀ´°²×°Ò»ÏÂPrometheusºÍGrafana²å¼þ£¨Î»ÓÚistio-0.4.0/install/kubernetes/addonÏÂÃæ£©£º
# kubectl apply
-f prometheus.yaml
configmap "prometheus" created
service "prometheus" created
deployment "prometheus" created
# kubectl apply -f grafana.yaml
service "grafana" created
deployment "grafana" created
# kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-3617079618-zpglx 1/1 Running 0 5m
prometheus-168775884-ppfxr 1/1 Running 0 5m
... ...
# kubectl get svc -n istio-system
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana 10.105.21.25 <none> 3000/TCP 16m
prometheus 10.103.160.37 <none> 9090/TCP
16m
... ... |
ä¯ÀÀÆ÷ÖÐÊäÈëPrometheusµÄ·þÎñµØÖ·http://10.103.160.37:9090£¬·ÃÎÊPrometheus£º

µã»÷²Ëµ¥Ïstatus -> targets£¬²é¿´¸÷¸ötargetµÄ״̬ÊÇ·ñÕý³££º

Èç¹ûÏñÉÏͼËùʾÄÇÑù£¬¸÷¸ötarget¶¼ÊÇup״̬£¬ÄǾÍ˵Ã÷IstioÔËÐÐʱOKµÄ¡£·ñÔòÇë²Î¿¼istio
troubleshootingÖеÄÄÚÈݶÔIstioÖðÒ»½øÐÐÅŲ飬ÓÈÆäÊÇistio-meshÕâ¸öTargetÔÚistio-0.3.0+kubernetes
1.7.3µÄ»·¾³ÖоÍÊÇDownµÄ״̬¡£
ä¯ÀÀÆ÷ÊäÈëgrafanaµÄ·þÎñµØÖ·£ºhttp://10.105.21.25:3000/£¬´ò¿ªgrafanaÃæ°å£º

Çл»µ½Istio Dashboard£¬²¢ÏòIstio Service Mesh×¢ÈëÁ÷Á¿£¬ÎÒÃǻῴµ½ÒDZíÅ̱仯ÈçÏ£º


2¡¢ServiceGraph
ServiceGraph²å¼þÊÇÓÃÀ´²é¿´·þÎñµ÷ÓùØÏµµÄ£¬ÎÒÃÇÀ´´´½¨Ò»Ï¸Ã×é¼þ£º
# kubectl apply
-f servicegraph.yaml
deployment "servicegraph" created
service "servicegraph" created
# kubectl get svc -n istio-system
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
servicegraph 10.108.245.21 <none> 8088/TCP
52s
... ... |
´´½¨³É¹¦ºó£¬ÏòService MeshÍøÂç×¢ÈëÁ÷Á¿£¬È»ºó·ÃÎÊServiceGraph£ºhttp://{servicegraph_ip}:8088/dotviz£¬ÔÚÎҵĻ·¾³ÀÎÒ¿´µ½µÄͼʾÈçÏ£º

µ÷ÓùØÏµËƺõÓÐЩÂÒ£¬ÄѵÀÊÇÎÒÔÚ³ÌÐòʹÓõĵ÷Ó÷½·¨²»¹»±ê×¼£¿:(
3¡¢Zipkin
Istio¼¯³ÉÁËZipkin£¬ÀûÓÃZipkinÎÒÃÇ¿ÉÒÔ×ö·Ö²¼Ê½·þÎñµ÷ÓõÄ×·×Ù¡£Ö®Ç°×Ô¼ºÔø¾´î½¨¹ý»ùÓÚJaegerºÍOpenTracingµÄ·Ö²¼Ê½µ÷Ó÷þÎñ£¬Ê®·Ö·±Ëö¡£²¢ÇÒÒªÏëʹÓÃtracing£¬¶ÔÓ¦ÓôúÂëµÄÇÖÈë±Ø²»¿ÉÉÙ¡£
ÎÒÃǰ²×°Ò»ÏÂZipkin Addon£º
# kubectl apply
-f zipkin.yaml
deployment "zipkin" created
service "zipkin" created
# kubectl get svc -n istio-system
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
zipkin 10.105.7.219 <none> 9411/TCP 1h |
ÎÒÃÇ·ÃÎÊÒÔÏÂZikpinµÄUI£¬Í¨¹ýä¯ÀÀÆ÷´ò¿ªhttp://{zipkinserviceip}:9411¡£

½ÓÏÂÀ´£¬ÎÒÃÇÏòService Mesh×¢ÈëһЩÁ÷Á¿£¬È»ºóÔÚZipkinÊ×Ò³µÄ¡°·þÎñÃû¡±ÏÂÀ¿òÖÐÑ¡Ôñ¡±svcb¡±£¬²éÕÒ¸ú×ÙÇé¿ö£º

ÎÒÃÇ¿´µ½£ºÔÚûÓжÔsvca£¬svcb×öÈκÎÐ޸ĵÄÇé¿öÏ£¬ÎÒÃÇÒÀÈ»¿ÉÒÔÔÚZipkinÖÐÕÒµ½svcbÏà¹ØµÄµ÷Óᣵã»÷ÆäÖÐÒ»¸ötrace£¬¿ÉÒԲ鿴ϸ½Ú£º

µ±È»Èç¹ûÄãÏë×öÄÚÈݸüΪ·á¸»µÄ¡¢¸üΪǿ´óµÄ¸ú×Ù£¬¿ÉÄÜÐèÒªÔÚÓ¦ÓôúÂëÖÐ×öЩÅäºÏ¡£
|