# 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 ```