---
# System prepended metadata

title: Services & Ingress

---

# Services & Ingress
## Services

1) Деплоим "основное" приложение

app/configmap.yaml
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  default.conf: |
    server {
        listen       80 default_server;
        server_name  _;
        default_type text/plain;

        location / {
            return 200 '$hostname\n';
        }
    }
```

app/deployment.yaml
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - image: nginx:1.20
        name: nginx
        ports:
        - containerPort: 80
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /
            port: 80
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /
            port: 80
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
          initialDelaySeconds: 10
        resources:
          requests:
            cpu: 10m
            memory: 100Mi
          limits:
            cpu: 10m
            memory: 100Mi
        volumeMounts:
        - name: config
          mountPath: /etc/nginx/conf.d/
      volumes:
      - name: config
        configMap:
          name: my-configmap
```

```bash
kubectl apply -f app
```

2) Запустим тестовое приложение, с которого мы будем обращаться к основному:

```bash
kubectl run test --image=amouat/network-utils -it bash

exit
```

3) Создаем Service типа ClusterIP:

clusterip.yaml
```yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: my-app
  type: ClusterIP
```

```bash
kubectl apply -f clusterip.yaml
```

4) Убедимся, что Service работает. Узнаем его IP, зайдем внутрь нашего тестового Pod'а и обратимся к основному приложению, используя имя сервиса и IP:

```bash
kubectl get svc
kubectl exec test -it bash

nslookup my-service
curl <ip-адрес сервиса>
curl my-service


exit
```

5) Создаем Service типа Nodeport:

```yaml
---
apiVersion: v1
kind: Service
metadata:
  name: my-service-np
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: my-app
  type: NodePort
```

```bash
kubectl apply -f nodeport.yaml
```

6) Проверяем что все ОК. Смотрим наши Service'ы, находим NodePort. Фиксируем, какой порт нам открылся и проверяем работу Service'а:

```bash
kubectl get svc

curl <ip мастер ноды>:<свой номер порта>

curl <ip агента>:<свой номер порта>
```

7) Создаем Service LoadBalancer:

```yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service-lb
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: my-app
  type: LoadBalancer
```


```bash
kubectl create -f loadbalancer.yaml

kubectl get svc
```

8) Подчищаем за собой:

```bash
kubectl delete svc my-service-lb my-service-np
```

## Разбираемся с Ingress'ами
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress-nginx
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: my.localhost
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: my-service
            port:
              number: 80
```
2) Создадим Ingress:

```bash
kubectl apply -f nginx-ingress.yaml
kubectl get ing
```

3) Попробуем покурлить домен:

```bash
curl my.localhost
```
