Exposing Services in Kubernetes

Support HackTricks

Kuna njia tofauti za kufunua huduma katika Kubernetes ili vifaa vya ndani na vifaa vya nje viweze kuzifikia. Usanidi huu wa Kubernetes ni muhimu sana kwani msimamizi anaweza kumpa ufikiaji wa wahalifu kwa huduma ambazo hawapaswi kuweza kuzifikia.

Uorodheshaji wa Kiotomatiki

Kabla ya kuanza kutambua njia ambazo K8s inatoa kufunua huduma hadharani, tambua kwamba ikiwa unaweza kuorodhesha majina ya nafasi, huduma na ingresses, unaweza kupata kila kitu kilichofunuliwa hadharani kwa:

kubectl get namespace -o custom-columns='NAME:.metadata.name' | grep -v NAME | while IFS='' read -r ns; do
echo "Namespace: $ns"
kubectl get service -n "$ns"
kubectl get ingress -n "$ns"
echo "=============================================="
echo ""
echo ""
done | grep -v "ClusterIP"
# Remove the last '| grep -v "ClusterIP"' to see also type ClusterIP

ClusterIP

ClusterIP huduma ni chaguo-msingi wa Kubernetes huduma. Inakupa huduma ndani ya kikundi chako ambayo programu nyingine ndani ya kikundi chako zinaweza kufikia. Hakuna upatikanaji wa nje.

Hata hivyo, hii inaweza kufikiwa kwa kutumia Kubernetes Proxy:

kubectl proxy --port=8080

Sasa, unaweza kutembea kupitia API ya Kubernetes ili kupata huduma kwa kutumia mpangilio huu:

http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/

Kwa mfano, unaweza kutumia URL ifuatayo:

http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/

kupata huduma hii:

apiVersion: v1
kind: Service
metadata:
name: my-internal-service
spec:
selector:
app: my-app
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP

Mbinu hii inahitaji uendeshe kubectl kama mtumiaji aliyeidhinishwa.

Pata orodha ya ClusterIPs:

kubectl get services --all-namespaces -o=custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,TYPE:.spec.type,CLUSTER-IP:.spec.clusterIP,PORT(S):.spec.ports[*].port,TARGETPORT(S):.spec.ports[*].targetPort,SELECTOR:.spec.selector' | grep ClusterIP

NodePort

Wakati NodePort unapotumiwa, bandari maalum inapatikana kwenye Nodes zote (zinawakilisha Mashine za Virtual). Trafiki inayoelekezwa kwenye bandari hii maalum kisha inaelekezwa kwa utaratibu kwenye huduma. Kwa kawaida, njia hii haipendekezwi kutokana na mapungufu yake.

Pata orodha ya NodePorts:

kubectl get services --all-namespaces -o=custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,TYPE:.spec.type,CLUSTER-IP:.spec.clusterIP,PORT(S):.spec.ports[*].port,NODEPORT(S):.spec.ports[*].nodePort,TARGETPORT(S):.spec.ports[*].targetPort,SELECTOR:.spec.selector' | grep NodePort

Mfano wa maelezo ya NodePort:

apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
selector:
app: my-app
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30036
protocol: TCP

If you don't specify the nodePort in the yaml (it's the port that will be opened) a port in the range 30000–32767 will be used.

LoadBalancer

Inaonyesha Huduma kwa njia ya nje kwa kutumia balansa ya mzigo ya mtoa huduma wa wingu. Kwenye GKE, hii itaanzisha Balansa ya Mzigo wa Mtandao ambayo itakupa anwani moja ya IP ambayo itaendeleza trafiki yote kwenye huduma yako. Kwenye AWS itaanzisha Balansa ya Mzigo.

Unalazimika kulipa kwa kila Balansa ya Mzigo iliyofunguliwa, ambayo inaweza kuwa ghali.

Pata orodha ya Balansa zote za Mzigo:

