Exposing Services in Kubernetes

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Kuna njia tofauti za kufunua huduma katika Kubernetes ili endpoints za ndani na endpoints za nje ziweze kuzifikia. Usanidi huu wa Kubernetes ni muhimu sana kwani msimamizi anaweza kumpa ufikiaji wa wahalifu kwenye huduma ambazo hawapaswi kuwa na uwezo wa kuzifikia.

Uchambuzi wa Kiotomatiki

Kabla ya kuanza kutambua njia ambazo K8s inatoa kufunua huduma hadharani, jua 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 la 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 aliye na uthibitisho.

NodePort

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

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

Ikiwa haujataja nodePort katika yaml (ni bandari itakayofunguliwa) bandari katika eneo la 30000–32767 itatumika.

LoadBalancer

Inafunua Huduma kwa njia ya 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 itapeleka trafiki yote kwenye huduma yako.

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

ExternalName

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

Ufafanuzi huu wa Huduma, kwa mfano, unafanya ramani ya Huduma ya my-service katika nafasi ya majina ya prod hadi my.database.example.com:

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

Upon searching for the host my-service.prod.svc.cluster.local, the cluster DNS Service returns a CNAME record with the value my.database.example.com. Accessing my-service works in the same way as other Services but with the crucial difference that redirection happens at the DNS level rather than via proxying or forwarding.

Anwani za IP za Kigeni

Trafiki inayoingia kwenye kikundi na IP ya kigeni (kama IP ya marudio), kwenye bandari ya Huduma, itaelekezwa kwa moja ya mwisho wa 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, "my-service" inaweza kufikiwa 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

Ingress

Tofauti na mifano yote iliyotajwa hapo juu, Ingress SI aina ya huduma. Badala yake, inakaa mbele ya huduma nyingi na hufanya kama "router" mjanja au njia ya 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 GKE wa chaguo-msingi wataanzisha HTTP(S) Load Balancer kwako. Hii itakuruhusu kufanya mwelekeo kulingana na 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 hii:

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

Marejeo

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Last updated