Kubernetes ile İlk Deployment

Daha önce kurulumunu yapmış olduğumuz Kubernetes sisteminde nginx deployment için şu konfigürasyon kullanılabilir:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:  
  name: nginxsrv2
spec:
  selector:    
    app: nginx
  type: NodePort
  ports:  
  - name: http
    port: 80
    nodePort: 30036
    protocol: TCP

Bu yapıda containerlar 80 nolu port üzerinden yayın yaparken, servise vermiş olduğumuz NodePort sayesinde dış ortamdan trafik alınması sağlanıyor. Dışarıdan erişim için 30036 nolu port kullanılmaktadır.

Nginx SSL Ayarları

https://osmanburan.com/ubuntu-ile-asp-net-core-3-deployment/ makalesinde yayına aldığımız web uygulamasını SSL ile çalıştırmak istiyorsak nginx ayarlarının şu şekilde düzenlenmesi gereklidir.

sudo nano /etc/nginx/sites-available/default

server {
        listen 80 default_server;
        server_name _;
        return 444;
}
server {
   listen 80;
   server_name siteadi.com;
   return 301 https://$host$request_uri;
}
server {
        listen 443;
        server_name siteadi.com;
        ssl_certificate           /etc/nginx/siteadi.com.crt;
        ssl_certificate_key       /etc/nginx/siteadi.com.key;
        ssl on;
        ssl_session_cache  builtin:1000  shared:SSL:10m;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
        ssl_prefer_server_ciphers on;
location / {
                proxy_pass         http://localhost:5010;
                proxy_http_version 1.1;
                proxy_set_header   Upgrade $http_upgrade;
                proxy_set_header   Connection keep-alive;
                proxy_set_header   Host $host;
                proxy_cache_bypass $http_upgrade;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header   X-Forwarded-Proto $scheme;
        }
}

http ile 80 nolu portan gelen istekler https 443 portuna otomatik yönlendirilir. https istekleri ise reverse proxy ile asp.net core ile yayınlanan siteye bağlanıp SSL ile cevap verir.

Docker üzerinde Nginx Loadbalancer ile Deploy

Asp.net core ile geliştirdiğimiz uygulamaları docker ile deploy edip, nginx ile de load balance yapabiliriz.

İlk olarak asp.net core uygulamasını oluşturup, bu uygulamayı docker image haline getirmemiz gerekli.

mkdir coreapp
cd coreapp
dotnet new mvc

Uygulama bu hali ile çalışır haldedir. Docker image oluşturmak için projenin root klasöründe Dockerfile hazırlıyoruz.

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY corenginx.csproj ./
RUN dotnet restore "./corenginx.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "corenginx.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "corenginx.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "corenginx.dll"]

Dockerfile dosyasını kullanarak docker image oluşturuyoruz.

docker build -t corenginx .

Artık docker image kullanarak istediğimiz kadar container açabiliriz.

docker run -d -p 5300:80 corenginx
docker run -d -p 5310:80 corenginx

http://localhost:5300 ve http://localhost:5310 adresini girip kontrol ettiğimizde çalışan uygulamaları göreceğiz. Artık nginx yapılandırmaya hazırız.

nginx ayar dosyamızı oluşturup nginx.conf olarak kaydediyoruz.

upstream servers {
     server 172.17.0.1:5300;
     server 172.17.0.1:5310;
}
server {
     listen 80;
     location / {
          proxy_pass http://servers;
     }
}

Docker image hazırlamak için dockerfile oluşturalım.

FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Nginx için image dosyasını hazırlayalım.

docker build -t corebalance .

Bu sayede docker image hazır olmuş oluyor. Artık nginx container çalıştırıp sonucu görebiliriz.

docker run -d -p 80:80 corebalance

Örnek projeye https://github.com/oburan/DockerNginxLoadBalance adresinden ulaşabilirsiniz.