kubectl get services --all-namespaces -o=custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,TYPE:.spec.type,CLUSTER-IP:.spec.clusterIP,EXTERNAL-IP:.status.loadBalancer.ingress[*],PORT(S):.spec.ports[*].port,NODEPORT(S):.spec.ports[*].nodePort,TARGETPORT(S):.spec.ports[*].targetPort,SELECTOR:.spec.selector' | grep LoadBalancer

Anwani za IP za Kigeni

Anwani za IP za kigeni hufunuliwa na huduma za aina ya Load Balancers na kwa ujumla hutumiwa wakati Load Balancer wa Cloud wa kigeni unapotumiwa.

Ili kuzipata, angalia load balancers zenye thamani katika uga wa EXTERNAL-IP.

Trafiki inayoingia kwenye kikundi na anwani ya IP ya kigeni (kama anwani ya marudio ya IP), kwenye bandari ya Huduma, itaelekezwa kwa moja ya vituo vya Huduma. externalIPs hazisimamiwi na Kubernetes na ni jukumu la msimamizi wa kikundi.

Katika maelezo ya Huduma, externalIPs inaweza kutajwa pamoja na aina yoyote ya ServiceTypes. Katika mfano hapa chini, "huduma-yangu" inaweza kupatikana na wateja kwenye "80.11.12.10:80" (externalIP:port)

apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9376
externalIPs:
- 80.11.12.10

JinaLaNje

Kutoka kwa nyaraka: Huduma za aina ya ExternalName zinamapisha Huduma kwa jina la DNS, sio kwa kawaida ya kuchagua kama my-service au cassandra. Unaweza kutaja Huduma hizi kwa kutumia parameter ya spec.externalName.

Ufafanuzi huu wa Huduma, kwa mfano, unamapisha Huduma ya my-service katika eneo la prod kwenda my.database.example.com:

apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com

Kufunua Huduma katika Kubernetes

Wakati unapotafuta mwenyeji my-service.prod.svc.cluster.local, Huduma ya DNS ya kikundi inarudisha rekodi ya CNAME yenye thamani my.database.example.com. Kufikia my-service hufanya kazi kwa njia ile ile kama Huduma zingine lakini tofauti muhimu ni kwamba urekebishaji unatokea katika kiwango cha DNS badala ya kupitia kusambaza au kupeleka.

Orodhesha ExternalNames zote:

kubectl get services --all-namespaces | grep ExternalName

Ingress

Tofauti na mifano yote hapo juu, Ingress SI aina ya huduma. Badala yake, inakaa mbele ya huduma nyingi na hufanya kazi kama "router mjanja" au mlango wa kuingia kwenye kikundi chako.

Unaweza kufanya mambo mengi tofauti na Ingress, na kuna aina nyingi za watawala wa Ingress zenye uwezo tofauti.

Watawala wa Ingress wa msingi wa GKE wataanzisha HTTP(S) Load Balancer kwako. Hii itakuruhusu kufanya mizunguko ya njia na subdomain kwa huduma za nyuma. Kwa mfano, unaweza kutuma kila kitu kwenye foo.yourdomain.com kwa huduma ya foo, na kila kitu chini ya njia ya yourdomain.com/bar/ kwa huduma ya bar.

YAML kwa kitu cha Ingress kwenye GKE na L7 HTTP Load Balancer inaweza kuonekana kama hivi:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
backend:
serviceName: other
servicePort: 8080
rules:
- host: foo.mydomain.com
http:
paths:
- backend:
serviceName: foo
servicePort: 8080
- host: mydomain.com
http:
paths:
- path: /bar/*
backend:
serviceName: bar
servicePort: 8080

Panga yote yaingie:

kubectl get ingresses --all-namespaces -o=custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,RULES:spec.rules[*],STATUS:status'

Ingawa katika kesi hii ni bora kupata habari ya kila moja moja kwa moja ili kuisoma vizuri:

kubectl get ingresses --all-namespaces -o=yaml

Marejeo

Support HackTricks

Last updated