Ingress
- ingress для доступу ззовні:
domain_name:port/path
- Поле:
rules.ingressClassName
path
-> шляхbackend.service.name
-> сервісport
-> порт сервісуhost
-> доменне ім’я
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-wildcard-host
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx # використовується для ingress-контролера
rules:
- host: "foo.bar.com"
http:
paths:
- pathType: Prefix
path: "/bar" # http://domain/path
backend:
service:
name: service1 # svc
port:
number: 80 # порт svc
- host: "*.foo.com"
http:
paths:
- pathType: Prefix
path: "/foo"
backend:
service:
name: service2
port:
number: 80
Перевірка
1. перевірити, чи встановлений ingress контролер
k get ingressclass
якщо ні, встановіть його
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install my-nginx-ingress ingress-nginx/ingress-nginx -n ingress-nginx --create-namespace
2. перевірити IP, домен, порт
# 1. перевірити порт
# svc asia|europe прив'язаний до pod
# svc ingress-nginx-controller прив'язаний до pod ingress-контролера
# а target_port:port - це 80:30080, тому порт доступу - 30080
controlplane $ k get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 443/TCP 35h
ingress-nginx ingress-nginx-controller NodePort 10.106.174.82 80:30080/TCP,443:30443/TCP 2m12s
ingress-nginx ingress-nginx-controller-admission ClusterIP 10.110.84.81 443/TCP 2m13s
kube-system kube-dns ClusterIP 10.96.0.10 53/UDP,53/TCP,9153/TCP 35h
world asia ClusterIP 10.100.146.115 80/TCP 44s
world europe ClusterIP 10.99.31.152 80/TCP 45s
# 2. знайти IP (endpoint -> ingress)
controlplane $ k get endpoints
NAME ENDPOINTS AGE
kubernetes 172.30.1.2:6443 35h
controlplane $ k get ing -owide -A
NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
world world nginx world.universe.mine 172.30.1.2 80 63s
# 3. перевірити домен (якщо немає, додайте його)
controlplane $ cat /etc/hosts
127.0.0.1 localhost
127.0.0.1 ubuntu
127.0.0.1 host01
127.0.0.1 controlplane
172.30.1.2 world.universe.mine
Примітка: не плутайте app svc і ingress svc. app svc прив’язаний до pod додатка (наприклад, asia), інші pod можуть отримати доступ до нього через
svc_ip:svc_port
; ingress svc прив’язаний до pod ingress-контролера, ці створюються під час встановлення ingress вingress-nginx
просторі. Для зовнішнього доступу pod слід використовувати порт ingress svc.
3.
Ingress
- ingress для зовнішнього доступу:
domain_name:port/path
- Поле:
rules.ingressClassName
path
-> шляхbackend.service.name
-> сервісport
-> порт сервісуhost
-> доменне ім’я
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-wildcard-host
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx # використовується для ingress-контролера
rules:
- host: "foo.bar.com"
http:
paths:
- pathType: Prefix
path: "/bar" # http://domain/path
backend:
service:
name: service1 # svc
port:
number: 80 # порт svc
- host: "*.foo.com"
http:
paths:
- pathType: Prefix
path: "/foo"
backend:
service:
name: service2
port:
number: 80
Перевірка
1. перевірити, чи встановлений ingress-контролер
k get ingressclass
якщо ні, встановіть його
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install my-nginx-ingress ingress-nginx/ingress-nginx -n ingress-nginx --create-namespace
2. перевірити IP, домен, порт
# 1. перевірити порт
# svc asia|europe прив'язаний до pod
# svc ingress-nginx-controller прив'язаний до pod ingress-контролера
# а target_port:port - це 80:30080, тому порт доступу - 30080
controlplane $ k get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 443/TCP 35h
ingress-nginx ingress-nginx-controller NodePort 10.106.174.82 80:30080/TCP,443:30443/TCP 2m12s
ingress-nginx ingress-nginx-controller-admission ClusterIP 10.110.84.81 443/TCP 2m13s
kube-system kube-dns ClusterIP 10.96.0.10 53/UDP,53/TCP,9153/TCP 35h
world asia ClusterIP 10.100.146.115 80/TCP 44s
world europe ClusterIP 10.99.31.152 80/TCP 45s
# 2. знайти IP (endpoint -> ingress)
controlplane $ k get endpoints
NAME ENDPOINTS AGE
kubernetes 172.30.1.2:6443 35h
controlplane $ k get ing -owide -A
NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
world world nginx world.universe.mine 172.30.1.2 80 63s
# 3. перевірити домен (якщо немає, додайте його)
controlplane $ cat /etc/hosts
127.0.0.1 localhost
127.0.0.1 ubuntu
127.0.0.1 host01
127.0.0.1 controlplane
172.30.1.2 world.universe.mine
Примітка: не плутайте app svc і ingress svc. app svc прив’язаний до pod додатка (наприклад, asia), інші pod можуть отримати доступ до нього через
svc_ip:svc_port
; ingress svc прив’язаний до pod ingress-контролера, ці створюються під час встановлення ingress вingress-nginx
просторі. Для зовнішнього доступу pod слід використовувати порт ingress svc.
3.
curl ingress IP/path
# curl domain_name:port/path
controlplane $ curl world.universe.mine:30080/asia
NetworkPolicy
- фільтрувати трафік
- Поля:
- діяти на pod:
—namespace
—podSelector
- тип np:
—ingress.from
&egress.to
- потік трафіку: джерело/призначення pod
—namespaceSelector
—podSelector
—ports
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default # встановлює мітку для pod ns
spec:
podSelector:
matchLabels:
role: db # встановлює мітку для pod
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproj # встановлює мітку для pod в джерелі/призначенні
- podSelector:
matchLabels:
role: frontend # встановлює мітку для pod в джерелі/призначенні
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978 # встановлює фільтр порту
та знайдіть мітки
k get ns --show-labels
k get pod -A --show-labels
Перевірка
Згідно з правилами фільтрації, виберіть джерело pod і призначення pod, щоб перевірити трафік
k exec -it pod01 -- curl svc02.ns02.svc.cluster.local
k exec -it test_pod -- curl svc02.ns02.svc.cluster.local
## curl ingress IP/path
curl domain_name:port/path
controlplane $ curl world.universe.mine:30080/asia
```
NetworkPolicy
- фільтрує трафік
- Поля:
- діяти на pod:
—namespace
—podSelector
- тип np:
—ingress.from
&egress.to
- потік трафіку: джерело/призначення pod
—namespaceSelector
—podSelector
—ports
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default # встановлює мітку для pod ns
spec:
podSelector:
matchLabels:
role: db # встановлює мітку для pod
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproj # встановлює мітку для pod джерела/призначення
- podSelector:
matchLabels:
role: frontend # встановлює мітку для pod джерела/призначення
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978 # встановлює фільтр порту
та знайдіть мітки
k get ns --show-labels
k get pod -A --show-labels
Перевірка
Згідно з правилами фільтрації, виберіть джерело pod та призначення pod, щоб перевірити трафік
k exec -it pod01 -- curl svc02.ns02.svc.cluster.local
k exec -it test_pod -- curl svc02.ns02.svc.cluster.local
Перекладено з: [CKA Recap — Ingress & NetworkPolicy](https://medium.com/@cheedgelee/cka-recap-ingress-networkpolicy-1bacd60c71f1)